Day 10 集合
集合的概念
概念:是一种工具类,也是一个容器,可以用于存储数量不等的多个对象。
所有集合的接口和相关实现类都在java.util包中。
每一种接口都从以下4个方面讲解:
接口的特点、接口的方法、接口实现类、集合元素的遍历
集合的结构:
List接口的特点:存储Object类型的对象,有序、有下标、元素可以重复。
Collection接口的特点:存储对象,即存储数据类型Object。
Set接口的特点:用于存放任意Object对象,无序、无下标、元素不能重复。
Collection体系集合
Collection父接口
特点:存储对象,即存储的类型为Object。
方法:Collection接口是List和Set接口的父接口,该接口中定义的方法在List和Set中肯定也存在。
Collection接口中的方法:
boolean add(Object obj) //添加一个对象
void clear() //清空此集合中的所有对象
boolean contains(Object o) //检查此集合中是否包含o对象
boolean containsAll(Object o) //检查此集合中是否包含o中所有对象
boolean isEmpty() //判断此集合是否为空
boolean remove(Object o) //在此集合中移除o对象
boolean removeAll(Collection c) //在此集合中移除c中所有对象
int size() //返回此集合中的元素个数
Object[] toArray() //将此集合转换成数组
实现类:Collection父接口没有直接的实现类。
List集合
List接口
特点:存储Object类型的对象,有序、有下标、元素可以重复。
下标范围:0 - 集合有效元素个数-1(即size-1)
方法:List接口继承了Collection接口中的方法,除此由于List是有序、有下标的,则List集合中添加了一些根据下标操作集合元素的方法。
void add(int index, Object o) //将o元素存储在指定下标index位置
boolean add(int index, Collection c) //将c中所有元素存储到指定下标index位置
Object get(int index) //返回集合中指定位置的元素
Object remove(int index) //移除index位置上的元素,返回删除的对象
Object set(int index, Object element) //替换index位置上的元素,返回修改前的元素
List subList(int fromIndex, int toIndex) //返回集合中指定部分的元素
int indexOf(Object o) //返回对象第一次出现的下标,如果没有指定的元素,则返回-1
int LastIndexOf(Object o) //返回对象最后一次出现的下标,如果没有返回-1
实现类:
ArrayList:底层用数组实现,查询快、增删慢
遍历方法:下标遍历、forEach遍历
JDK1.2版本,线程不安全,运行效率快
加注:
JDK1.6及之前,new即生成长度为10的数组
JDK1.7做了小优化(技术更迭),new时给一个长度为0的数组,第一次调用 add时生成长度为10的数组。
Vector:底层用数组实现,查询快、增删慢
JDK1.0版本,线程安全,运行效率慢
LinkedList:底层用链表实现,增删快,查询慢
泛型集合:类型安全的集合,强制集合元素的类型必须一致。
泛型类:
语法:class 类名<泛型类型标识符1,泛型类型标识符2>{
泛型类型标识符1 变量名;
}
通常用:T/E/V/K作为泛型标识符
泛型对象:类名<具体类型> 对象名 = new 类名<具体类型>();
泛型接口:JDK5.0之后不仅可以在类上声明泛型,也可以在接口上声明泛型。
语法:
interface 接口名<泛型标识>{}
//示例
interface MyInter<T>{
T.getVar();
}
//实现类
//第一种方式
class ClassC implements MyInter<String>{
public String getVar(){
return "good";
}
}
//第二种方式
class ClassD<T> implements MyInter<T>{
T value;
public T getVar(){
return value;
}
}
Collections工具类
public static void reverse(List list);//对集合元素倒置
public static shuffel(List list);//对集合元素随机显示
public static void sort(List list);//对集合元素排序
//注意:如果集合元素是自定义类型的对象,必须实现java.util.Comparable接口,并实现compareTo方法。
Set子接口:
特点:无序、无下标、元素不可重复
方法:全部继承自Collection中的方法
实现类:HashSet
遍历方式:forEach遍历
HashSet添加元素原理:
将自定义类型对象存入HashSet时,无法保证元素不重复
覆盖equals方法,保证“相同”对象的比较结果为true
为触发equals方法的调用,重写hashCode方法:
确保相同的对象返回相同的哈希码
尽量保证不同的对象返回不同的哈希码
加注:
HashSet的初始容量为16,加载因子是0.75,不建议修改 。
基于HashCode实现元素不重复,当HashCode相同会调用equals二次确认,为true拒绝后者插入。
TreeSet实现类:
SortedSet接口是Set子接口
特点:存储Object对象,无序、无下标、元素不重复。可对集合元素自动排序
实现类:TreeSet
遍历方式:迭代遍历、forEach遍历
注意:TreeSet通过CompareTo方法返回值是否为“0”确定重复元素。
Map体系集合
Map父接口
Map接口的特点:
1.用于存储任意键值对(Key-Value)
2.键:无序、无下标、不允许重复(唯一)
3.值:无序、无下标、允许重复
方法:
V put(K key,V value) //往Map中存储一个键值对,如果Key在map中已经存在,则新值覆盖旧值;如果key在map中不存在,则直接存储,返回值为null。
V remove(K key)//根据键删除集合中对应的键值对,返回被删除的value。
V get(K key)//根据key查询对应的value
int size()//获取集合中键值对的数量
boolean containsKey(K key)//判断map集合中是否包含key的键,返回true/false.
boolean containsValue(V value)//判断map集合中是否包含value的值,返回true/false.
实现类:HashMap
遍历: 键遍历:通过Set< K > keyset() 方法
值遍历:通过Collection< V > values() 方法
键值对遍历:通过Set< Map.Entry< K,V > > entrySet() 方法
HashMap【重点】:
JDK1.2版本,线程不安全,运行效率快;允许 使用null作为key或value
Hashtable:0
JDK1.0版本,线程安全,运行效率慢;不允许null作为key或value
Properties:
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取
TreeMap:
实现了SortedMap接口(是Map的子接口),可以对key自动排序