Java集合有哪些?

List集合的核心是索引。
查询快,但添加、删除慢。

1 . ArrayList 基本上是一个动态数组。
检查东西真的很快,O(1 ) 的程度。
但是要添加某些内容或删除某些内容,您需要将一堆内容移回原处,这需要 O(n) 时间。
它不是线程安全的。
当在单线程上使用时它很好,但当你检查很多时会很有趣。

2 Vector类似于ArrayList结构,但它是线程安全的。
安全性如何?同步被锁定。
结果呢?效率降低,多线程、低频操作时使用。

3 LinkedList,下面是一个双重列表。
添加和删​​除内容非常快,只需 O(1 )。
但从头到尾检查事情需要 O(n) 时间。
它也是线程安全的,因此非常适合频繁进行增删改查的场景。

对于 Set 集合,元素必须是唯一且无序的。

1 . HashSet,下面是哈希表。
保存内容时,首先检查哈希码。
如果它们相等,则使用 equals 来验证它们是否真正重复。
找东西也很快。
非常适合不规则和快速访问。

2 TreeSet,底部有红树和黑树,可以自我平衡的那种。
保存后,将它们按顺序排列。
插入和删除需要 O(logn) 时间。
非常适合需要排序的场景。

地图集合,键值对,键必须唯一,值可以重复。

1 . HashMap,类似于底层的HashSet,也是一个哈希表。
key的访问逻辑与HashSet类似,先hashCode再后相同。
它不是线程安全的。
当在单线程上使用时它很好,但当你检查很多时会很有趣。

2 TreeMap 与 TreeSet 相同,底部有一棵红黑树,并且键是可排序的。
插入和删除需要 O(logn) 时间。
非常适合需要对键进行排序的场景。

补充两句: 如果是多线程使用,不要直接使用List或者HashMap。
您可以使用 Collections.synchronizedList() 或并发集合(例如 ConcurrentHashMap)。
从性能上来说,List是为了快速查找,Set是为了保证唯一性,Map是为了键值对。
只需选择您的业务需求即可。

HashMap、ConcurrentHashMap、HashTable的区别

哈,这道题涉及到Java汇编框架中的几个关键类,其实还是蛮有趣的。
我先简单说一下。
上周有客户问我为什么在多线程环境下不使用HashMap,而是使用ConcurrentHashMap。
我向他详细解释了这一点。

首先,HashMap是Java中一个非常基本的映射实现。
它不是线程安全的。
在多线程环境中使用它可能会导致数据不一致或程序崩溃。
这就是为什么我们需要ConcurrentHashMap,它就是为了解决HashMap的线程安全问题而设计的。

ConcurrentHashMap和HashMap最大的区别就是线程安全。
HashMap 不是线程安全的,ConcurrentHashMap 是。
在多线程环境下,如果使用HashMap,则必须手动同步,这增加了代码复杂度和出错的可能性。
ConcurrentHashMap内部已经处理了线程安全问题,你只需要关注业务逻辑即可。

我们来谈谈Hashtable,它是Java早期版本中的一个线程安全的map实现。
然而它有一个很大的缺点,就是所有方法都是同步的,这意味着当一个线程执行某个方法时,其他线程必须等待,这会显着降低性能。

然后是SynchronizedMap,它是Collections实用程序类提供的包装器,可以将任何map包装成线程安全的map。
但性能不如ConcurrentHashMap,因为它也使用了同步锁。

ConcurrentHashMap的设计非常巧妙。
它将数据分为几个段,每个段都有自己的锁。
这样,当一个线程访问一个段时,其他线程可以访问其他段,从而同时显着提高性能。
尤其是在读多于写的场景下,ConcurrentHashMap的性能优势更加明显。

我自己遇到的坑就是有时候在多线程环境下滥用HashMap,导致很多问题。
现在,我通常更喜欢 ConcurrentHashMap,除非线程安全并不是真正必要的。

总之,如果需要线程安全的map并且有性能要求,ConcurrentHashMap是更好的选择。
但具体使用哪一种还要根据实际情况而定。
无论哪种方式,都取决于你。
我还在思考这个问题,也许将来我能找到更好的答案。

什么是线程安全和线程不安全

线程安全是指跨多个线程,代码的结果保持不变,变量的值是正确的。
线程安全是指多个线程修改数据,导致混乱。
安全的是结果不变、数据完整;不安全的是存在数据冲突和大量脏数据。
如果安全,则无需上锁;如果不安全,就需要封锁。

线程不安全,可以对set集合中的 元素进行排序.它的排序是如何进行的呢

这是一个陷阱,不要直接相信HashSet排序。

使用TreeSet进行原生排序,2 01 8 年项目需求。

自定义排序,通过Comparator实现,2 02 0年项目实践。

转List后排序,2 01 9 年项目优化。

使用同步器保证线程安全。
该系统将于2 01 7 年进行升级以避免并发问题。

实用提醒:排序前确定集合类型和线程安全要求。