Java容器理论知识点

1. Java容器都有哪些?

Java 容器分为 CollectionMap 两大类,其下又有很多子类,如下所示:

1. Collection:Java集合框架的根接口,定义了集合的基本操作。

2. List:有序、可重复的元素集合,支持索引访问。

3. ArrayList:基于动态数组实现的List,查询速度快,增删慢。

4. LinkedList:基于双向链表实现的List,增删速度快,查询慢。

5. Vector:类似于ArrayList,但线程安全,性能较差。

6. Stack:栈结构,先进后出。

7. Set:无序、不可重复的元素集合。

8. HashSet:基于HashMap实现的Set,元素无序、不重复。

9. LinkedHashSet:基于LinkedHashMap实现的Set,元素有序、不重复。

10. TreeSet:基于TreeMap实现的Set,元素有序、不重复,按自然顺序或自定义顺序排序。

11. Map:键值对集合,每个键对应一个值。

12. HashMap:基于哈希表实现的Map,键无序、不重复。

13. LinkedHashMap:基于哈希表和链表实现的Map,键有序、不重复。

14. TreeMap:基于红黑树实现的Map,键有序、不重复,按自然顺序或自定义顺序排序。

15. ConcurrentHashMap:线程安全的HashMap,支持高并发。

16. Hashtable:类似于HashMap,但线程安全,性能较差。

2. Collection 和 Collections 有什么区别?

Collection是Java集合框架根 接口,所有的集合都是它的子类(如set、list这些),定义了基本的集合操作方法,如添加删除遍历 等。

Collections是一个有静态方法(不能被实例化)的包装类(就像一个工具类),操作方法有排序查找等。

3. List、Set、Map 之间的区别是什么?

List有序集合,允许存储重复元素

Set无序集合,不允许存储重复元素;

Map键值对映射,其中键值对是一一对应关系,一个键对应一个值

map键不可以重复,值允许重复

4. HashMap 和 Hashtable 有什么区别?

HashMap非线程安全的,允许有null键和值,效率较高

HashTable线程安全的,不允许有null键和值,效率相对较低

在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用

推荐在单线程环境下使用HashMap替代多线程使用ConcurrentHashMap 替代

如何决定使用 HashMap 还是 TreeMap?

HashMap是用于 无序高效键值对存储。

TreeMap是用于按键有序存储,它能根据键的自然顺序指定的比较器进行排序。

5. 说一下 HashMap 的实现原理?

HashMap基于Hash 算法实现的,通过 put(key,value)存储get(key)来获取

内部使用一个数组存储对象,通过哈希码确定数组位置

多个键映射到同一个位置时,也就是hash值相同的情况,称为hash冲突,可以使用链表红黑树解决

当链表的长度大于8,且数组的长度大于64时,就会转成红黑树解决。

如果数组长度小于64时,会进行扩容操作,不会转成红黑树。

因为数组的长度较小,应该尽量避开红黑树。因为红黑树需要进行左旋,右旋,变色操作来保持平衡,所以当数组长度小于64,使用数组加链表比使用红黑树查询速度要更快、效率要更高。

6. ArrayList 和 LinkedList 的区别是什么?

ArrayList是基于动态数组(的数据结构)实现,通过索引访问元素 速度插入和删除元素较(影响数组内的其他数据的下标);

LinkedList是基于双向链表(的数据结构)实现,插入和删除元素速度,但访问元素较(需要移动指针从前往后依次查找)

也就是说,频繁读取的话,使用ArrayList,增加和删除比较多的话使LinkedList。

7. 如何实现数组和 List 之间的转换?

数组转 List:使用 Arrays. asList(array) 进行转换。

List 转数组:使用 List 自带的 toArray() 方法。

8. ArrayList 和 Vector 的区别是什么?

ArrayList是非线程安全的,在高并发环境下性能;

Vector是线程安全的,通过synchronized同步来保证线程安全,性能相对较

ArrayList 和 Vector 都会根据实际的需要动态的调整容量,Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%

9. 集合Array和数组 ArrayList 有何区别?

Array 的空间大小是固定的,而 ArrayList 空间大小是自动扩展的。

Array 可以存储基本数据类型对象,ArrayList 只能存储对象

ArrayList的内置方法比Array多,比如添加、删除、遍历这些。

10. 哪些集合类是线程安全的?

VectorHashtableStack

Collections类下synchronized方法 生成的集合(synchronizedList、synchronizedSet、synchronizedMap),

以及在JDK1.5之后的ConcurrentHashMap这些

都是java中线程安全的集合类。

(像HashMap是非线程安全的,在JDK1.5之后随着Java. util. concurrent 并发包的出现,它们也有 了 自 己 对 应 的 线 程 安 全 类 , 比 如 HashMap 对 应 的 线 程 安 全 类 就 是ConcurrentHashMap)

11. 迭代器 lterator 是什么?

迭代器iterator是一种用于遍历集合元素的接口,允许调用者在迭代过程中移除元素。

取代了 Java 集合框架中的 Enumeration。

12. lterator 怎么使用?有什么特点?

通过调用集合iterator()方法获取迭代器对象,然后使用hasNext()判断是否有下一个元素,使用next()获取下一个元素。

迭代器的特点是 只能单向遍历不支持修改操作更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException 异常

13. lterator 和 Listlterator 有什么区别?

iterator 可以遍历 Set List 集合,而 ListIterator 只能遍历 List

iterator 只能 单向遍历 集合,支持 修改 操作;

ListIterator 是iterator的扩展,可以 双向遍历向前/后遍历) 集合,支持在遍历中修改集合,还有添加替换获取前面或面元素的索引位置。

14. 怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法创建一个只读集合,

这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值