java集合详解 及常见问题

JAVA集合详解

JAVA集合详解

**

一,什么是集合

我总结了以下几点:
1、集合类存放于java.util包中。
2、集合类型主要有3种:set(集)、list(列表)和map(映射)。
3、集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。
简单来讲:集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

二,集合关系特点详解

java集合大致可以分为三类lterable,Collection和Map
1.lterable接口:
(1),所有的集合类,都实现了Iterator接口,实现iterator接口可以增强for循环 foreach)是一个方便的实现遍历集合中元素的接口,注:Iterator接口对象又称作 迭代器。
(2),实现Iterator接口的集合必须提供一个iterator()方法,要求容器返回一个 Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意: iterator()方法是java.lang.Iterable接口,被Collection继承。
iterator()方法主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
   2.next()返回下一个元素。
   3.remove()删除当前元素。(注:此后不能调用remove,直到next在次调用)

**

2. Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让 其被继承产生了两个接口,就是Set和List提供了按索引访问的方式。

**
List 有序,可重复
ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Set 无序,唯一
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1. 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定

3.Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
TreeMap是有序的,HashMap和HashTable是无序的。
Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
这就意味着:
Hashtable是线程安全的,HashMap不是线程安全的。
HashMap效率较高,Hashtable效率较低。
如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。 查看 Hashtable 的源代码就可以发现,除构造函数外,Hashtable的所有 public 方 法声明中都有 synchronized关键字,而HashMap的源码中则没有。
Hashtable不允许null值,HashMap允许null值(key和value都允许)
父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap

三,集合常见问题

一,ArrayList和LinkList的区别
共同点:
这两个类都实现了List接口,它们都是有序的集合(存储有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。
区别:
同步性:
ArrayList是非同步的
Vector是同步的
即便需要同步的时候,我们可以使用Collections工具类来构建出同步的 ArrayList而不用Vector
扩容大小:
Vector增长原来的一倍,ArrayList增长原来的0.5倍

二,Collection接口的remove()方法和Iterator接口的remove()方法区别?
性能区别:
Collection的remove方法采用的是单链表结构查询,单链表查询效率比较低。
Iterator的remove方法结合next()方法使用,比如集合中每隔一项删除一项,Iterator的remove()效率更高

容错区别:
在使用Iterator遍历时,如果使用Collection的remove则会报异常,会出现ConcurrentModificationException,
在使用Iterator遍历时,不会报错,因为iterator内部的对象个数和原来集合中对象的个数会保持一致

总结:
如果调用Iterator 的remove() 方法来删除的话,则iterator的内部对象个数和原来集合中对象的个数会保持同步,而直接调用集合的remove方法来删除的话,集合中对象的个数会变化而Iterator 内部对象的个数不会变化,当调用Iterator 的next 遍历的时候发现集合中的对象的个数和Iterator 内部对象的个数不同,这样指针往后移动的时候就找不到要迭代的对象。这是报异常的主要原因,但 内部对象操作时为了避免这种情况都会通过checkForComodification方法检测是否一致,不一致提前抛出异常ConcurrentModifiedException。

三,Array与ArrayList有什么区别
简单来说:
1.ArrayList是Array的复杂版本;
2.存储的数据类型:Array只能存储相同数据类型的数据,而ArrayList可以存储不同数据类型的数据;
3.长度的可变:Array的长度是固定的,而ArrayList的长度是可变的。

四,HashMap、TreeMap、linkedHashMap区别?
相同点:
HashMap,LinkedHashMap,TreeMap都属于集合Map接口的子类。都是键值对集合。线程都不安全,效率高。
不同点:
(1)HashMap键是哈希表结构,可以保证键的唯一性,key能null,值也可为null。
(2)LinkedHashMap是HashMap的子类,内部依赖哈希表和链表列实现。由hash保证键的唯一性,由LinkedList保证有序性(存取顺序一致)。key能为Null,value也能为null。
(3)TreeMap类,键是红黑树结构,可以保证键的排序(自然排序),并且不能重复。key不能为null,value可以为null

**

五,List、Set、Map之间的区别

**
List和Set都继承Collection,但是Map不是Collection的子接口。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值