Java-集合框架
1. 集合的概念
-
概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。
-
集合和数组的区别
-
-
数组可以存储基本类型和引用类型,集合只能存储引用类型。
-
-
位置:java.util.*;
2. Collection接口
-
特点:代表一组任意类型的对象,无序、无下标、不能重复。
-
方法:
boolean add(Object obj); //添加一个对象
boolean addAll(Collection c); //将一个集合中的所有对象添加到此集合中
void clear(); //清空此集合中的所有对象
boolean contains(Object o); //检查此集合中是否包含o对象
boolean equals(Object o); //比较此集合是否与指定对象相等
boolean isEmpty(); //判断此集合是否为空
boolean remove(Object o); //在此集合中移除o对象
int size(); //返回此集合中的元素个数
Object[] toArray(); //将此集合转换成数组 -
迭代器:
Collection collection = new ArrayList();
collection.add("红");
collection.add("蓝");
collection.add("绿");
Iterator it = collection.iterator();
/**
* hasNext(); 如果仍有元素迭代,则返回true
* next(); 返回迭代的下一个元素
* remove();
*/
while (it.hasNext()){
System.out.println(it.next());
}
3. List
-
特点:有序、有下标、元素可以重复。
-
方法
void add(int index, Object o); //在index位置插入对象o
boolean addAll(int index, Collection); //将一个集合元素添加到此集合中的index位置
Object get(int index); //返回集合中指定位置的元素
List subList(int fromIndex, int toIndex);//返回fromIndex和toIndex之间的集合元素ArrayList
ArrayList
-
数组结构实现,查询快、增删慢。
-
JDK1.2版本,运行效率快、线程不安全。
-
ArrayList arrayList = new ArrayList<>(); -
源码分析:
-
DEFAULT_CAPACITY = 10;默认容量
-
注意:如果没有向集合中添加任何元素时,容量0;添加一个元素后,容量10;每次扩容大小是原来的1.5倍
-
-
elementData存放元素数组
-
size实际元素个数
-
add()添加元素
-
Vector
-
数组结构实现,查询快、增删慢。
-
JDK1.0版本,运行效率慢、线程安全。
LinkedList
-
链表结构实现,增删快、查询慢。
4. 泛型
-
Java泛型是JDK1.5中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。
-
常见形式有泛型类、泛型接口、泛型方法。
-
语法:
-
<T,...>称为类型占位符,表示一种引用类型。
-
-
好处:
-
提高代码的重用性。
-
防止类型转换异常,提高代码的安全性。
-
-
泛型接口:
-
语法:接口名<T>
-
public interface MyInterface<T>{
T method(T t);
}
public class MyGeneric implements MyInterface<String>{
}
//接口实现类泛型
public class MyGeneric<T> implements MyInterface<T>{
} -
注意:不能泛型静态常量
-
-
泛型方法:
-
语法:<T>返回值类型
-
public <T> void method(T t){
}
public <T> T method(T t){
return t;
}
-
-
泛型集合:
-
概念:参数化 类型、类型安全的集合,强制集合元素的类型必须一致。
-
特点:
-
编译时即可检查,而非运行时抛出异常。
-
访问时,不必类型转换(拆箱)。
-
不同泛型之间引用不能相互赋值,泛型不存在多态。
-
-
5. Set
-
Set子接口:
-
特点:无序,无下标、元素不可重复。
-
方法:全部继承自Collection中的方法。
-
HashSet
-
基于HashCode是实现元素不可重复。
-
当存入元素的哈希码相同时,会调用equals进行确认,如结果为ture,则拒绝后者存入。
-
存储结构:哈希表(数组+链表+红黑树)。
-
存储过程:
-
根据HashCode,计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二步。
-
再根据equals方法,如果equals方法为true,则认为是重复,否则形成链表。
-
TreeSet
-
基于排列顺序实现元素不重复。
-
实现了SortedSet接口,对集合元素自动排序。
-
元素对象的类型实现Comparable接口,指定排序规则。
-
通过CompareTo方法确定是否为重复元素。
-
存储结构:红黑树
-
使用TreeSet保存数据
-
要求:元素必须要实现Comparable接口,并重写compareTo方法,方法返回值为0,认为是重复元素。
-
-
Comparator:实现定制比较(比较器)
-
//创建集合,并指定比较规则
TreeSet<T> obj = new TreeSet<T>(new Comparator<T>(){
-
6. Map
-
特点:
-
用于存储任意键值对(Key-Value)
-
键:无序、无下标、不允许重复(唯一)
-
值:无序、无下标、允许重复
-
-
方法:
V put(K key, V value) //将对象存入到集合中,关联键值。key重复则覆盖原值。
Object get(Object key) //根据键获取对应的值
Set<K> //返回多有key
Collection<V> values() //返回包含所有值的Collection集合
Set<Map.Entry<K,V>> //键值匹配的Set集合 -
遍历:
//1.使用keySet();
Set<T> keyset = map.keySet();
//或
for(T key : map.keySet()){
}
//2.使用entrySet()方法
Set<Map.Entry<T,T>> entries = map.entryset();
for(Map.Entry<T,T> entry : entries){
entry.getKey();
entry.getValue();
}
//entrySet效率高于keySet
HashMap
-
JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value。
-
存储结构:哈希表(数组+链表+红黑树)
-
使用key可hashcode和equals作为重复
-
源码分析总结:
-
HashMap刚创建时,table时null,为了节省空间,当添加第一个元素时,table容量调整为16
-
当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后大小为原来2倍。目的减少调整元素的个数。
-
jdk 1.8 当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率。
-
jdk 1.8 当链表长度小于6时,调整成链表。
-
jdk 1.8以前,链表是头插入, jdk 1.8以后是尾插入。
-
Hashtable
-
JDK 1.0版本,线程安全 ,运行效率慢;不允许null作为key或是value
Properties
-
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
TreeMap
-
实现了SortedMap接口(是Map的子接口),可以对key自动排序。
Collections工具类
-
概念:集合工具类,定义了除了存取以外的集合常用方法。
-
方法:
public static void reverse(List<?> list) //反转集合中元素的顺序
public static void shuffle(List<?> list) //随机重置集合元素的顺序
public static void sort(List<T> list) //升序排序(元素类型必须实现Comparable接口)
总结
-
集合的概念:
-
对象的容器,和数组类似,定义了对多个对象进行操作的常用方法。
-
-
List集合:
-
有序、有下标、元素可以重复。(ArrayList、LinkedList、Vector)
-
-
Set集合:
-
无序、无下标、元素不可重复。(HashSet、TreeSet)
-
-
Map集合:
-
存储一对数据,无序、无下标、,键不可重复,值可重复。(HashMap、TreeMap、HashTable)
-
-
Collections:
-

浙公网安备 33010602011771号