资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

如何理解Collection、Collections

Java 更新时间: 发布时间: 计算机考试归档 最新发布

如何理解Collection、Collections

如何理解Collection、Collections
  • Collection接口
    • List、Set的特点
    • Map的特点
  • Collections工具类
    • ArrayList和linkedList的区别
    • 关于RandomAccess接口
    • ArrayList与Vector的区别,为什么要用ArrayList取代Vector呢
    • HashMap和HashTable区别
    • HashMap和HashSet区别
    • HashSet如何检查重复
    • HashMap多线程操作导致死循环问题
    • ConcurrentHashMap于HashTable的区别
    • Comparable和Comparator的区别
    • Collection 框架中实现比较要实现什么接口
    • List, Set, Map 是否继承自 Collection 接口?
    • Collection 和 Collections 的区别。
    • Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它
    • 两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

Collection接口 List、Set的特点

Map的特点

Collections工具类

ArrayList和linkedList的区别
  • 是否保证线程安全:ArrayList和linkedList都是不同步的,也就是不保证线程安全;
  • 底层数据结构:ArrayList的内存结构是数组,linkedList的内存结构是双向链表;
  • 插入和删除元素是否受到元素为止的影响:ArrayList插入和删除操作会引发后续元素的移动,附有移动成本的影响,增删效率低。linkedList由于采用链表结构,所以插入和删除操作基本不受影响,增删效率高;
  • 是否支持随机访问:ArrayList支持,通过元素序号可以快速获得元素对象,linkedList不支持,需要从头到尾依次访问直到获取;
  • 内存占用:ArrayList的空间浪费提现在结尾处会预留一定的容量空间,而linkedList比ArrayList消耗更多的空间在于需要存放直接后继和直接前驱以及数据的空间。
关于RandomAccess接口

源码:

public interface RandomAccess {
}

在我看来,RandomAccess是一个标识,标识实现这个接口的类具有随机访问的功能。

  • 对于实现了RandomAccess接口的list,优先选择普通for循环,其次是foreach;
  • 对于未实现RandomAccess接口的list,优先选择iterator遍历;
ArrayList与Vector的区别,为什么要用ArrayList取代Vector呢

Vector的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象,但是一个线程访问Vector的话代码要在同步操作上消耗大量的时间。
ArrayList不是同步的,所有在不需要保证线程安全时建议使用ArrayList。

HashMap和HashTable区别
  1. 线程安全性:HashMap是非线程安全的,而HashTable是线程安全的;HashTable内部的方法基本都经过synchronized修饰;
  2. 效率:因为线程安全问题,HashMap要比HashTable效率高,但是HashTable基本被淘汰了;
  3. 对空键值的支持:HashMap允许空键值,而HashTable不允许;
  4. 初始容量大小和每次扩充容量大小的不容:
  • 创建时没有指定初始值时,HashTable默认的初始容量大小为11,之后每次扩充容量为原来的2n+1;HashMap的默认初始大小为16,之后每次扩充容量为原来的2倍;
  • 指定了初始值,HashTable会直接使用指定的大小,而==(思考)HashMap会将其扩充为2的幂次方大小。==
  1. 底层数据结构:JDK1.8以后,HashMap在解决哈希冲突中有了大变化,当链表长度大于阈值时(默认为8),会将链表转化为红黑树,以减少搜索时间。而HashTable没有这样的机制。
HashMap和HashSet区别
  1. 实现的接口:HashMap实现了Map接口,HashSet实现的是Set接口
  2. 存储对象:HashMap存储键值对,HashSet仅存储对象;
  3. 添加方法不同:HashMap使用put()方法添加元素,HashSet使用add()方法添加元素;
  4. 计算HashCode方式不同:HashMap使用键key计算HashCode,HashSet使用成员对象来计算HashCode,对于两个对象来说HashCode可能相同,所以还需要使用equals()方法判断对象的相等性。
HashSet如何检查重复
  1. 基于HashCode计算元素存放位置;
  2. 当存入元素的哈希码相同时,会调用equals进行比较,如果相同则拒绝后者的存入;
HashMap多线程操作导致死循环问题

主要原因在于并发条件下的Rehash会造成元素之间形成一个循环链表,不过在JDK1.8之后解决了这个问题,但仍然不建议在并发环境下使用HashMap,推荐使用ConcurrentHashMap。

ConcurrentHashMap于HashTable的区别

ConcurrentHashMap和HashTable的区别主要体现在线程安全方式上的不同。

  • 底层数据结构:JDK1.7,ConcurrentHashMap底层采用了分段的数组+链表实现,JDK1.8后ConcurrentHashMap采用了与HashMap相同的结构,即数组+链表+红黑树。HashTable采用的是数组+链表的形式,数组是HashMap的主题,链表则主要是为了解决哈希冲突而存在;
  • 实现线程安全的方式:
  1. JDK1.7之前,ConcurrentHashMap(分段锁)对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据就不会存在锁竞争,提高并发访问率。到JDK1.8后,基本摒弃了Segment的概念,而是直接使用数组+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS来操作。
  2. HashTable(同一把锁):使用synchronized来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问该方法,可能会进入阻塞或轮询状态,导致竞争会越来越激烈,效率越来越低。
Comparable和Comparator的区别
  • Comparable接口出自java.lang包,它有一个compareTo(Object obj)方法用来排序
  • Comparator接口出自java.util包,它有一个compare(Object obj1,Object obj2)方法用来排序
    当需要对一个集合使用自定义排序时,需要重写compareTo()或compare()方法。
Collection 框架中实现比较要实现什么接口

comparable/comparator

List, Set, Map 是否继承自 Collection 接口?

List,Set 是,Map 不是

Collection 和 Collections 的区别。

Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、
线程安全化等操作。

Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它

们有何区别?
Set 里的元素是不能重复的,元素重复与否是使用 equals()方法进行判断的。
equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的
对象的内容和类型相配的话,返回真值。

两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

对。
如果对象要保存在 HashSet 或 HashMap 中,它们的 equals 相等,那么,它们的 hashcode 值就必
须相等。
如果不是要保存在 HashSet 或 HashMap,则与 hashcode 没有什么关系了,这时候 hashcode 不等
是可以的,例如 arrayList 存储的对象就不用实现 hashcode,当然,我们没有理由不实现,通常
都会去实现的。

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/490207.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【如何理解Collection、Collections】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2