集合:
当数据多了需要存储,需要容器,但是数据的个数又不确定的时候,无法使用数组(数组长度是固定的,集合长度是可变的),这时便使用了Java中的另一个容器集合。存储的元素都是引用类型。
集合框架:
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
Collection接口中有三个子接口(List,Set,Queue)
Collection中的方法:
addAll(Collection<? extends E> c)
addAll(int index, Collection<? extends E> c)
clear()
contains(Object o)
containsAll(Collection<?> c)
isEmpty()
iterator()
remove(Object o)
removeAll(Collection<?> c)
retainAll(Collection<?> c)
size()
toArray()
toArray(T[] a)
List中的特有方法:
listIterator() //返回此列表元素的列表迭代器(按适当顺序)。
listIterator(int index) //返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
subList(int fromIndex, int toIndex)
返回此集合中的一部分视图,即截取子集,从fromIndex到endIndex,包前不包后,返回的集合引用的是原集合的一部分,所以对sublist操作就是在对list进行操作。对list操作完,就不能操作subList,subList已经失效。
get(int index)
set(int index, E element)
indexOf(Object o)
add(int index, E element)
lastIndexOf(Object o)
remove(int index)
List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
实现类:ArrayList,LinkedList,Vector
1.ArrayList底层是动态数组数据结构,是不同步的。查找较LinkedList快。
2.LinkedList底层是双链表数据结构,是不同步的。增加和删除元素较ArrayList快。
3.Vector底层也是动态数组,是同步的,增删、查找效率较低。
Queue接口的实现类:
LinkedList->实现了Queue中的方法:offer后进,poll从头出(移除)。peek方法查看头并不移除。
Queue接口的子接口Deque的实现类:
LinkedList->实现了Deque中方法:offerFirst从头进,offerLast从尾进,pollFirst移除头,pollLast移除尾,peekFirst查看头并不移除,peekLast查看尾并不移除,(类似栈操作)->pop移除尾,push从头进。所以模拟栈结构时,应当用Deque声明。
Set:元素不能重复,无序。
实现类:
1.HashSet
内部数据结构是哈希表。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。存入此集合的元素应当重写hashCode()和equals()方法。该集合对象在判断元素的唯一性时,使用hashCode()的返回值,当且仅当hashCode()返回值与该集合中已存在的某个元素hashcode值相同时,才使用equals()方法判断是否内容相同。存入该集合中的元素位置不随该元素内容的改变而改变,因此需要注意存入该集合中的元素不应改变能影响hashCode方法返回值的成员变量的值。
2.LinkedHashSet
是HashSet的子类,具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 sets 中。)
3.TreeSet
基于 TreeMap的
NavigableSet
实现。实现了SortedSet接口。使用元素的自然顺序(使用元素自己的compareTo()方法)对元素进行排序,或者根据创建 set 时提供的 Comparator
进行排序,具体取决于使用的构造方法。用此集合存放元素时,元素可以实现Comparable接口或者往构造器中传入比较器对象。
Map接口实现类有HashMap,TreeMap,HashTable。
1.HashMap:
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
2.Hashtable
此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null对象都可以用作键或值。存入该集合中的key也应当重写hashCode和equals方法。原理和HashMap一致。Hashtable是同步的。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable。Hashtable下有个子类叫Properties。
3.TreeMap:
基于红黑树(Red-Black tree)的NavigableMap 实现。实现了SortedMap接口。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 C
omparator
进行排序,具体取决于使用的构造方法。用此集合存放元素时,key元素可以实现Comparable接口或者往构造器中传入比较器对象。
Properties:
Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。所以创建Properties对象时没有泛型。
Iterator:
Iterator是遍历集合的迭代器(不能遍历Map,只能遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。其中,枚举Emumeration和迭代器Iterator功能重复,Iterator多一个删除操作,由于其名字太长,被弃用。
集合工具类:
Collections:集合框架中用于操作集合对象的工具类,都是静态方法。
方法:
Colletions.sort(List<E> list):可将list集合进行排序,list中的元素应当实现Comparable接口,或者使用Collections.sort(List<E> list,Comparable<? super T> c)方法。
Collections.shuffle(List<?> list):随机打乱list集合中元素的顺序。
使用Collections中的这些静态方法可以返回一个指定集合的对象,不过在对该集合或视图上的元素进行迭代时,必须手动同步。synchronizedCollection(Collection<T> c)、synchronizedList<List<T> list)、synchronizedMap(<Map<K,V> m)、synchronizedSet<Set<T> s)、synchronizedSortedMap(SortedMap<K,V> m)、synchronizedSortedSet(SortedSet<T> s)。
数组工具类:
Arrays:用于操作数组的工具类,类中定义的都是静态工具方法。
1、对数组排序
2、二分查找
3、数组复制
4、将两个数组进行元素的比较,判断两个数组是否相同
5、将数组转成字符串
6、将数组转成list集合(asList方法),为了使用集合的方法操作数组中的元素
注意:数组长度是固定的,在转成集合后,长度也是固定的,所以不要使用集合的增删功能;如果数组中存储的是基本数据类型,那么转成集合后,数组对象作为集合中的元素存在;如果数组中元素是引用数据类型时,转成集合后,数组元素作为集合元素存在。
【注意】只有Hashtable和Properties不能添加null值和null键。