Java容器及其常用方法汇总

简介: Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。

1 概述

Java Collections 框架中包含了大量的接口及其实现类和操作它们的算法,主要包括列表(List)、集合(Set)、映射(Map),如下:

接口 实现类 数据结构 初始容量 加载因子 扩容 线程安全 允许 key = null
List ArrayList 数组 10 1.5倍+1
LinkedList 双向链表
Vector 数组 10 2倍
Set HashSet hash 表 16 0.75 2倍
TreeSet 红黑树
Map HashMap 数组+链表+红黑树 16 0.75 2倍
Hashtable 数组+链表+红黑树 11 2倍+1
ConcurrentHashMap Node数组+链表+红黑树
TreeMap 红黑树
  • List

(按插入顺序保存对象,允许元素重复)

(1)ArrayList:数组实现,默认大小为10,扩充1.5倍(向下取整)+1,不够时采用需求值(如需初始为10,需求容量为17,扩容1.5倍+1为16,仍不够,此时将容量设置为17)

(2)LinkedList:双向链表实现

(3)Vector:数组实现,默认大小为10,扩充2倍,线程安全的

  • Set

(不允许元素重复)

(1)HashSet: hash表实现,默认大小为16,2倍扩充。

(2)TreeSet: 红黑树实现。

  • Map

(存储“键—值”对,键具有唯一性)

(1)HashMap:数组+链表+红黑树实现,hash数组默认大小16,若给定初值,会自动扩充至最近的2的幂次方大小(如指定初值为20,则自动扩充至32),扩充:2倍,允许一条记录key=null

(2)Hashtable:数组+链表+红黑树实现,hash数组默认大小11,若指定初值,会直接使用这个值,扩充:2*old+1,线程安全的,继承自Dictionary类

(3)ConcurrentHashMap:Node数组+链表+红黑树实现,线程安全的(jdk1.8以前Segment锁,1.8以后CAS锁)

(4)TreeMap:红黑树实现

注:HashMap中,当链表长度大于阈值(默认为8)时,才将链表转换为红黑树;HashTable中没有这个限制。

Collection框架

注意:上图是一个简图,部分抽象类和继承关系省略了。

Map框架

注意:上图是一个简图,部分抽象类和继承关系省略了。

2 容器常用方法

java容器存在于 java.util.* 中。

2.1 List

java

代码解读

复制代码

//增删改查方法
public void add(Object element) //增添元素
public void add(int index,Object element) //在指定位置增添元素
public boolean remove(Object o) //删除指定对象
public Object remove(int index) //删除指定位置的元素
public Object set(int index,Object element) //修改指定位置元素的值
public Object get(int index) //获取指定位置元素
public int indexOf(Object o) //获取指定元素的位置
public boolean contains(Object o) //判断指定元素是否存在

//其他常用方法
public int size() //获取容器中元素个数
public Iterator<E> iterator() //获取迭代器
public void clear() //清空元素

ArrayList适合快速查找元素,LinkedList适合频繁地对列表进行增加或删除元素操作,因此LinkedList类可用于实现堆栈和队列,对此LinkedList类中定义了特定的方法,如下:

java

代码解读

复制代码

//模拟栈和队列操作
public void addFirst(Object o) //在链表头增添元素
public void addLast(Object o) //在链表尾增添元素
public Object removeFirst() //删除链表头元素,并返回该元素
public Object removeLast() //删除链表尾元素,并返回该元素
public boolean isEmpty() //判断链表是否为空

public void push(E e) //等价于addFirst()
public E pop() //等价于removeFirst()
public E getFirst() //获取链表首元素
public E getLast() //获取链表尾元素

2.2 Set

java

代码解读

复制代码

//增删查方法
public void add(Object element) //增添元素
public boolean remove(object element) //删除元素
public boolean contains(Object o) //判断元素是否存在

//其他常用方法
public int size() //获取容器中元素个数
public boolean isEmpty() //判断集合是否为空
public Iterator<E> iterator() //获取迭代器
public void clear() //清空元素

2.3 Map

java

代码解读

复制代码

//增删查
public Object put(Object key,Object value) //增添元素
public Object remove(Object key) //删除元素,并返回键对应的值
public Object get(Object key) //获取键对应的值
public boolean containsKey(Object key) //判断指定键是否存在
public boolean containsValue(Object value) //判断指定值是否存在

//获取键、值、元素集合
public Collection values() //获取值集合
public Set KeySet() //获取键集合
public Set entrySet() //获取元素集合

//其他方法
public int size() //获取容器中元素个数
public boolean isEmpty() //判断容器是否为空
public void clear() //清空元素

Map 接口没有提供 iterator() 方法,其子接口 Entry 提供了 iterator() 方法,并且提供了获取键、值的方法,如下:

java

代码解读

复制代码

