集合容器概述
java容器一般分为两类:
1.Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素(即当某元素不存在于set中时,add()方法才奏效),Queue按照排队规则来确定对象产生的顺序。
2.Map:一组成对的“键值对”对象,允许你使用键来查找值。键和值在Map中的保存顺序并不是它们的插入顺序,当然在其子类中也可以指定顺序。比如,TreeMap按照比较结果的升序保存键,而LinkedHashMap则按照插入顺序保存键。
当LinkedList或其他需要用到接口中未包含的额外方法时,就需要按照LinkedList list = new LinkedList()这样定义。
public class AddingGroups { public static void main(String[] args) { Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)); Integer[] moreInts = {6, 7, 8, 9, 10}; collection.addAll(Arrays.asList(moreInts)); Collections.addAll(collection, 11, 12, 13, 14, 15); Collections.addAll(collection, moreInts);//首选方式 List<Integer> list = Arrays.asList(16, 17, 18, 19, 20); list.set(1, 99); } }
Arrays.asList():接收一个数组或是一个用逗号分隔的元素列表,并将其转换为一个List对象。
Collections.addAll():接受一个Collection对象,以及一个数组或是一个用逗号分割的列表,将元素添加到Collection中。
接下来分别介绍接口及实现类的情况:
1.List
分为两类:
1)ArrayList:随机访问元素较快,但是在List的中间插入和移除元素时较慢。
2)LinkedList:插入和删除较快,随机访问较慢。
ArrayList【非线程安全】的基本方法:
1)add(int index, E element):将指定的元素插入此列表中的指定位置。
2)add(E element):将指定的元素添加到此列表的尾部。
3)addAll(collection):将collection中的所有元素添加到此列表的尾部。
4)addAll(int index, collection):从指定位置开始,将指定collection中的所有元素插入此列表中。
5)clear():移除此列表中的所有元素。
6)contains(Object o):如果此列表中包含指定的元素,则返回true。
7)indexOf(Object o):返回此列表中首次出现的指定元素的索引,如果此列表不包含元素,则返回-1。
8)isEmpty():如果此列表中没有元素,则返回true。
9)lastIndexOf(Object o):返回此列表中最后一次出现的指定元素的索引,如果此列表不包含索引,则返回-1。
10)remove(int index):移除此列表中指定位置上的元素。
11)remove(Object o):移除此列表中首次出现的指定元素(如果存在)。
12)removeRange(int begin, int end):移除列表中索引在begin(包括)和end(不包括)之间的所有元素。
13)set(int index, E element):用指定的元素替代此列表中指定位置上的元素。
14)toArray():返回包含此列表中所有元素的数组。
相对于ArrayList,LinkedList【非线程安全】所特有的方法:【可以作为stack或queue使用】
【当然,有封装好的Stack和Queue、PriorityQueue】
1)addFirst(E element):将指定元素插入此列表的开头。
2)addLast(E element):将指定元素添加到此列表的结尾。
3)element():获取但不移除此列表的头(第一个元素)。
4)peek():获取但不移除此列表的第一个元素,如果此列表为空,则返回null。
5)peekLast():获取但不移除此列表的最后一个元素,如果此列表为空,则返回null。
6)poll():获取并移除此列表的头。
7)pollLast():获取并移除此列表的最后一个元素,如果此列表为空,则返回null。
8)pop():从此列表所表示的堆栈处弹出一个元素。
9)push(E e):将元素push入此列表所表示的堆栈。
10)offer(E e):将指定元素添加到此列表的末尾(最后一个元素)。
2.Set
set于collection有完全一样的接口,不像上面的ArrayList和LinkedList一样,还扩展了collection的接口。
TreeSet将元素存储在红-黑树数据结构中,而HashSet和LinkedHashSet使用的是散列函数。
如果想要对结果排序,可以使用TreeSet代替HashSet。
HashSet【非线程安全】基本方法:
1)add(E element):如果此set中尚未包含指定元素,则添加指定元素。
2)clear():从此set中移除所有元素。
3)clone():返回此HashSet实例的浅表副本,并没有复制这些元素本身。
4)contains(Object o):如果此set包含指定元素,则返回true。
5)isEmpty():如果此set不包含任何元素,则返回true。
6)iterator():返回对此set中元素进行迭代的迭代器。
7)remove(Object o):如果指定元素存在于此set中,则将其移除。
8)size():返回此set中的元素数量。
相对于HashSet,TreeSet【非线程安全】多有的基本方法:
1)addAll(collection):将指定collection中的所有元素添加到此set中。
2)ceiling(E element):返回此set中大于等于给定元素的最小元素
3)first():返回此set中当前第一个元素。
4)floor(E element):返回此set中小于等于给定元素的最大元素,如果不存在这样的元素,则返回null。
5)higher(E element):返回此set中严格大于给定元素的最小元素,如果不存在这样的元素,则返回null。
6)iterator():返回在此set中的元素上按升序进行迭代的迭代器。
7)last():返回此set中当前最后一个元素。
8)lower(E element):返回此set中严格小于给定个元素的最大元素,如果不存在,则返回null。
9)pollFirst():获取并移除第一个元素,如果set为空,则返回null。
10)pollLast():获取并移除最后一个元素,如果set为空,则返回null。
3.Map<key,value>,key唯一不重复
Map 接口
----|HashMap (基于哈希表和链表):线程不安全,效率高。 允许null键和null值,是基于哈希表的Map接口实现。 哈希表的作用是用来保证键的唯一性的,无序。
----|LinkedHashMap(基于哈希表和链表):是基于Map接口的哈希表和链接列表实现, 由哈希表保证键的唯一性 由链表保证键盘的有序(存储和取出的顺序一致)
----|Hashtable(基于哈希表和链表):线程安全,效率低。不允许null键和null值
----|treeMap (基于红黑树):线程不安全,且根据key有序存储。
HashMap【非线程安全】:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置。
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为重复元素,不允存储。
基本方法:
1)containsKey(Object key):如果此映射包含对于指定键的映射关系,则返回tue。
2)containsValue(Object value):如果此映射将一个或多个键映射到指定值,则返回true。
3)get(Object key):返回指定键所映射的值,如果没有任何映射关系,则返回null。
4)put(K key, V value):添加或修改键值对,如果是修改,把原来的value返回。
5)putAll(map):将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
6)remove(key):移除键对应的元素,并把value返回。
7)clear():移除所有键值对。
8)keySet():返回所有key的集合。
9)values():返回所有value的集合。
相对于HashMap,TreeMap【非线程安全】:
TreeMap 要注意的事项:
1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键的比较规则定义在CompareTo方法上。
3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须在创建TreeMap对象的时候传入比较器。
特有方法:
1)ceilingKey(K key):返回大于等于给定键的最小键,如果不存在,则返回null。
2)firstEntry():返回一个与此映射中的最小键关联的键值映射关系,如果映射为空,则返回null。
3)firstKey():返回此映射中当前第一个键。
4)floorEntry(K key):返回一个键值映射关系,它与小于等于给定键的最大键关联,如果不存在,则返回null。
5)floorKey(K key):返回小于等于给定键的最大键,如果不存在,则返回null。
6)lastKey():返回映射中当前最后一个键。
4.
迭代器Iterator:只能单向移动,这个Iterator只能用来:
1)使用iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2)使用next()获得序列中的下一个元素。
3)使用hasNext()检查序列中是否还有元素。
4)使用remove()将迭代器新近返回的元素删除。
遍历应用:
List list = new ArrayList(); Iterator it = list.iterator(); while(it.hasNext()) { it.next(); }