基本数据类型与包装类的区别:
int | integer |
声明的变量中直接存放数值,默认值未0
| 声明的变量存放的是对象的地址引用,默认值为null |
两个通过 new 生成的 Integer 对象,由于在堆中地址不同,所以永远不相等 | |
声明的两个int变量值相等那两个变量就相等 |
通过
new
生成的
Integer
对象和非通过
new
生成的
Integer
对象相比较时,由于前者存放在堆中,后者存放在 Java
常量池中,所以永远不相等
|
两个非通过
new
生成的
Integer
对象比较时,如果两个变量的数值相等且在
-128
到
127
之间,
结果就相等(享元模式)
| |
int
和
Integer
比较时,只要数值相等,结果就相等,因为包装类和基本数据类型比较时,会自动拆箱,将 Integer
转化为
int
|
String、StringBuilder、StringBuffer 区别:
string | stringbuilder | stringbuffer |
三者
底层都是
char[]
存储数据,
JDK1.9
之后使用的是
byte[](常常存的是短字符串)
| ||
底层的
char[]
有
final
修饰每次对string的操作都似乎生成新对象
| 可变字符串适合字符串的拼接等操作 | |
线程不安全的,方法没有 synchronized 修饰,性能较高
|
线程安全的,方法有 synchronized
修饰,但性能较低
|
== 和 equals 的区别:
== | equals |
比较的是对象引用的地址是否相等 | 默认比较行为和“==”一致,通常复写来进行对象之间内容的比较 |
final 和 finally 和 finalize 的区别:
final | finally | finalize |
对于变量:不可被修改 |
作为异常处理的一部分,它只能用在
try/catch
语句中,并且附带一个语句块,表示这段语句最终一定会被执行,经常被用在需要释放资源的情况下
| 说每一个对象都有finalize()方法,在 gc 启动,该对象被回收的时候被调用(凡是new出来的对象都是可以被gc搞定的) |
对于方法:不可被重写 | ||
对于类: 不可被继承 |
Collection体系:
List | Set | Map | ||||||
ArrayList
|
Vector
|
LinkedList
|
HashSet
|
TreeSet
|
HashMap
|
TreeMap
|
HashTable
|
Properties
|
底层数据结构是数组,查询性能高,增删性能低
|
底层数据结构是数组,查询性能高,增删性能低
|
底层数据结构是双向链表,查询性能低,增删性能高
|
无序不重复的,使用
HashMap
的
key
存储元素,判断重复依据是
hashCode()
和 equals()
|
有序不重复的,底层使用
TreeMap
的
key
存储元素,排序方式分为自然排序,比较器排序
|
key
的值没有顺序,线程不安
|
key
的值可以自然排序,线程不安全
|
它的
key
和
value
都不允许为
null
,线程安全
|
它的
key
和
value
都是
String
类型的,线程安全
|
List 和 Set 和 Map 的区别:
List
| Set | Map | |
有序,可重复,允许插入多个null 元素,元素都有索引 |
无序,不可重复,只允许存入一个null 元素,必须保证元素唯一性
|
是键值对集合,存储键、值和之间的映射。
| |
key | value | ||
无序,唯一 | 不要求有序,允许重复 |
HashMap 和 HashTable 的区别:
HashMap | HashTable |
线程不安全,性能较高
| 线程安全,性能较低 |
key
和
value
都允许为
null
|
key
和
value
都不能为
null
|
如果需要考虑线程安全的高并发实现,建议使用ConcurrentHashMap
|
ArrayList 和 LinkedList 和 Vector区别:
ArrayList | 基于数组实现,线程不安全的,底层数组容量不足时,会自动扩容 0.5 倍,开辟的内存空间要求联系,可以根据索引随机访问元
素性能高,但是插入和删除元素性能差,因为这会涉及到移位操作
|
LinkedList | 基于双链表实现的,开辟的内存空间不要求连续,因此不支持索引,查找元素需要从头查找,因此性能差,但是添加删除只需要改变指针指向即可,性能高. LinkedList 会增加内存碎片化,增
加内存管理难度
|
Vector |
基于数组实现,线程安全的,方法加了同步锁,线程安全但是性能差,自动扩容
1
倍
|