zl程序教程

您现在的位置是:首页 >  后端

当前栏目

憋了许久,终究还是对Java集合下手了!最全List、Set、Map集合讲解,内含集合导图

JAVAListsetMap集合 讲解 还是 最全
2023-09-11 14:22:06 时间

导图

Java集合导图

概念

  • 集合一种操作比较便利的对象容器,可以用于存储多个对象(工具)
  • 位置
    位于 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

  1. ArrayList
    底层用数组实现,查询效率较高,增(插入)删效率较慢
    JDK1.2版本,线程不安全,执行效率较高

注意:
创建ArrayList对象时,底层数组并没有完成初始化,长度为0,当第一次调用add方法时,代表实际意义使用ArrayList集合存储对象,底层数组才初始化,空间默认长度为10,当存储对象达 到数组上限,自动完成扩容,每一次扩容倍数为 1.5倍(如果出现小 数区取整数位的长度)

  • 开发应用现象
    项目应用集合时,居多操作为add(元素)方 法,此方法采用的末尾添加方式,不会影响存储效率,删除数据,实 际开发时,从数据库中删除数据
  1. Vector
    底层数组实现,查询效率较高,增(插入)删效率 较慢
    JDK1.0版本,线程安全,效率较低
  2. LinkedList
    底层用链表实现,查询效率比较低,增(插 入)删效率较高
    线程不安全,运行效率较高

List集合遍历方式

下标遍历
  • 用循环变量控制集合下标
for(int i=0;i<集合名.size();i++){
	// 通过下标获取每一个集合元素get
	Object o = list.get(i);
	// 通过 o 变量对集合元素进行操作
}
forEach遍历
for(数据类型 变量名:集合名){
	// 直接通过变量名操作集合元素
}
// 注意:()中数据类型取决于集合中元素类型(泛型)
迭代器(Iterator)遍历

是 forEach底层实现原理

  1. 获取迭代器对象
    Iterator<集合元素数据类型> it = list.iterator();

    注意:首次获迭代器会在所有元素的最左端产生一个指针(游标)

  2. 常用的方法
    boolean hasNext()
    判断迭代中游标右侧还有没有数据,有-true;没有-false
    操作 hasNext()方法不会导致游标的移动
    K next()
    获取迭代器中写一个元素
    为了防止出现异常java.util.NoSuchElementException(没有可取元素异常),在调用next方法之前,需要利用hashNext方法有没有可取元素进行判断

  3. 遍历

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中的现有方法实现对集合元素进行排序

  1. Collections.sort( 集合名);
    如果参与排序的集合中存储的是自定义类型的对象,则对象对应类需要实现java.lang.Comparable接口,同时实现接口中**compareTo(T t)**方法指定排序规则 —> 内置比较器
  2. 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中存储,为了保证元素内容不重复,需要做到以下两点:

  1. 覆盖hashCode方法
    1.1 必须保证内容相同的对象返回值相同的哈希码值,为了提高效率,尽可能做到内容不同的对象返回不同哈希码值
    1.2 覆盖原则:将所有的属性拼凑为int类型的结果作为返回值返回
  2. 覆盖 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

TreeSetSortedSet接口的实现类,SortedSet是Set的子接口,可以对集合中元素按照内容进行排序

注意
如果TreeSet集合中存储的是自定义类型的对象,则对象对应的类需要实现java.lang.Comparable接口,同时实现compareTo方法;
TreeSet保证元素不重复,取决compareTo方法的返回值,返回值为0,代表内容相同的元 素,直接拒绝添加到TreeSet集合中

Map集合体系

特点

MapMap集合体系的根接口

  1. 键值对存储(key-value),一个键值对应Map集合中一个元素
  2. :无序、无下标、元素不允许重复(唯一)
  3. :无序、无下标、元素允许重复

常用方法

方法名功能
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的键,为了保证元素不重复,则对象对应的类需覆盖 hashCodeequals方法。但是为了提高检索的效率,开发时通常使用String / Integer(例如String的用户名或是Integer的id)作为 HashMap的键

HashMap

JDK1.2版本,线程不安全,运行效率较快;允许null作键和值

LinkedHashMap

是HashMap的子类,按照元素添加的顺序操作集合元素

Hashtable

JDK1.0版本,线程安全,运行效率较慢,不允许null作为键和值

Properties

是Hashtable的子类,要求KeyValue是 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"