Java集合框架

本文介绍了Java集合,包括单列集合接口Collection及其子接口List、Set,双列集合接口Map。详细阐述了List、Set、Map的实现类,如ArrayList、HashSet、HashMap等的特点、底层数据结构,还提及了TreeSet添加元素的要求及Map的迭代方式,附HashMap底层原理源码分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合:存储对象数据的集合数据。

Collection:单列集合的接口。它有两个子接口:① List(有序、可重复);② Set(无序、不可重复)

Map:双列集合的接口(以键值对形式存储,键不可重复,值可以重复)。

Collection接口中方法
add(E e)添加元素,成功返回true,否则返回false
addAll(Colletion c)将另一个集合c中的元素添加到该集合中
clear()清空集合中的内容
remove(Object o)删除指定元素,成功返回true,否则返回false
removeAll(Collection c)取两个集合的并集
retainAll(Collection c)取两个集合的交集
size()返回集合中的元素个数
contains(Object o)判断是否存在指定元素
containsAll(Collection c)判断是否存在指定集合中的全部元素
isEmptyt()判断集合是否为空
toArray()将集合转换成数组
iterator()返回一个迭代器,用于抓取集合中的元素
Iterator it = list.iterator; // 获取迭代器的时候,迭代器中的指针就已经指向了第一个元素
while(it.hsaNext()) { // 当前指针是否指向元素
    it.next(); // 获取当前指针指向的元素并返回,然后指针向下移动
}

List有三个实现类:ArrayList、LinkedList、Vector。

ArrayList和Vector底层都是使用了Object数组实现的,但ArrayList是线程不同步的,操作效率高;Vector则相反。LinkedList底层则是使用了双向链表数据结构实现的。

Set有两个实现类:HashSet和TreeSet

HashSet:底层是哈希表,特点是存取速度快。当往里面添加元素的时候,会先调用元素的hashCode方法获取哈希值,然后经过一系列的移位等运算,就可以得出该元素在哈希表中的存储位置。如果得出的位置没有任何元素存储,那么该元素可以直接存储到该位置;如果已经有其他元素了,那么会调用equals方法比较两个元素,当返回true时,那么该元素与该位置上的元素就视为重复,不允许添加;反之就添加。

TreeSet:底层是红黑树。添加的元素需要具备自然顺序的特性。如果要往TreeSet添加自定义对象时,自定义的类必须实现Comparable接口,重写compareTo方法:

class 自定义类 implements Comparable<T> {
    @Override
	public int compareTo(T o) {
		// 该方法返回0时,那么该元素就被视为重复元素,不允许添加
	}
}

或者在创建TreeSet时传入一个比较器参数:(优先使用)

class 比较器 implements Comparator {
    @Override
	public int compare(Object o1, Object o2) {
		// TODO Auto-generated method stub
		return 0;
	}
}

TreeSet set = new TreeSet(new 比较器());

Map接口有两个实现类:HashMap和TreeMap。

Map接口的常用方法
put(K key,V value)

添加键值对。如果集合中存在该键,返回键之前对应的值,且该值会被value覆盖;如果不存在则返回null

size()返回集合中键值对个数
isEmpty()判断集合是否为空
get(K key)根据键获取值
containsKey(K key)判断集合中是否存在指定的键
containsValue(V value)判断集合中是否存在指定的值
remove(K key)根据键删除该键值对,并返回值
clear()清空集合

迭代Map的两种方式:

// 方式1
Set<K> keys = map.keySet();// 将map集合中所有的键保存在一个set集合中返回
Iterator<K> it = keys.iterator();
while(it.hasNext()) {
    K key = it.next(); // 键
    V value = get(key); // 值
}
// 方式2
Set<Entry<K,V>> entrys = map.entrySet();
Iterator<Entry<K,V>> it = entrys.iterator();
while(it.hasNext()) {
    Entry<K,V> entry = it.next();
    K key = entry.getKey(); // 键
    V value entry.getValue(); // 值
}

附:Java中HashMap底层实现原理(JDK1.8)源码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值