Java 集合框架

Collection接口

一. List接口

1.List继承了Collection,是有序的列表。

List a=new ArrayList();
则a拥有List的所有属性和方法,不会拥有其实现类ArrayList的独有的属性和方法。
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i是调用了List中的i
a.f()是调用了ArrayList中的f();

2.实现类有ArrayList、LinkedList、Vector、Stack等

1.ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!
a. 如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.
b. ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为增加0.5倍。
c. ArrayList是线程不安全的,在多线程的情况下不要使用。
d. 切记Vector是ArrayList的多线程的一个替代品。
e.ArrayList数组线性表的特点为:类似数组的形式进行存储,因此它的随机访问速度极快。
f.ArrayList数组线性表的缺点为:不适合于在线性表中间需要频繁进行插入和删除操作。因为每次插入和删除都需要移动数组中的元素。

2.LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!
a. LinkedList的链式线性表的特点为: 适合于在链表中间需要频繁进行插入和删除操作。
b. LinkedList的链式线性表的缺点为: 随机访问速度较慢。查找一个元素需要从头开始一个一个的找。
c. LinkedList不是线程安全的
d. LinkedList的内部是基于双向循环链表的结构来实现的。在LinkedList中有一个类似于c语言中结构体的Entry内部类。

3.Vector是基于数组实现的,是一个矢量队列,是线程安全的!
4.Stack是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)!

二. Set接口

1.Set中的元素实现了不重复,有点象集合的概念,无序,不允许有重复的元素,最多允许有一个null元素对象。
2.Set接口的常见实现类有HashSet, LinedHashSet 和 TreeSet 这三个。

1.HashSet是Set接口的最常见的实现类了。其底层是基于Hash算法进行存储相关元素的。
a.HashSet中存放null值:HashSet中时允许出入null值的,但是在HashSet中仅仅能够存入一个null值哦。
b.HashSet中存储元素的位置是固定的:HashSet中存储的元素的是无序的,这个没什么好说的,但是由于HashSet底层是基于Hash算法实现的,使用了hashcode,所以HashSet中相应的元素的位置是固定的哦。

2.LinkHashSet不仅是Set接口的子接口而且还是上面HashSet接口的子接口。
a.对于LinkedHashSet而言,它和HashSet主要区别在于LinkedHashSet中存储的元素是在哈希算法的基础上增加了链式表的结构。

3.TreeSet是一种排序二叉树。存入Set集合中的值,会按照值的大小进行相关的排序操作,底层算法是基于红黑树来实现的。TreeSet和HashSet的主要区别在于TreeSet中的元素会按照相关的值进行排序。
  1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
  2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
  3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
    a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
    b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象才可以真正定位到键值对应的Entry.
    c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
  4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
    a. Comparator可以在创建TreeMap时指定
    b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
    c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了.

三.Map接口

Map接口不直接继承于Collection接口,Map有两种比较常用的实现:HashMap和TreeMap等。Map接口的常见实现类HashMap、TreeMap、LinkedHashMap、Properties(继承HashTable)以及老版本的HashTable等

1.HashMap实现了Map、CloneMap、Serializable三个接口,并且继承自AbstractMap类。

a. HashMap基于hash数组实现,若key的hash值相同则使用链表方式进行保存。
b. 新建一个HashMap时,默认的话会初始化一个大小为16。
c. 在HashMap中当数据量很多时,并且已经达到了负载限度时,会重新做一次哈希,也就是说会再散列。调用的方法为resize(),并且java默认传入的参数为2*table.length。

2.LinkedHashMap的特点:

LinkedHashMap继承自HashMap并且实现了Map接口。和HashMap一样,LinkedHashMap允许key和value均为null。

3.HashMap与Hashtable的区别:

Hashtable实现Map接口,继承自古老的Dictionary类,实现一个key-value的键值映射表。任何非空的(key-value)均可以放入其中。

区别主要有三点:

a. Hashtable是基于陈旧的Dictionary实现的,而HashMap是基于Java1.2引进的Map接口实现的;

b. Hashtable是线程安全的,而HashMap是非线程安全的,我们可以使用外部同步的方法解决这个问题。

c. HashMap可以允许你在列表中放一个key值为null的元素,并且可以有任意多value为null,而Hashtable不允许键或者值为null。

遍历

在类集中提供了以下四种的常见输出方式:
1)Iterator:迭代输出,是使用最多的输出方式。
2)ListIterator:是Iterator的子接口,专门用于输出List中的内容。
3)foreach输出:JDK1.5之后提供的新功能,可以输出数组或集合。
4)for循环
代码示例如下:
for的形式:for(int i=0;i<arr.size();i++){…}
foreach的形式: for(int i:arr){…}
iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); …}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值