java-集合

注:1.java不支持无符号类型unsigned,C/C++支持。
2.java基本数据类型
byte,short(2bytes),int(4),long(8),float(4),double(8),char(2),boolean(1)
3.强制类型转换 (int)11.2 //将11.2强制转换为int型
4.与C/C++不同,Java在定义数组时不为数组分配内存,为它分配内存空间使用new运算符。如arrayName = new type[arraySize]。
5.string 字符串 时java.lang包里的一个类。string的值是不可变的,每次对string操作就会产生新的string对象,效率低,且占用大量内存空间。
StringBuffer也是表示字符串,但是内部实现和string不同,再进行字符串操作时不会生成新的对象。主要偏重于对字符串的操作,如追加,插入和删除操作。
操作少量数据用string
单线程操作大量数据用 StringBuilder,非线程安全的。
多线程操作大量数据用StringBuffer,是线程安全的。
6.线程安全类:
非线程安全类:

1.List和Set区别

List和Set都是继承自Collection接口,而Map不是。
List存入顺序有序,可以有重复元素;支持for循环,支持迭代器。List可以动态增长,检索元素效率高,插入、删除元素效率低,因为会引起其他元素位置的改变。
set存入元素无序,无重复元素(重复元素会被覆盖),不支持for循环,但支持迭代器。set检索元素效率低,插入、删除效率高,不会引起其他元素的位置改变。

List接口常见的实现类:ArrayList,LinkedList,Vector
Set接口常见实现类:HashSet,LinkedHashSet,TreeSet

2.List和Map区别

map适合存储键值对的数据。

3. Arraylist(数组列表/动态数组)和Linkedlist区别

ArrayList实现了基于动态数组的数据结构,由于地址是连续的,一旦数据存储好了,查询效率比较高。但由于地址连续,移动数据时插入和删除操作效率比较低。
LinkedList基于链表实现的,所以在开辟内存空间时不需要地址是连续的,因此在插入和删除操作方面有优势。适用于要头尾操作或插入指定位置的操作。因为LinkedList需要移动指针,所以查询性能比较低。
需要对数据进行访问时选用ArrayList,需要多次增加,删除,修改时使用LinkedList。

4.Arraylist和Vector(向量)区别

1.Vector是线程安全的,即多线程访问同一段代码时,不会产生不确定的结果。此类中的方法用了很多的synchronized进行修饰,导致在效率上无法与ArrayList相比。
2.两个都是采用的线性连续空间存储元素,但是当空间不足时,两个类的增加方式是不同的。
3.Vector可以设置增长因子,而ArrayList不可以。
4.Vector是线程同步的,线程安全的,Arr是线程异步的,不是线程安全的。如果不考虑线程安全的情况,那么Arr的效率高。

5. Hashmap和Hashtable区别
  1. 继承不同。HashMap是基于Map接口实现的。HashTable是基于dictionary类实现的。
  2. 线程安全不同。HashMap是基于哈希表实现的。是非同步的,HashTable是同步的,效率上比Hashmap低。
  3. 允不允许null值。HashMap允许空键值。key为null时,这样的键只能有一个。可以由一个或多个键对应的值为null。HashTable key和value都不允许有null。
  4. 遍历方式的内部实现不同。HashTable,HasnMap都使用了iterator。由于历史原因,HashTable还使用了Enumeration.
  5. 哈希值的使用不同。HashTable直接使用了hashCode,HashMap需要重新计算hash值。
  6. 内部实现方式的数组初始大小和扩容方式不一样
    Hash Table中Hash数组的初始大小是11,增加方式是old*2+1。Hashmap中hash数组的默认大小是16,且必须是2的指数。
    在这里插入图片描述
6. Hashset和HashMap区别

注:hashcode是指哈希码,是一种编码方式。在java中,每一个对象都有一个hashcode,java可以通过hashcode来识别一个对象。
对象相等,则hashcode一定相等。
hashcode相等对象未必相等。

hashMapHashSet
实现了Map接口实现了Set接口
存储键值对仅存储对象
使用put()方法将元素放入map中使用add()方法将元素放入set中
hashmap比较快,因为使用唯一的键来获取对象hashset较hashmap慢
7.HashMap和ConcurrentHashMap区别
  1. 前者不是线程安全的,后者是线程安全的。
    ConcurrentHashMap引入了‘分段锁’的概念。可以理解为把一个大的Map分成N个小的Segment(类似于HashTable,可以提供线程安全),根据key.hashcode()来决定把key放到哪个HashTable中。效率提升N倍,默认提升16倍。
    参考 : https://blog.csdn.net/xuefeng0707/article/details/40834595
  2. 在ConcurrentHashMap中将Map分为N个Segment(初始化为长度为16的数组),put和get的时候,都是根据key.hashcode()算出放到哪个Segment中。
    3.在线程安全,扩展性,同步之间的区别。如果是用于缓存的话,ConcurrentHashMap是更好的选择,在java中经常用到。且在读操作线程数多于写线程操作数是,更胜一筹。
8.HashMap的工作原理及代码实现
9.ConcurrentHashMap的工作原理及代码实现

目标是实现高并发,高吞吐量的hashmap。数据的组织结构和hashmap是有所区别的。每一个segment都包含了一个HashEntry数组的HashTable,每一个segment都有自己的hashtable操作,比如 put,get,replace。这些动作发生时,只对自己的hashtable锁定。所以可能存在多个线程同时写的情况。性能一定好于只有一个hashtable的情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值