Java部分类之间区别总结
1.String,StringBuffer,StringBuilder三者的区别
1.1String 同 StringBuffer,StringBuilder之间的区别
1.String是不可变字符串,即要对一个String进行操作则会生成一个新的 String对象,这样就会导致效率低下跟浪费内存空间;
2.而StringBuffer和StringBuilder是可变字符串,当然操作时就不会产生新对象的问题;
即需要经常操作这个字符串时,使用StringBuffer和StringBuilder,相反则使用String
1.2 StringBuffer和StringBuilder的区别
1.线程安全;即StringBuffer是线程安全,所有公共方法是用Synchronized修饰,而StringBuilder是线程不安全,没有用Synchronized修饰;
2.当涉及到线程安全时,一般线程安全的类相对会比线程不安全的类性能要差一些;因为涉及到一些加锁和解锁的操作;
即使用StringBuffer当多线程操作同一个字符串的场景,单线程则使用StringBuilder;
3.缓冲区;即StringBuffer有一个toStringCache用以缓存创建的字符串,
每次获取toString()方法时先判断toStringCache是否为空,不为空则该值构造一个字符串返回,为空则给toStringCache赋值再将该值构造一个字符串返回;
而StringBuilder每次都是复制一个字符数组,构造一个字符串返回;
在toString()方法中,明显是StringBuffer有toStringCache值的效率高一些;
最后,StringBuffer和StringBuilder都继承自AbstractStringBuilder,
AbstractStringBuilder和String都实现了CharSequence接口
2.HashMap和Hashtable的区别
1.继承不同:
HashMap继承AbstractMap抽象类,AbstractMap实现了Map接口;
Hashtable继承Dictionary抽象类;
2.线程安全不同:
HashMap是线程不安全,而Hashtable是线程安全;故HashMap的效率是高于Hashtable的;
即在多线程时使用Hashtable,单线程时使用HashMap;
3.Hashtable是不允许出现null值的,否则会报空指针异常;
HashMap是允许存在一个key为null值,因为key相同会覆盖,但是允许多个value值为null;所以判断key或value是否为null值时可以用containsKey()方法或 containsValue()方法;
4.遍历的方式内部实现不同(即toString()方法)
HashMap和Hashtable都有Iterator迭代器遍历,hashtable同时还有Enumeration的方式;
(Enumeration的操作时每次获得一个元素)
5.哈希值不同
Hashtable是使用对象本身的hashCode值,而HashMap是重新计算哈希值;但是都差不多;
6.内部实现的数组的初始化大小跟扩容方式不同
Hashtable的初始化数组大小为11,每次扩容为old*2+1;
HashMap的初始化数组大小为16,而且一定是2的指数;
3.ArrayList和LinkedList的区别
1.他们之间的主要区别是数据存储结构不同:
ArrayList为顺序存储结构,内存地址是相连的;
LinkedList为链式存储结构,内存地址不是相连的;
2.数组就是顺序存储结构,它的优点就是查找,当前内存地址+ (查找下标-当前下标)* 单个下标分配到的内存大小,即可以瞬间查找;
但是在删除和增加时(除了尾部的删除和增加)下标越前效率越低;
因为在中间删除的时候,在后面的数组就得往前移动,
在中间增加时,数组从增加的下标开始都要往后移动,
所以导致效率低;
3.双向链表就是链式存储结构,它的优点为删除跟增加,
当删除时,只要删除当前结点,再将当前结点的前后结点相连接;
增加时,将C插入到A和B之间,将A的后结点设置为C,将C的后结点设置为B,B的前结点设置为C;
当删除和增加时比顺序存储结构的效率高;
即查找时,ArrayList为顺序存储结构的更快;删除跟增加时,LinkedList为链式存储结构的更快;
4.在空间复杂度上,LinkedList是双向链表在内存上比ArrayList更耗内存,
因为存在前后指针;ArrayList的数据会用一个数组存储,数组的初始容量为10,每次扩容为当前容量*1.5+1;
且都实现了List接口。