建设网站首页应该采用,网站制作企业首页,郑州正规的网站建设价格,别人恶意点击我们竞价网站说说你如何选用集合#xff1f;
需要键值对选用 map 接口下的集合#xff0c;需要排序用 TreeMap, 不需要排序用 HashMap 不需要键值对仅存放元素则选择 Collection 下实现的接口#xff0c;保证元素唯一使用 Set, 不需要则选用 List
Collection 和 Collections 有什么区别…说说你如何选用集合
需要键值对选用 map 接口下的集合需要排序用 TreeMap, 不需要排序用 HashMap 不需要键值对仅存放元素则选择 Collection 下实现的接口保证元素唯一使用 Set, 不需要则选用 List
Collection 和 Collections 有什么区别
Collection 是集合类的上级接口继承它的主要有 List 和 SetCollections 是针对集合类的一个工具类它提供了一些列的静态方法实现如 Collections.sort() 排序、Collections.reverse() 逆序等。
Map 集合
HashMap,Hashtable,LinkedHashMap, TreeMap
HashMap:
Hashmap 是一个最常用的 Map, 它根据键的 HashCode 值存储数据, 根据键可以直接获取它 的值具有很快的访问速度遍历时取得数据的顺序是完全随机的HashMap 最多只允许一条记录的键为 Null; 允许多条记录的值为 Null;HashMap 不支持线程的同步即任一时刻可以 有多个线程同时写 HashMap; 可能会导致数据的不一致。如果需要同步可以用Collections 的 synchronizedMap 方法使 HashMap 具有同步的能力或者使用ConcurrentHashMap
Hashtable: Hashtable 与 HashMap 类似, 它继承自 Dictionary 类不同的是: 它不允许记录的键或者值为 空; 它支持线程的同步即任一时刻只有一个线程能写 Hashtable, 因为 Hashtable 内部的方法基本 都经过 synchronized 修饰因此也导致了 Hashtable 在写入时会比较慢。
LinkedHashMap: LinkedHashMap 是 HashMap 的一个子类额外持有一个双向链表维保存了记录的插入顺 序在用 Iterator 遍历 LinkedHashMap 时先得到的记录肯定是先插入的. 也可以在构造时用带 参数按照应用次数排序。在遍历的时候会比 HashMap 慢不过有种情况例外当 HashMap 容 量很大实际数据较少时遍历起来可能会比 LinkedHashMap 慢因为 LinkedHashMap 的遍历 速度只和实际数据有关和容量无关而 HashMap 的遍历速度和他的容量有关。
TreeMap TreeMap 实现 SortMap 接口能够把它保存的记录根据键排序, 默认是按键值的升序排序也 可以指定排序的比较器当用 Iterator 遍历 TreeMap 时得到的记录是排过序的。
HashMap 的链表转换红黑树的机制
当链表长度大于阈值默认为 8会将链表转换成红黑树以减少搜索时间但是将链表转换成 红黑树前会判断如果当前数组小于 64 那么会先进行数组扩容而不是转换为红黑树。注链表寻 址时间复杂度为 O(N)转换为红黑树寻址时间复杂度为 O(log(N))
ConcurrentHashMap 和 Hashtable 的区别
结构不同JDK1.7 的 ConcurrentHashMap 底层采用分段的数组Segment 大数组 HashEntry 小数组 链表实现JDK1.8 采用的数据结构Node 数组 链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用数组 链表的形式
实现线程安全的方式不同Hashtable 实现并发安全是通过 synchronized 关键字 ConcurrentHashMap 通过 cas,node,synchronized 相结合的方式实现 (更详细的说是 1.7 使用 segment 分段 锁segment 实现了 ReentrantLock在 1.8 取消了分段锁采用 CAS 和 sychronized 来保证线程安全)
性能不同Hashtbale 每一次修改都需要锁住整个对象其他线程在此期间不能操作所以线 程数量增加的时候性能会急剧下降而 ConcurrentHashMap 仅会对一部分上锁而不是全部都上锁 因此在并发效率上ConcurrentHashMap 比 Hashtable 提高了很多
List 集合
Vector 和 ArrayList 初始化大小和容量扩充有什么区别
Vector 和 ArrayList 的默认容量都为 10 Vector 容量扩充默认增加 1 倍 ArrayList 容量扩充默认增加大概 0.5 倍
比较 Arraylist 与 LinkedList ,Vector
底层数据结构Arraylist 底层使用的是 Object 数组LinkedList 底层使用的是双向链表 JDK1.6 之前为循环链表JDK1.7 取消了循环,Vector 是 List 的古老实现类底层用 Object[] 存储 线程安全Vector 底层很多方法都加上了同步关键字 synchronized 保证线程安全而 ArrayList 和 LinkedList 无法保证线程安全。 是否支持快速随机访问Vector 和 ArrayList 的内部结构是以数组形式存储的因此非常适 合随机访问但非尾部的删除或新增性能较差比如我们在中间插入一个元素就需要把后续的 所有元素都进行移动。LinkedList 插入和删除元素效率比较高但随机访问性能会比以上两个动 态数组慢。。
Set 集合
LinkedHashSet 如何保证有序和唯一性
LinkedHashSet 底层数据结构由哈希表和链表组成链表保证了元素的有序即存储和取出一致哈 希表保证了元素的唯一性。
比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
HashSet 是 Set 接口的实现类底层是 HashMap, 是线程不安全的可以存储 Null 值 (因为 HashSet 中只需要用到 key而 HashMap 是 key-value 键值对所以向 map 中添加键值对时键 值对的值固定是PRESENT)LinkHashset 是 HashSet 的子类LinkedHashSet 是 HashSet 的一个“扩展版本”会维护“插 入顺序”而 HashSet 并不管什么顺序,LinkedHashSet 内部使用 LinkedHashMap 对象来存储和处 理它的元素TreeSet 是基于 TreeMap 实现的 TreeMap 是一个有序的二叉树那么同理 TreeSet 同样也是 一个有序的