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接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值