基础-JAVA集合类型主要区别

本文详细介绍了JAVA集合中的List, Set, Map三者的基本区别,特别是ArrayList和LinkedList、HashMap和HashSet之间的差异。ArrayList适用于快速随机访问,而LinkedList适合频繁插入和删除。HashMap是非线程安全且效率较高的哈希表,而HashSet基于HashMap实现,用于存储不重复元素。文章还探讨了ArrayList的扩容机制和Vector的线程安全性。" 117816488,10510839,使用JavaScript实现数字计算器,"['javascript', '前端开发', 'HTML', '交互设计']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、List,Set,Map三者的区别

  • List 储存一组不唯一的,有序的对象
  • Set 不允许重复
  • Map 使用键值对存储 key不能重复

2、ArrayList和LinkedList的区别

  • 相同之处:二者都不同步,线程不安全
  • 底层数据结构:ArrayList使用Object数组存储,插入和删除元素复杂度受到元素位置的影响;LinkedList使用链表存储,add(E element)删除时时间复杂度不受位置影响,指定位置受影响add(int index, E element)
  • 快速随机访问get(int index):ArrayList支持 LinkedList不支持
  • 内存空间:ArrayList在结尾预留空间,LinkedList要存放后继、前驱和数据
  • ArrayList 实现了RandomAccess 接口, LinkedList没有实现􀬬。因为ArrayList 底层是数组,支持随机访问O(1);LinkedList需要遍历到位置才能访问指定元素O(n)

遍历List

  • 实现了RandomAccess接口的List,优先使用for循环,之后是foreach
  • 未实现RandomAccess接口的List,优先使用iterator遍历,大规模数据切记使用for循环

3、ArrayList和Vector的区别?为什么用前者取代Vector?

  • ArrayList出现于jdk1.2,vector出现于1.0.两者底层的数据存储都使用的Object数组实现,因为是数组实现,所以具有查找快、增删慢(因为往数组中间增删元素时,会导致后面所有元素地址的改变)的特点
  • 都实现了RandomAccess接口
  • Vector类的方法都是同步的,可以由两个线程安全访问一个Vector对象,但是一个线程访问的放会在同步问题上耗费大量的时间
  • ArrayList不是同步的,不需要耗费精力保证线程安全

ArrayList扩容机制

  • 第一步:把原来的数组复制到另外一个内存空间更大的数组中
  • 第二步:把新元素添加到扩容后的数组中

不带参数和带参数的两种构造函数

  • 在无参构造中,我们看到了在用无参构造来创建对象的时候其实就是创建了一个空数组,长度为0
  • 在有参构造中,传入的参数是正整数就按照传入的参数来确定创建数组的大小,否则异常

无参构造:

public ArrayList() {

this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

}

带参构造:

public ArrayList(int initialCapacity) {

if (initialCapacity >0) {
    this.elementData =new Object[initialCapacity];
}else if (initialCapacity ==0) {
    this.elementData = EMPTY_ELEMENTDATA;
}else {
    throw new IllegalArgumentException("Illegal Capacity: "+
                                       initialCapacity);
}

}

4、扩容 add(E e) 源码如下

public boolean add(E e){
    ensureCapacityInternal(size+1);
    elementData[size++] = e;
    return true;
}
ArrayList每次扩容是原来的1.5倍

5、HashMap和HashTable的区别

  • HashMap非线程安全;HashTable是线程安全的,内部的方法基本经过synchronized修饰。
  • HashMap效率更高(和非线程安全有关系)
  • HashTable 基本要被淘汰
  • HashMap可以使用一个null作为健,和多个null作为值(HashTbable键值有null就抛出NullPointException异常)
  • HashTable不指定容量则默认11,扩容后2n+1;HashMap默认16,扩充2n
  • HashMap总使用2的幂次方作为哈希表的大小,HashTable开始会使用指定大小
  • HashMap和HashTabl都是哈希表数据结构,都用链表解决冲突。
  • HashMap在JDK1.8之后解决哈希冲突变化:当链表长度大于阈值(默认8)时,将链表转化为红黑树,以减少搜索时间。

6、HashMap和HashSet的区别

  • HashSet底层是基于HashMap实现的,只有clone、writeObject、readObject是自己实现的
HashMapHashSet
实现了Map接口实现了Set接口
键值对储存只储存值
添加put()添加元素add()
使键计算Hashcode使用成员对象计算

7、HashSet如何检查重复

待更新 复述了JAVAGUIDE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值