参考:
2-
string常量池
字符串常量池的设计思想
字符串的分配,和其他的对象分配一样,大量频繁的创建字符串,极大程度地影响程序的性能
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化
为字符串开辟一个字符串常量池,类似于缓存区(常量池在jvm的方法区)
创建字符串常量时,首先检测字符串常量池是否存在该字符串
存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中
实现的基础
实现该优化的基础是因为字符串是不可变的,可以不用担心数据冲突进行共享
运行时实例创建的全局字符串常量池中有一个表,总是为池中每个唯一的字符串对象维护一个引用,这就意味着它们一直引用着字符串常量池中的对象,所以,在常量池中的这些字符串不会被垃圾收集器回收
4-
string、stringbuilder、stringbuffer
常量字符数组 线程安全 性能 并发
StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。
5-
异常的根类 throwable -普通类 -可以new
一般
严重错误 :Error (处理机制同运行时异常) 比如说内存溢出。
不太严重 :Exception
希望必须明确处理 :编译时异常
----抛出时(throw),必须明确声明异常(throws),上一级必须捕获 或者 显示的声明/抛出(throws)
可以处理也可以不处理 :运行时异常
-----抛出时(throw),不用throws声明;上一级可以选择捕获或者不捕获;不捕获则默认接着往上抛,抛到虚拟机时则打印异常,终止线程
7-
ArrayList,Vector, LinkedList 的存储性能和特性
线程不安全 ArrayList, LinkedList
线程安全 vector ----有锁,存储性能相对较差 底层也是动态数组(即可扩容)
ArrayList 数组 方便查询 不方便增/删 有下标
LinkedList 链表 方便增/删 不方便查询 有引用指向下一个元素 ;头尾查询方便
11-
1)HashMap 和 Hashtable 的区别 ; 2)== 桶问题 装载因子问题 == ; 3)读写锁
HashMap 没有锁-线程不同步-不安全、性能好
Hashtable 加锁-线程同步-安全、性能差 —已废弃,一般用concurrenthashmap
concurrenthashmap 线程安全 hashmap的子类 只锁操作的key所在的桶 底层是读写锁,提高并发读
Hashtable 锁整张表(key:value)
3)
- 读写锁是一个资源能够被多个读线程访问,或者被一个写线程访问时其他线程不能访问
- Java当中的读写锁通过ReentrantReadWriteLock实现。
12-
final, finally, finalize 的区别。
final 访问修饰符 修饰属性、方法、类 表示属性不可变、方法不可覆盖(重写)、类不可继承
finalize object类的finalize()方法 垃圾回收器执行时调用此方法,可覆盖
13-
1)leep() 和 wait() 有什么区别? ; 2)线程状态图、分析
sleep() 计时等待,到时自动唤醒 与锁无关 不释放锁
wait() 不计时,需要手都唤醒 释放锁
2)见博客线程状态(2)
16-
同步和异步有何异同 ; 与 阻塞 和 非阻塞 的关系
同步、异步 是并发执行任务的一种实现方式,存在线程见的交互、通信,对共享资源一种的访问策略
阻塞、非阻塞 是一种线程的状态,与线程的运行和cpu占用相关
17-
1)abstract class 和 interface 有什么区别? ;2) 接口概述、本质 3) 接口功能
1)
语法层面:
抽象类只能单继承,里面包括抽象方法和非抽象方法
接口可以多实现,里面只能由抽象方法,jdk8开始可以有其他方法