一篇文章带你入门java集合
目录
- 一、简介
- 1、java集合框架图
- 2、集合框架体系
- 3、Set和List的区别
- 二、ArrayList
- 1、定义
- 2、用实例了解ArrayList
- 三、LinkedList
- 1、语法
- 2、示例
- 四、HashSet
- 1、定义
- 2、语法
- 3、示例
- 五、HashMap
- 1、定义
- 2、语法
- 3、示例
- Java HashMap 方法
- 六、Iterator(迭代器)
- 1、定义
- 2、示例
- 七、List和数组互转
- 总结
一、简介
1、java集合框架图
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
- 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
- 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
2、集合框架体系
3、Set和List的区别
1)Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素
2)Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素
3)List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>
二、ArrayList
1、定义
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.ArrayList; // 引入 ArrayList 类 ArrayList<E> objectName =new ArrayList<>(); // 初始化
2、用实例了解ArrayList
@Test public void listTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); //访问 System.out.println("list新增完元素访问:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); //用set方法修改 list.set(2, 10); //访问 System.out.println("list修改完元素访问:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); list.remove(2); //访问 System.out.println("list删除完元素访问:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); //当前list大小 System.out.println("list当前数据元素个数:"+list.size()); //排序 Collections.sort(list);//默认升序 //访问 System.out.println("list排序完元素访问:"); for(int s : list){ System.out.print(s+" "); } System.out.println(); }
结果:
list新增完元素访问:
1 9 8 4 5 3
list修改完元素访问:
1 9 10 4 5 3
list删除完元素访问:
1 9 4 5 3
list当前数据元素个数:5
list排序完元素访问:
1 3 4 5 9
Java ArrayList 常用方法列表如下:
方法 | 描述 |
---|---|
add() | 将元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 删除 arraylist 中的所有元素 |
clone() | 复制一份 arraylist |
contains() | 判断元素是否在 arraylist |
get() | 通过索引值获取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
remove() | 删除 arraylist 里的单个元素 |
size() | 返回 arraylist 里元素数量 |
isEmpty() | 判断 arraylist 是否为空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替换 arraylist 中指定索引的元素 |
sort() | 对 arraylist 元素进行排序 |
toArray() | 将 arraylist 转换为数组 |
toString() | 将 arraylist 转换为字符串 |
ensureCapacity() | 设置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
removeIf() | 删除所有满足特定条件的 arraylist 元素 |
forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
三、LinkedList
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。
以下情况使用 ArrayList :
频繁访问列表中的某一个元素。只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
你需要通过循环迭代来访问列表中的某些元素。需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
1、语法
// 引入 LinkedList 类 import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通创建方法 或者 LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
2、示例
@Test public void linkListTest(){ LinkedList<Integer> nums = new LinkedList<Integer>(); //添加 nums.add(3); nums.add(5); nums.add(1); nums.add(8); System.out.println(nums); // 使用 addFirst() 在头部添加元素 nums.addFirst(0); System.out.println(nums); nums.addLast(20); System.out.println(nums); //移除首位 nums.removeFirst(); System.out.println(nums); // 使用 getFirst() 获取头部元素 System.out.println(nums.getFirst()); //for循环迭代 for (int size = nums.size(), i = 0; i < size; i++) { System.out.println(nums.get(i)); } }
结果:
[3, 5, 1, 8]
[0, 3, 5, 1, 8]
[0, 3, 5, 1, 8, 20]
[3, 5, 1, 8, 20]
3
3
5
1
8
20
方法 | 描述 |
---|---|
public boolean add(E e) | 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection c) | 将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。 |
public boolean addAll(int index, Collection c) | 将一个集合的所有元素添加到链表的指定位置后面,返回是否成功,成功为 true,失败为 false。 |
public void addFirst(E e) | 元素添加到头部。 |
public void addLast(E e) | 元素添加到尾部。 |
public boolean offer(E e) | 向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。 |
public boolean offerFirst(E e) | 头部插入元素,返回是否成功,成功为 true,失败为 false。 |
public boolean offerLast(E e) | 尾部插入元素,返回是否成功,成功为 true,失败为 false。 |
public void clear() | 清空链表。 |
public E removeFirst() | 删除并返回第一个元素。 |
public E removeLast() | 删除并返回最后一个元素。 |
public boolean remove(Object o) | 删除某一元素,返回是否成功,成功为 true,失败为 false。 |
public E remove(int index) | 删除指定位置的元素。 |
public E poll() | 删除并返回第一个元素。 |
public E remove() | 删除并返回第一个元素。 |
public boolean contains(Object o) | 判断是否含有某一元素。 |
public E get(int index) | 返回指定位置的元素。 |
public E getFirst() | 返回第一个元素。 |
public E getLast() | 返回最后一个元素。 |
public int indexOf(Object o) | 查找指定元素从前往后第一次出现的索引。 |
public int lastIndexOf(Object o) | 查找指定元素最后一次出现的索引。 |
public E peek() | 返回第一个元素。 |
public E element() | 返回第一个元素。 |
public E peekFirst() | 返回头部元素。 |
public E peekLast() | 返回尾部元素。 |
public E set(int index, E element) | 设置指定位置的元素。 |
public Object clone() | 克隆该列表。 |
public Iterator descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回链表元素个数。 |
public ListIterator listIterator(int index) | 返回从指定位置开始到末尾的迭代器。 |
public Object[] toArray() | 返回一个由链表元素组成的数组。 |
public T[] toArray(T[] a) | 返回一个由链表元素转换类型而成的数组。 |
四、HashSet
1、定义
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
HashSet 实现了 Set 接口。
2、语法
import java.util.HashSet; // 引入 HashSet 类 HashSet<String> sites = new HashSet<String>();
3、示例
@Test public void setTest(){ Set<Integer> nums = new HashSet<Integer>(); //添加 nums.add(3); nums.add(5); nums.add(5); nums.add(5); nums.add(1); nums.add(8); System.out.println(nums); //判断元素是否存在 System.out.println(nums.contains(8)); nums.remove(1); // 删除元素,删除成功返回 true,否则为 false System.out.println(nums); //计算大小 System.out.println(nums.size()); for (int i : nums) {//访问 System.out.println(i); } //清除 nums.clear(); System.out.println(nums); }
结果:
[1, 3, 5, 8]
true
[3, 5, 8]
3
3
5
8
[]
五、HashMap
1、定义
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
HashMap 是无序的,即不会记录插入的顺序。
HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。
2、语法
import java.util.HashMap; // 引入 HashMap 类 HashMap<Integer, String> Sites = new HashMap<Integer, String>();
3、示例
@Test public void mapTest(){ // 创建 HashMap 对象 Sites HashMap<String, String> sites = new HashMap<String, String>(); // 添加键值对 sites.put("one", "Google"); sites.put("two", "Runoob"); sites.put("three", "Taobao"); sites.put("four", "Zhihu"); System.out.println(sites); //访问-根据key System.out.println(sites.get("four")); //删除 sites.remove("four"); System.out.println(sites); //计算大小 System.out.println(sites.size()); // 输出 key 和 value for (String i : sites.keySet()) { System.out.println("key: " + i + " value: " + sites.get(i)); } // 返回所有 value 值 for(String value: sites.values()) { // 输出每一个value System.out.print(value + ", "); } }
结果:
{four=Zhihu, one=Google, two=Runoob, three=Taobao}
Zhihu
{one=Google, two=Runoob, three=Taobao}
3
key: one value: Google
key: two value: Runoob
key: three value: Taobao
Google, Runoob, Taobao,
Java HashMap 方法
hashmap
Java HashMap 常用方法列表如下:
方法 | 描述 |
---|---|
clear() | 删除 hashMap 中的所有键/值对 |
clone() | 复制一份 hashMap |
isEmpty() | 判断 hashMap 是否为空 |
size() | 计算 hashMap 中键/值对的数量 |
put() | 将键/值对添加到 hashMap 中 |
putAll() | 将所有键/值对添加到 hashMap 中 |
putIfAbsent() | 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。 |
remove() | 删除 hashMap 中指定键 key 的映射关系 |
containsKey() | 检查 hashMap 中是否存在指定的 key 对应的映射关系。 |
containsValue() | 检查 hashMap 中是否存在指定的 value 对应的映射关系。 |
replace() | 替换 hashMap 中是指定的 key 对应的 value。 |
replaceAll() | 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。 |
get() | 获取指定 key 对应对 value |
getOrDefault() | 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值 |
forEach() | 对 hashMap 中的每个映射执行指定的操作。 |
entrySet() | 返回 hashMap 中所有映射项的集合集合视图。 |
keySet() | 返回 hashMap 中所有 key 组成的集合视图。 |
values() | 返回 hashMap 中存在的所有 value 值。 |
merge() | 添加键值对到 hashMap 中 |
compute() | 对 hashMap 中指定 key 的值进行重新计算 |
computeIfAbsent() | 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中 |
computeIfPresent() | 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。 |
六、Iterator(迭代器)
1、定义
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
2、示例
@Test public void iteratorTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); Iterator<Integer> it = list.iterator(); while(it.hasNext()){ int i = it.next(); System.out.print(i+" "); } }
结果:
1 9 8 4 5 3
七、List和数组互转
@Test public void arrToListTest(){ List<Integer> list = new ArrayList<Integer>(); //增加元素 list.add(1); list.add(9); list.add(8); list.add(4); list.add(5); list.add(3); Object[] arr = list.toArray(); for(Object o : arr){ System.out.print(o+" "); } System.out.println(); List<Object> ll = Arrays.asList(arr); System.out.println(ll); }
结果:
1 9 8 4 5 3
[1, 9, 8, 4, 5, 3]
总结
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!