java-集合
集合的概念
概念:是一种工具类,也是一个容器,可以用于存储数量不等的多个对象
所有的集合接口和相关实现类都在java.util包中
集合的结构
Collection父接口
特点:存储对象,即存储的类型为Object
方法:Collection接口是List和Set接口的父接口,该接口中定义的方法在List和Set中也肯定存在。
Collection接口中的方法:
//添加一个对象
boolean add(Obdect obj);
//清空此集合中的所有对象
void clear();
//检查此集合中是否包含o对象
boolean contains(Object o);
//检查此集合中是否包含c中的所有对象
boolean containsAll(Object o);
//判断此集合是否为空
boolean isEmpty();
//在此集合中移除o对象
boolean remove(Object o);
//在此集合中移除c中所有的对象
boolean removeAll(Collection c);
//返回此集合中的元素个数
int size();
//将此集合转换成数组
Object[] toArray();
List接口
特点:存储Object类型的对象,有序、有下标、元素可以重复。
下表范围:0~集合有效元素个数-1(即:size-1)
方法:List接口继承了Collection接口的方法,除此由于List是有序、有下标的,则List集合添加了一些根据下标操作集合元素的方法
//将o元素存储在制定下标index位置
void add(int index,Object o);
//将c中所有的元素存储在指定下标index位置
boolean add(int index,Cillection c);
//返回集合中指定位置的元素
Object get(int index);
//移除index位置上的元素,返回删除对象
Object remove(int index)
//替换index位置上的元素,返回修改前的元素
Object set(int index,Object element)
//返回集合中指定部分的元素
List subList(int fromIndex,int toIndex)
//返回对象第一次出现的下标,如果没有指定元素,则返回-1
int indexOf(Object o)
//返回对象最后一次出现的下标,如果没有返回-1
int lastIndexOf(Object o)
List实现类
ArrayList:
底层用数组实现,查询快,增删慢;
JDK1.2版本,线程不安全,运行效率高
Vector:
底层用数组实现,查询快,增删慢;
JDK1.0版本,线程安全,运行效率慢
LinkedList:
底层用链表实现,增删快,查询慢
泛型集合:类型安全的集合,强制集合元素类型必须一致
泛型类:
class 类名<泛型类型标识符1,泛型类型标识符2>{
泛型类型标识符1 变量名;
}
通常用:T/E/V/K作为泛型标识符
泛型对象:类名<具体类型> 对象名 = new 类名<具体类型>();
泛型接口:JDK5.0之后不仅可以在类上声明泛型,也可以在接口上声明泛型
语法:interface 接口名<泛型标识>{}
Collections工具类
Java提供了一个操作集合的工具类:Collections,该工具类中提供了一些方法用来操作集合中的元素:
public static void reverse(List list):对集合元素倒置
public static void shuffle(List list):对集合元素随机显示
public static void sort(List list):对集合元素排序
注意:如果集合元素是自定义类型的对象,必须实现java.util.Comparable接口,并实现compareTo方法
Set子接口
特点:无序、无下标、元素不可重复
方法:全部继承自Collection中的方法
实现类:HashSet(底层是HashMap实例)
HashSet添加元素原理
将自定义类型的对象存入HashSet时,无法保证元素的不重复
解决办法:
为触发equals方法的调用,重写hashCode方法:
* 确保相同对象返回相同的哈希码,尽量保证不同的对象返回不同的哈希码*(减少equals方法的调用)
覆盖equals方法,保证“相同”对象的比较结果为true
通过哈希码辨别对象是否重复,若是哈希码一致,通过equals在此确认对象是否一致
TreeSet实现类
SortedSet接口是Set子接口
特点:存储Object对象,无序、无下标、元素不重复。可对集合元素自动排序
实现类:TreeSet
遍历方式:迭代遍历、forEach遍历
注意:TreeSet通过CompareTo方法返回值是否为“0”确定重复元素
Map体系集合
Map结构:映射,将键映射到值的对象
)
Map接口的特点:
①用于存储任意键值对(Key-value)
②键:无序、无下标、不允许重复(唯一)
③值:无序、无下标、允许重复
方法
/*
往Map中存储一个键值对,如果key在map中已经存在,则新值覆盖旧值;
如果key在map中不存在,则直接存储,返回值为null
*/
V put(K key,V value);
//根据键删除集合中对应的键值对,返回被删除的value
V remove(K key);
//根据key查询对应的value
V get(K key);
//获取集合中键值对的数量
int size();
//判断map集合中是否包含key的键,返回值是true/false
boolean containsKey(K key);
//判断map集合中是否包含value的值,返回true/false
boolean containsValue(V value);
Map的实现类:
HashMap,支持键为null,效率快,但是线程不安全
遍历:
键遍历:通过Set keySet()方法
值遍历:通过Collection values()方法
键值对遍历:通过Set
Map集合的实现类
HashMap【重点】
JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value
Hashtable:
JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value
Properties:
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取
TreeMap:
实现了SortedMap接口(是Map的子接口),可以对key自动排序,实现comparable接口的compareTo方法