//Map.Entry接口主要方法
public Iterator<E> iterator() //获取迭代器
public Object getKey() //获取键
public Object getValue() //获取值

//调用案例
Iterator(Entry) iter=map.entrySet().iterator();
while(iter.hasNext()){
    Entry entry=iter.next();
    int key=(Integer)entry.getKey();
    int val=(Integer)entry.getValue();
}

3 其他容器常用方法

3.1 Arrays

java

代码解读

复制代码

public static int binarySearch(Object[] a, Object key) //二分查找(a已排序)
public static boolean equals(Object[] a, Object[] a2) //判断两数组是否完全一致
public static void fill(Object[] a, Object val) //在a中所有位置填充val
public static void fill(Object[] a, int fromIndex, int toIndex, Object val) //在[fromIndex,toIndex)中填充元素val
public static String toString(Object[] a) //将数组a转换为字符串,如"[1, 2, 3]"
public static void sort(Object[] a) //改进的快速排序(升序)
public static void sort(Object[] a, int fromIndex, int toIndex) //对[fromIndex,toIndex)中的元素排序(升序)
public static <T> void sort(T[] a, Comparator<? super T> c) //自定义比较器排序

排序案例:升序排序直接调用 sort() ,降序排序需要实现**比较器(Comparator )**接口

java

代码解读

复制代码

import java.util.Arrays;
import java.util.Comparator;

public class Sort{
	static Integer[] a= {5,8,4,2,9,3,1,6,7};
	static String[] s= {"Tom","John","Marry","Katty","Jerry"};

	public static void main(String[] args) {
		Arrays.sort(a); //1 2 3 4 5 6 7 8 9 
		Arrays.sort(s); //Jerry John Katty Marry Tom 

		Arrays.sort(a,new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {
				return o2-o1;
			}				
		}); //9 8 7 6 5 4 3 2 1 

		Arrays.sort(s,new Comparator<String>() {
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}			
		}); //Tom Marry Katty John Jerry 
	}
}

3.2 Collections

3.2.1 Collections 类对 Collection 对象提供的方法

java

代码解读

复制代码

public static Object max(Collection coll) //获取最大值
public static Object min(Collection coll) //获取最小值

3.2.2 Collections 类对List对象提供的方法

java

代码解读

复制代码

public static int binarySearch(List list, Object key) //查找元素
public static void copy(List dest, List src) //将src复制给dest
public static void fill(List list, Object obj) //在list中填充obj
public static void reverse(List list) //列表元素倒置
public static void sort(List list) //升序排序
public static <T> void sort(List<T> list, Comparator<? super T> c) //自定义比较器排序

排序案例:升序排序直接调用 sort() ,降序排序需要实现**比较器(Comparator )**接口

java

代码解读

复制代码

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Sort{
	static int[] a= {5,8,4,2,9,3,1,6,7};
	static String[] s= {"Tom","John","Marry","Katty","Jerry"};
	static List list1=new ArrayList<Integer>();
	static List list2=new ArrayList<String>();
	
	public static void main(String[] args) {
		for(int i=0;i<a.length;i++) {
			list1.add(a[i]);
		}
		for(int i=0;i<s.length;i++) {
			list2.add(s[i]);
		}
		
		Collections.sort(list1); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
		Collections.sort(list2); //[Jerry, John, Katty, Marry, Tom]
		
		Collections.sort(list1,new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {
				return o2-o1;
			}		
		}); //[9, 8, 7, 6, 5, 4, 3, 2, 1]
		
		Collections.sort(list2,new Comparator<String>() {
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}			
		}); //[Tom, Marry, Katty, John, Jerry]
	}
}

3.2.3 Collections 类提供的集合同步处理方法

java

代码解读

复制代码

public static Collection synchronizedCollection(Collection c) //Collection对象同步
public static List  synchronizedList(List list) //List对象同步
public static Set  synchronizedSet(Set s) //Set对象同步
public static Map  synchronizedMap(Map m) //Map对象同步

案例:

java

代码解读

复制代码

List list=Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
	Iterator<E> iter=list.iterator();
	while(iter.hasNext()) {
		foo(iter.next());
	}
}


转载来源:https://juejin.cn/post/7206998548344242236

相关文章
|
8天前
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
84 30
|
13天前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
43 25
|
2月前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
7天前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
18 1
|
21天前
|
运维 Java 程序员
Java中的异常处理方法
本文深入剖析Java异常处理机制,介绍可检查异常、运行时异常和错误的区别与处理方式。通过最佳实践方法,如使用合适的异常类型、声明精确异常、try-with-resources语句块、记录异常信息等,帮助开发者提高代码的可靠性、可读性和可维护性。良好的异常处理能保证程序稳定运行,避免资源泄漏和潜在问题。
|
21天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
|
1月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
181 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
1月前
|
Java API
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
2月前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
2月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
105 9

热门文章

最新文章