String、Stringbuffer、StringBuilder的区别1. String声明的是不可变的对象,每次操作必然产生一个新的对象。改变字符使用+连接,会改变其内存地址,性能较差。

  1. StringBuffer和StringBuilder都继承自抽象类AbstactStringBuilder,StringBuffer具有线程安全的特性,是通过Synchronized字段实现的。
  2. 并发场景使用StringBuffer,迭代场景使用StringBuilder效率最高,普通场景使用String,避免多余的类型转换开销。 线程池用哪种?

    为什么要用线程池?

  3. 重用存在的线程,减少对象的创建、消亡的开销,提升性能。

  4. 可以有效地控制最大线程并发数,提高系统资源使用率,同时避免过多资源竞争,避免阻塞。
  5. 提供定时执行、定期执行、单线程、并发数控制等功能。

    线程池种类

  6. newCachedThreadPool:可根据需要创建新线程的线程池,并能够复用可用的空闲线程

  7. newFixedThreadPool:创建一个指定工作数量的线程池,不会复用线程
  8. newScheduledThreadPool:支持定期和周期性任务,所有线程已满后,新任务会进入DelayedWorkQueue队列中排队等候执行
  9. newSingleThreadExecutor:创建只有一个线程的线程池,后续任务进入阻塞队列等候执行。

    适用场景

  10. newCachedThreadPool:执行短期异步的小程序或负载较轻的服务器

  11. newFixedThreadPool:执行长期任务
  12. newScheduledThreadPool:执行周期性任务
  13. newSingleThreadExecutor:一个任务一个任务执行 说说JVM内存模型。方法区、堆、虚拟机栈、本地方法栈、程序计数器
    方法区和堆是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程独享的;程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。方法调用的数据需要通过虚拟机栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。本地方法栈为虚拟机使用到的 Native 方法服务。堆存放对象实例,它存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 logback的了解