一、java基础
java基本数据类型是值传递,java大部分引用数据类型是引用传递。
这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,
因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。
1.1 String StringBuffer 和 StringBuilder
- 操作少量的数据 = String
- 单线程操作字符串缓冲区下操作大量数据 = StringBuilder
- 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
1.2 final, finally, finalize 的区别
1.final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
2.内部类要访问局部变量,局部变量必须定义成 final 类型,例如,一段代码……
finally 是异常处理语句结构的一部分,表示总是执行。
- finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方法总被调用
1.3 集合
数据结构 |
查找速度 |
增删速度 |
线程安全 |
其他特性 |
LinkedList |
慢 |
快 |
非 |
|
ArrayList |
快 |
慢 |
非 |
|
Vector |
相对慢 |
相对慢 |
是 |
|
Set |
|
|
|
|
HashSet |
较慢 |
存取速度快 |
非 |
HashSet底层是基于HashMap不能保证有序,允许null值,但只能放入一个null |
TreeSet |
较快 |
较慢 |
非 |
TreeSet基于TreeMap,对元素进行排序 |
LinkedHashSet |
两者之间 |
两者之间 |
非 |
|
Map |
|
|
|
|
HashTable |
较慢 |
较慢 |
是 |
两者都是 底层数组+链表实现, 默认大小是11,增加的方式是 old*2+1 |
HashMap |
较快 |
较快 |
非 |
contains方法去掉了,改成containsvalue和containsKey。 JDK1.6提供,默认大小是16,扩容2的n次幂 HashMap允许null作为键或者值,HashTable不允许 |
ConcurrentHashMap |
|
|
是 |
从JDK1.5开始引入,1.7版本采用分段的Segment数组+HashEntry,默认将hash表分为16个桶,同时有16个写线程执行 |
HashMap
Java8是使用Node数组+链表+红黑树的数据结构来实现
在 Java8 中,当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)