特点
提供一种存储空间可变的存储类型,存储的数据容量可以随时发生改变
结构
1、Collection
概述
- 是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
创建方式
- 多态的方式
- 具体的实现类ArrayList
常用方法
- boolean add(E e)
添加元素 - boolean remove(Object o)
从集合中移除指定的元素 - void clear()
清空集合中的元素 - boolean contains(Object o)
判断集合中是否存在指定的元素 - boolean isEmpty()
判断集合是否为空 - int size()
集合的长度,也就是集合中元素的个数
遍历方式
- Iterator
迭代器,集合的专用遍历方式
常用的两个方法:next()、hasNext()
2、List
概述
- 有序集合(也称为序列)。用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
- 与Set集合不同,列表通常允许重复的元素
遍历方式
-
Iterator
迭代器,集合的专用遍历方式
常用的两个方法:next()、hasNext() -
for循环
特有方法
- void add(int index, E element)
在此集合中的指定位置插入指定的元素 - E remove(int index)
删除指定索引出的元素,返回被删除的元素 - E set(int index, E element)
修改指定索引处的元素,返回被修改的元素 - E get(int index)
返回指定索引处的元素
列表迭代器 ListIterator
特点:
- 通过List集合的ListIterator()方法得到,所以说它是List集合特有的迭代器
- 可以沿任意一个方向遍历列表,在迭代期间修改列表,并获取列表中迭代器的当前位置
常用方法
- E next():返回迭代中的下一个元素
- boolean hasNext():如果迭代具有更多元素,则返回true
- E previous():返回列表中的上一个元素
- boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
- void add(E e):将指定的元素插入列表
常用子类
ArrayList:底层数据结构是数组,查询快,增删慢
LinkedList:底层数据结构是链表,查询慢,增删快
LinkedList集合特有功能
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 在该列表尾部添加指定的元素 |
public E getFirst(E e) | 返回列表中的第一个元素 |
public E getLast(E e) | 返回列表中的最后一个元素 |
public E removeFirst(E e) | 从列表中删除并返回第一个元素 |
public E removeLast(E e) | 从列表中删除并返回最后一个元素 |
3、Set
特点
- 不包含重复元素的集合
- 没有带索引的方法,所以不能使用普通for循环遍历
- 可以用来去重
哈希值
定义:JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
Object类中有一个方法可以获取对象的哈希值
- public int hashCode():返回对象的哈希值
特点:
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
HashSet集合
特点:
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,即存储和取出的元素的顺序不一定一致
- 没有带索引的方法,不能使用普通for循环遍历,但可以用增强for循环
- 不包含重复元素
- 使用的时候需要在类中重写两个方法:hashCode()和equals(),可以使用ide自动生成。
LinkedHashSet集合
特点:
- 哈希表和链表实现的Set接口,具有可预测的迭代顺序
- 由链表保证元素有序,即存储和取出的元素的顺序一致
- 由哈希表保证元素唯一,没有重复的元素
TreeSet集合
特点:
- 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
- 没有带索引的方法,不能使用普通for循环遍历
- 不包含重复元素
排序:
- 自然排序接口:comparable
- 比较器排序接口:comparator
comparable:
- 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序;
- 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法;
- 重写方法时,一定要注意排序规则必须安装要求的主要条件和次要条件来写;
comparator:
- 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的;
- 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compareTo(To1,To2)方法;
- 重写方法时,一定要注意排序规则必须安装要求的主要条件和次要条件来写;
4、Map
概述
- Interface Map<K,V> 其中K为键的类型,V为值的类型;
- 将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值
功能概述
下表列出了Java中Map集合的基本功能:
功能 | 描述 |
---|---|
put(key, value) |
将 key-value 键值对映射添加到映射表中 |
get(key) |
根据给定的 key 检索并返回相应的 value。如果 key 不存在,则返回 null |
containsKey(key) |
检查映射表中是否包含给定 key |
containsValue(value) |
检查映射表中是否包含给定 value |
remove(key) |
从映射表中删除指定 key 及其对应的 value |
clear() |
从映射表中删除所有键值对 |
size() |
返回映射表中键值对的数量 |
isEmpty() |
检查映射表是否为空 |
HashMap
HashMap
是 Java 中常用的一种数据结构,是 Map 接口的一个实现类,用于存储键值对。其底层是使用数组加链表或红黑树实现的,具有快速查询、插入、删除等特点,适合存储大量的键值对,因此在 Java 中被广泛应用。
在 HashMap
中,每个键值对被封装成一个 Entry
对象,并通过一个 hash()
方法计算键值的哈希码,将其映射到数组中的某个位置上。如果多个键值的哈希码相同,则它们会被放入同一个桶(数组的一个位置),并以链表或红黑树的形式进行存储。
HashMap
的主要特点包括:
-
HashMap
中的键和值都可以为 null。 -
HashMap
非线程安全,不支持多线程同时操作。 - 默认加载因子为 0.75,当 HashMap 中的存储数据量达到总容量的 75% 时,HashMap 会自动扩容。
- 在 Java 8 中,当链表中的元素个数大于等于 8 个时,会将链表转化为红黑树,以提升查询速度。当红黑树的元素数量小于等于 6 个时,会将树形结构再次转化为链表。
HashMap
的常用方法主要包括:
-
put(key, value)
:将指定的键值对存储到 HashMap 中,并返回旧的值(如果存在)。 -
get(key)
:根据键值获取相应的值,如果不存在则返回 null。 -
remove(key)
:根据键值删除对应的键值对,并返回被删除的值(如果存在)。 -
containsKey(key)
:判断是否包含指定的键值。 -
keySet()
:返回 HashMap 中所有键的 Set 集合。 -
values()
:返回 HashMap 中所有值的 Collection 集合。
需要注意的是,在使用 HashMap 存储自定义类型的键值对时,一定要重写该类型的 equals() 和 hashCode() 方法,以保证在计算哈希码时能够正确识别相同的对象。
总之,HashMap
是 Java 中非常常用的一种数据结构,具有快速查询、插入、删除等特点,适用于存储大量的键值对,但需要注意线程安全和哈希碰撞等问题。
HashMap样例:ArrayList嵌套HashMap
import java.util.ArrayList;
import java.util.HashMap;
public class ArrayListExample {
public static void main(String[] args) {
// 创建 List 集合,用于存储三个 HashMap
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
// 创建三个 HashMap,分别存储键值对
HashMap<String, String> map1 = new HashMap<String, String>();
map1.put("name", "Alice");
map1.put("age", "20");
HashMap<String, String> map2 = new HashMap<String, String>();
map2.put("name", "Bob");
map2.put("age", "25");
HashMap<String, String> map3 = new HashMap<String, String>();
map3.put("name", "Charlie");
map3.put("age", "30");
// 将三个 HashMap 添加到 List 集合中
list.add(map1);
list.add(map2);
list.add(map3);
// 遍历 List 集合,输出每个 HashMap 中的键值对
for (HashMap<String, String> map : list) {
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
}
}
}
这段代码创建了一个 ArrayList
集合,用于存储三个 HashMap
,每个 HashMap
都以 String
类型作为键和值。将三个 HashMap
分别添加到 ArrayList
中,并遍历 ArrayList
和每个 HashMap
,输出其中的键值对。
运行结果如下所示:文章来源:https://www.toymoban.com/news/detail-484077.html
name : Alice
age : 20
name : Bob
age : 25
name : Charlie
age : 30
注释已经写得比较清楚了,这里再简要介绍一下代码的实现:
- 创建一个
ArrayList
集合来存储三个HashMap
。 - 创建三个
HashMap
,分别存储"name"
和"age"
两个键值对。 - 将每个
HashMap
添加到ArrayList
集合中。 - 使用增强型
for
循环遍历ArrayList
,并用keySet()
方法遍历每个HashMap
中的所有键,并输出对应的键值对。
HashMap样例:HashMap嵌套ArrayList
import java.util.ArrayList;
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// 创建 HashMap 集合,用于存储三个键值对元素
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
// 创建三个 ArrayList,分别存储字符串元素
ArrayList<String> list1 = new ArrayList<String>();
list1.add("apple");
list1.add("banana");
list1.add("orange");
ArrayList<String> list2 = new ArrayList<String>();
list2.add("cat");
list2.add("dog");
list2.add("fish");
ArrayList<String> list3 = new ArrayList<String>();
list3.add("blue");
list3.add("red");
list3.add("green");
// 将三个 ArrayList 添加到 HashMap 中,对应的键分别为 "fruits"、"animals"、"colors"
map.put("fruits", list1);
map.put("animals", list2);
map.put("colors", list3);
// 遍历 HashMap 集合,输出每个键值对元素的键和值
for (String key : map.keySet()) {
System.out.print(key + " : ");
ArrayList<String> list = map.get(key);
for (String s : list) {
System.out.print(s + " ");
}
System.out.println();
}
}
}
这段代码创建了一个 HashMap
集合,用于存储三个键值对元素,其中每个键都是一个字符串类型的键,对应的值是一个 ArrayList
,其中每个元素都是字符串类型。将三个 ArrayList
分别添加到 HashMap
中,并遍历 HashMap
,输出每个键值对元素的键和值。
运行结果如下所示:
fruits : apple banana orange
animals : cat dog fish
colors : blue red green
注释已经写得比较清楚了,这里再简要介绍一下代码的实现:文章来源地址https://www.toymoban.com/news/detail-484077.html
- 创建了一个
HashMap
集合,用于存储三个键值对元素,其中每个键都是一个字符串类型的键,对应的值是一个ArrayList
,其中每个元素都是字符串类型。 - 创建了三个
ArrayList
,分别存储不同类型的字符串元素。 - 将每个
ArrayList
添加到HashMap
中,并对应不同的键。 - 使用增强型
for
循环遍历HashMap
,输出每个键值对元素的键和值。在遍历时,首先输出键,然后使用get()
方法获取对应的值,最后遍历该值中的所有元素并输出。
到了这里,关于【Java学习记录-8】集合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!