JAVA 集合深入浅出

本文深入讲解了Java集合框架的基本概念,包括Set、List和Map的主要特点及其常用实现类,如ArrayList、LinkedList、HashSet等,并探讨了如何重写equals()和hashCode()方法确保正确的行为。

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

概念:
集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集 合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和 map(映射)。

java集合容器结构:
这里写图片描述
对象的存储:
①数组(基本数据类型 & 引用数据类型)
②集合(引用数据类型)

数组存储数据的弊端:长度一旦初始化以后,就不可变;
真正给数组元素赋值的个数没有现成的方法可用;

2.集合框架
Collection接口 :方法:

  1. ①add(Object obj),addAll(Collection)
  2. ②remove(Object obj),removeAll(Collection coll),
    retainAll(Collection coll),equals(Object obj),contains(Object obj) containsAll(Collection coll),hashCode()
    ③ iterator(),toArray();

List接口:存储有序的,可以重复的元素.

新增的方法:删除remove(int index)
修改set(int index,Object obj)
获取get(int index)
插入add(int index,Object obj) 添加

进List集合中的元素(或对象)所在的类一定要重写equals()方法

1、 ArrayList(主要的实现类) LinkedList(更适用于频繁的插入、删除操作)
2、Vector(古老的实现类、线程安全的,但效率要低于ArrayList)
3、Set接口:存储无序的,不可重复的元素。—相当于高中的“集合”概念 Set使用的方法基本上都是Collection接口下定义的。
4、添加进Set集合中的元素所在的类一定要重写equals() 和 hashCode()。 要求重写equals() 和 hashCode()方法保持一致。

1、无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。

HashSet(主要的实现类)

LinkedHashSet(是HashSet的子类,当我们遍历集合元素时,是按照添加进去的顺序实现的;频繁的遍历,较少的添加、插入操作建议选择此)
TreeSet(可以按照添加进集合中的元素的指定属性进行排序)要求TreeSet添加进的元素必须是同一个类的!两种排序方式:
一、自然排序:

①要求添加进TreeSet中的元素所在的类implements Comparable接口
②重写compareTo(Object obj),在此方法内指明按照元素的哪个属性进行排
③向TreeSet中添加元素即可。若不实现此接口,会报运行时异常;

二、定制排序:

①创建一个实现Comparator接口的实现类的对象。在实现类中重写Comparator的compare(Object o1,Object o2)方法
②在此compare()方法中指明按照元素所在类的哪个属性进行排序
③将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
④向TreeSet中添加元素即可。若不实现此接口,会报运行时异常要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致。

Map接口:存储“键-值”对的数据

key是不可重复的,使用Set存放。value可以重复的,使用Collection来存放的。一个key-value对构成一个entry(Map.Entry),entry使用Set来存放。

1、添加、修改 put(Object key,Object value)
2、删除remove(Object key)
3、获取get(Object key) size() / keySet() values() entrySet()

  • HashMap:主要的实现类,可以添加null键,null值
  • LinkedHashMap:是HashMap的子类,可以按照添加进Map的顺序实现遍历
  • TreeMap:需要按照key所在类的指定属性进行排序。要求key是同一个类的对象。对key考虑使用自然排序 或 定制排序
  • Hashtable:是一个古老的实现类,线程安全的,不可以添加null键,null值不建议使用。子类:Properties:
  • 常用来处理属性文件 Iterator接口:用来遍历集合Collection元素
  • Collections工具类:操作Collection及Map的工具类,大部分为static的方法。

附:Properties的使用

Properties pros = new Properties();
		pros.load(new FileInputStream(new File("jdbc.properties")));
		String user = pros.getProperty("user");
		System.out.println(user);
		String password = pros.getProperty("password");
		System.out.println(password);		

总结:
1.当向 ArrayList 添加一个对象时,实际上就是将该对象放置到了 ArrayList 底层所维护的数组当中;当向 LinkedList 中添加一个对象时,实际上 LinkedList 内部会生成一个
Entry 对象,该 Entry 对象的结构为:

Entry
{
	Entry previous;
	Object element; 
	Entry next;
}    

其中的 Object 类型的元素 element 就是我们向 LinkedList 中所添加的元素,然后 Entry 又构造好了向前与向后的引用 previous、next,最后将生成的这个 Entry 对象加入到了链表当中。换句话说,LinkedList 中所维护的是一个个的 Entry 对象。

2.关于 Object 类的 equals 方法的特点

  • a)自反性:x.equals(x)应该返回 true

  • b)对称性:x.equals(y)为 true,那么y.equals(x)也为 true。

  • c)传递性:x.equals(y)为 true 并且y.equals(z)为 true,那么 x.equals(z)也应该为 true。

  • d)一致性:x.equals(y)的第一次调用为 true,那么 x.equals(y)的第二次、第三次、第n次调用也应该为true,前提条件是在比较之间没有修改 x 也没有修改 y。

  • e)对于非空引用 x,x.equals(null)返回false。

    3.关于 Object 类的 hashCode()方法的特点:

a)在 Java 应用的一次执行过程当中,对于同一个对象的 hashCode 方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b)对于两个对象来说,如果使用 equals 方法比较返回true,那么这两个对象的 hashCode 值一定是相同的。
c)对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode 值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
d)对于Object 类来说,不同的Object 对象的hashCode 值是不同的(Object 类的hashCode值表示的是对象的地址)。
**

关于为什么重写Equals方法的同时一定要同时进行重写HashCode

原因:使用 HashSet 时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code 值是否与增加的对象的 hash code 值一致;如果不一致,直接加进去;如果一致,再进行 equals 方法的比较,equals 方法如果返回 true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

5.如果我们重写 equals 方法,那么也要重写 hashCode 方法,反之亦然。

6.Map(映射):Map 的keySet()方法会返回key 的集合,因为 Map 的键是不能重复的,因此 keySet()方法的返回类型是 Set;而 Map 的值是可以重复的,因此 values()方法的返回类型是 Collection,可以容纳重复的元素。

面试常见点(见后续更新中。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值