String、Stringbuffer、StringBuilder的区别1. String声明的是不可变的对象,每次操作必然产生一个新的对象。改变字符使用+连接,会改变其内存地址,性能较差。
- StringBuffer和StringBuilder都继承自抽象类AbstactStringBuilder,StringBuffer具有线程安全的特性,是通过Synchronized字段实现的。
并发场景使用StringBuffer,迭代场景使用StringBuilder效率最高,普通场景使用String,避免多余的类型转换开销。 线程池用哪种?
为什么要用线程池?
重用存在的线程,减少对象的创建、消亡的开销,提升性能。
- 可以有效地控制最大线程并发数,提高系统资源使用率,同时避免过多资源竞争,避免阻塞。
-
线程池种类
newCachedThreadPool:可根据需要创建新线程的线程池,并能够复用可用的空闲线程
- newFixedThreadPool:创建一个指定工作数量的线程池,不会复用线程
- newScheduledThreadPool:支持定期和周期性任务,所有线程已满后,新任务会进入DelayedWorkQueue队列中排队等候执行
newSingleThreadExecutor:创建只有一个线程的线程池,后续任务进入阻塞队列等候执行。
适用场景
newCachedThreadPool:执行短期异步的小程序或负载较轻的服务器
- newFixedThreadPool:执行长期任务
- newScheduledThreadPool:执行周期性任务
- newSingleThreadExecutor:一个任务一个任务执行
说说JVM内存模型。方法区、堆、虚拟机栈、本地方法栈、程序计数器
方法区和堆是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程独享的;程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。方法调用的数据需要通过虚拟机栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。本地方法栈为虚拟机使用到的 Native 方法服务。堆存放对象实例,它存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 logback的了解