JavaSE系列-04 集合

本文深入讲解Java集合框架,包括Collection、List、Set、Map、Queue等接口和其实现类的特性与使用方法,如ArrayList、LinkedList、HashSet、HashMap、PriorityQueue等。探讨了泛型、迭代器、equals和hashCode方法的正确实现,以及最佳实践如使用Iterator和Collections工具类。

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


java.util提供了集合类,包括
Collection:根接口
List:有序列表
Set:无重复元素集合
Map:通过Key查找Value的映射表
Java集合支持泛型,通过迭代器(Iterator)访问集合

Java集合设计的特点:
	1)接口和实现相分离
	2)支持泛型
	3)访问集合有统一的方法(Iterator)
JDK的部分集合类时遗留类,不应该继续使用
	1)Hashtable:一种线程安全的Map实现
	2)Vector:一种线程安全的List实现
	3)Stack:基于Vector实现的LIFO的栈
	4)Enumeration\<E>:已被Iterator\<E>取代

List

使用List

List是一种有序列表,通过索引访问元素
	1)void add(E e):在末尾添加一个元素
	2)void add(int index, E e):在指定索引位置添加一个元素
	3)int remove(int index):删除指定索引位置的元素
	4)int remove(Object e):删除某个元素
	5)E get(int index):获取指定索引的元素
	6)int size():获取链表大小(包含元素的个数)

List有ArrayList和LinkedList两种实现

ArrayList LinkedList
获取指定元素 速度很快 需要从头开始查找元素
添加元素到末尾 速度很快 速度很快
在指定位置添加/删除 需要移动元素 不要移动元素
内存占用 较大
List中的元素可以重复,元素也可以是null
遍历List使用Iterator或者foreach循环

把List转换为Array的方法
1)Object[] toArray()
2) T[] toArray(T[] a)

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Integer[] array = list.toArray(new Integer[2]);
// {1, 2, 3}
Integer[] array = list.toArray(new Integer[5]);
// {1, 2, 3, null, null}
// 推荐===> Integer[] array = list.toArray(new Integer[list.size()]);

把Array转换为List的方法
1) List Arrays.asList(T… a)

Integer[] array = {
   
   1, 2, 3};
List<Integer> list = Arrays.asList(array);
// 注意返回的list并不是ArrayList
// list.add(4); // UnsupportedOperatationException
List<Integer> arrayList = new ArrayList<>();  // ^_^
arrayList.addAll(list);  // ^_^

编写equals方法

List是一种有序链表,List内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置

判断元素是否存在或者查找元素索引:
	1)boolean contains(Object o):是否包含某个元素
	2)int indexOf(Object o):查找某个元素的索引,不存在返回-1

要正确调用contains、indexOf方法,放入的实例要正确实现equals(),因为这两个方法底层是用equals比较实现的

equals()编写方法:
	1)判断 this == o
	2)判断 o instanceof Person
	3)强制转型,并比较每个对应的字段
		基本类型字段用 == 直接比较
		引用类型字段借助Objects.equals()判断
public class Person {
   
   
	private String name;

	private int age;

	public Person(String name, int age) {
   
   
		this.name = name;
		this.age = age;
	}

	public String getName() {
   
   
		return name;
	}

	public void setName(String name) {
   
   
		this.name = name;
	}

	public int getAge() {
   
   
		return age;
	}

	public void setAge(int age) {
   
   
		this.age = age;
	}

	@Override
	public String toString() {
   
   
		return "Person [name=" + name + ", age=" + age + "]";
	}

	public boolean equals(Object o) {
   
   
		if (this == o) {
   
   
			return true;
		}
		if (o instanceof Person) {
   
   
			Person p = (Person) o;
			// return (p.name==this.name || p.name!=null &&
			// p.name.equals(this.name)) && p.age==this.age;
			return Objects.equals(p.name, this.name) && p.age == this.age;
		}
		return false;
	}
}
public class Main {
   
   
	public static void main(String[] args) 
掌握集合的概念、体系结构、分类及使用场景 2)了解Set接口及主要实现类(HashSet、TreeSet) 3)了解List接口及主要实现类(ArrayList、LinkedList、Vector) 4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名:张三 身份证号:178880001 姓名:王五 身份证号:178880002 姓名:李四 身份证号:178880003 姓名:王五 身份证号:178880002 姓名:李四 身份证号:178880004 注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:name:Person对象的姓名,id:Person对象的身份证号) 主方法中作如下测试: 1)创建一个可放置Person类对象的HashSet; 2)依次添加上述5个对象到HashSet中; 3)把集合中的元素打印出来(使用迭代器Iterator) 2、编写程序练习List集合的基本使用: 1) 创建一个只能容纳String对象名为names的ArrayList集合; 2)按顺序往集合中添加5个字符串对象:"张三"、"李四"、"王五"、"马六"、"赵七"; 3)对集合进行遍历,分别打印集合中的每个元素的位置与内容; 4)打印集合的大小,然后删除集合中的第3个元素,并显示删除元素的内容,然后再打印目前集合中第3个元素的内容,并再次打印集合的大小。 3、编写程序练习Map集合的基本使用: 1)创建一个只能容纳String对象的person的HashMap集合; 2)往集合中添加5个"键-值"对象: "id"-"1"; "name"-"张三"; "sex"-"男"; "age"-"25"; "hobby"-"爱学Java" 3)对集合进行遍历,分别打印集合中的每个元素的键与值; 4)打印集合的大小,然后删除集合中的键为age的元素,并显示删除元素的内容,并再次打印集合的大小。 四、思考题 1、集合中的ListSetMap有哪些不同? 2、为什么使用集合框架,而尽可能少用数组作为存储结构? 3、如何使用TreeSet实现第一题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值