导图
概念
- 集合一种操作比较便利的对象容器,可以用于存储多个对象(工具)
- 位置
位于java.util
包中
Collection集合体系
根接口
Collection
特点
用于存储任意类型的对象
常用的功能方法
方法名 | 功能 |
---|---|
boolean add(Object obj) | 往集合中添加一个元素,添加成功-true;不成功-false |
void clear() | 清空集合元素 |
boolean contains(Object o) | 判断当前集合中是否包含o元素包含-true;不包含-false |
boolean isEmpty() | 判断集合是否为空,为空-true;不为空-false |
boolean remove(Object o) | 将指定o对象从当前集合中删除,删除成功-true;不成功-false |
int size() | 返回集合中元素的个数 |
子接口及实现类
Collection具有多个子接口,没有直接的实现类,详见子接口的实现类
遍历方式
详见子接口
子接口List
List,是 Collection的子接口
特点
存储 任意类型的对象,有序、有下标、元素可以重复的
List集合下标的范围
0~size-1
功能方法
继承与于父接口Collection 中的方法,同时定义了一些独有方法
方法名 | 功能 |
---|---|
void add(int index,Object o) | 在当前集合中指定下标位置插入元素o |
boolean addAll(int index,Collection c) | 在当前集合指定位置,一次性插入多个元素 |
Object get(int index) | 返回 集合中指定下标的元素 |
Object remove(int index) | 返回集合中指定位置元素,被删除的元素作为返回值返回 |
Object set(int index,Object o) | 用o替换集合指定位置的元素,被替换的元素作为返回值返回 |
List subList(int from index , int toIndex) | 从当前集合中截取指定元素,从fomIndex开始截取,截取到toIndex-1 |
实现类-ArrayList
- ArrayList
底层用数组实现,查询效率较高,增(插入)删效率较慢
JDK1.2版本,线程不安全,执行效率较高
注意:
创建ArrayList对象时,底层数组并没有完成初始化,长度为0,当第一次调用add方法时,代表实际意义使用ArrayList集合存储对象,底层数组才初始化,空间默认长度为10,当存储对象达 到数组上限,自动完成扩容,每一次扩容倍数为 1.5倍(如果出现小 数区取整数位的长度)
- 开发应用现象
项目应用集合时,居多操作为add(元素)方 法,此方法采用的末尾添加方式,不会影响存储效率,删除数据,实 际开发时,从数据库中删除数据
- Vector
底层数组实现,查询效率较高,增(插入)删效率 较慢
JDK1.0版本,线程安全,效率较低 - LinkedList
底层用链表实现,查询效率比较低,增(插 入)删效率较高
线程不安全,运行效率较高
List集合遍历方式
下标遍历
- 用循环变量控制集合下标
for(int i=0;i<集合名.size();i++){
// 通过下标获取每一个集合元素get
Object o = list.get(i);
// 通过 o 变量对集合元素进行操作
}
forEach遍历
for(数据类型 变量名:集合名){
// 直接通过变量名操作集合元素
}
// 注意:()中数据类型取决于集合中元素类型(泛型)
迭代器(Iterator)遍历
是 forEach底层实现原理
-
获取迭代器对象
Iterator<集合元素数据类型> it = list.iterator();注意:首次获迭代器会在所有元素的最左端产生一个指针(游标)
-
常用的方法
boolean hasNext()
判断迭代中游标右侧还有没有数据,有-true;没有-false
操作 hasNext()方法不会导致游标的移动
K next()
获取迭代器中写一个元素
为了防止出现异常java.util.NoSuchElementException(没有可取元素异常),在调用next方法之前,需要利用hashNext方法有没有可取元素进行判断 -
遍历
Iterator<String> it= list.iterator();
while(it.hasNext()){
// 通过 it.next()方法获取迭代器中元素
}
泛型
泛型集合
数据安全性的集合,强制要求集合中存储的 数据类型统一
- List<数据类型> list = new ArrayList<数据类型>();
List<数据类型> list = new ArrayList<>(); // 简单写法 - 集合中存储的元素必须是<>中指定的数据类型
自定义的泛型类
class 类名<泛型标识>{
// 在类中将 泛型标识作为一种数据类型
}
注意:通常会用 K/V/T/E等单个 大写字母作为泛型标识
- 泛型类中泛型标识具体的数据类型是根据对象创建时指定:
类名<具体的数据类型> 引用名 = new 类名<具体的数据类型 >();
注意:基本数据类型必须使用其包装类型作为泛型类型;
创建对象时,如果没有指定泛型具体的数据类型,则默认为Object类型;
如果泛型类中有多个泛型标识,在创建对象时指定对应的数据类型时,jvm按照顺序进行匹配。指定时要么都指定,要么都不指定
泛型接口
JDK5.0版本及之后,泛型可以定义在接口,称为泛型接口
应用场景
类设计时使用泛型,使程序更加的灵活和通用
设计通用类或是底层架构时,应用比较广泛
Collections工具类
位置
位于java.util包中,对集合元素进行操作的工具类
功能方法
- static void reverse(List list)
将集合中元素进行倒置 - static void shuffle(List list)
对集合中元素进行随机显示 - static void sort(List list)
对集合元素进行排序
注意:如果参与排序的集合中存储的是自定义类型的对象, 则对象对应类需要实现 java.lang.Comparable接口,同时实 现接口中compareTo方法指定排序规则
相关题目
利用Java中的现有方法实现对集合元素进行排序
- Collections.sort( 集合名);
如果参与排序的集合中存储的是自定义类型的对象,则对象对应类需要实现java.lang.Comparable接口,同时实现接口中**compareTo(T t)**方法指定排序规则 —> 内置比较器 - List接口中提供默认方法sort(Comparator c):
如果参与排序的集合存储的是自定义类型的对象,则需要在参与比较的对象以外的地方定义一个匿名内部类(或是Lambda表达式) 实现java.util.Comparator接口,同时实现 **compare(T t1,T t2)**方法指定排序规则 —> 外置比较器
子接口Set
Collection的子接口
特点
存储任意类型的对象,无序、无下标、元素内容不 可以重复
方法
继承于父接口Collection中的方法
方法名 | 功能 |
---|---|
boolean add(Object obj) | 往集合中添加一个元素,添加成功-true;不成功-false |
void clear() | 清空集合元素 |
boolean contains(Object o) | 判断当前集合中是否包含o元素包含-true;不包含-false |
boolean isEmpty() | 判断集合是否为空,为空-true;不为空-false |
boolean remove(Object o) | 将指定o对象从当前集合中删除,删除成功-true;不成功-false |
int size() | 返回集合中元素的个数 |
实现类:HashSet
如果自定义类型的对象往HashSet中存储,为了保证元素内容不重复,需要做到以下两点:
- 覆盖hashCode方法
1.1 必须保证内容相同的对象返回值相同的哈希码值,为了提高效率,尽可能做到内容不同的对象返回不同哈希码值
1.2 覆盖原则:将所有的属性拼凑为int类型的结果作为返回值返回 - 覆盖 equals 方法
保证内容相同的对象返回true
HashSet保证存储元素内容不重复的执行原理
通过set.add(s1)将对象存储HashSet集合中时,默认调用存储对象(s1)的hashCode方法,获取哈希码值,哈希码值通过一 定计算(哈希值%底层数组长度)得到存储位置下标,如果此下标上没有存储过任何元素,则直接存储;但是存储该下标上已经存储对应的元素,此时默认调用s1对象对应类中的equals方法判断存储对象和此下标已经对象的内容是否相同,如果equals结果为true,代表内容相同对象,则s1被拒绝添加到集合中;但是如果equals结果为false代表内容不同的对象,则s1允许添加到集合中,也是存储在此下标中, 这时采用是数组+链表形式进行存储
Set集合其他的实现类
LinkedHashSet
LinkedHashSet是HashSet的子类,去除重复元素,同时可以按照元素添加顺序操作元素
如果自定类型的元素存储在LinkedHashSet中,为了保证元素内容不重复,存储元素对应类中需要覆盖 hashCode方法和 equals方法
TreeSet
TreeSet是SortedSet接口的实现类,SortedSet是Set的子接口,可以对集合中元素按照内容进行排序
注意
如果TreeSet集合中存储的是自定义类型的对象,则对象对应的类需要实现java.lang.Comparable接口,同时实现compareTo方法;
TreeSet保证元素不重复,取决compareTo方法的返回值,返回值为0,代表内容相同的元 素,直接拒绝添加到TreeSet集合中
Map集合体系
特点
Map是Map集合体系的根接口
- 键值对存储(key-value),一个键值对应Map集合中一个元素
- 键:无序、无下标、元素不允许重复(唯一)
- 值:无序、无下标、元素允许重复
常用方法
方法名 | 功能 |
---|---|
V put(K key, V value) | 往Map集合中添加一个键值对, 如果map没有存在要添加key内容,直接添加,返回值为 null;但是如果添加的key在map中已经存在,则key对应的 新value替代原有value,被替代的value作为返回值返回 |
V remove(K key) | 通过键删除Map中对应键值对,被删 除的value作为返回值返回 |
V get(K key) | 通过键(key)获取对应的value |
int size() | 获取Map中键值对的个数 |
boolean containsKey(K key) | 判断Map集合中是否包含 某一个键,包含-true;不包含-false |
boolean containsValue(V value) | 判断Map集合中是否 包含某一个值,包含-true;不包含-false |
实现类——HashMap
注意:如果自定类型的对象作为HashMap的键,为了保证元素不重复,则对象对应的类需覆盖 hashCode和equals方法。但是为了提高检索的效率,开发时通常使用String / Integer(例如String的用户名或是Integer的id)作为 HashMap的键
HashMap
JDK1.2版本,线程不安全,运行效率较快;允许null作键和值
LinkedHashMap
是HashMap的子类,按照元素添加的顺序操作集合元素
Hashtable
JDK1.0版本,线程安全,运行效率较慢,不允许null作为键和值
Properties
是Hashtable的子类,要求Key和Value是 String类型;
- 应用场景
加载配置文件时应用
TreeMap
是SortedMap的实现类,SortedMap是Map的子接口,对Map中的键根据内容完成排序
遍历方式
键遍历
通过 Map中的**keySet()**方法获取map集合中所有的键
// 获取 Map中所有的键
Set<K> ks = map.keySet();
// 通过 遍历 Set集合 ks获取每一个键
for(K key:ks){
// 通过每一个键获取对应的值
V value = map.get(key);
// 通过 key 和 value操作 键和值的内容
}
值遍历
通过Map中 **values()**方法获取Map集合中所有值
Collection<V> vs = map.values();// 获取Map中所有值
// 通过遍历 Collection 集合 vs 获取每一个值
for(V value:vs){
// 通过 value 操作集合中每一个值
}
// 注意:Map没有方法 通过 值 获取对应的键
键值对遍历
通过Map中的 entrySet() 方法获取Map中所有键值对
Set<Map.Entry<K,v>> kvs= map.entrySet();//获取所有键值对
// 通过 遍历 Set集合 kvs获取每一个键值对
for(Map.Entry<K,V> kv:kvs){
K key = kv.getKey();//获取键
V value = kv.getValue();// 获取值
// 通过 key 和 value操作 键和值
}
整理不易,喜欢请点个赞!
编者微信:1014961803,添加时请备注"CSDN"