网站登录系统制作,大丰区城乡和住房建设局网站,网站后台文章排版,市场推广计划方案模板List、Map、Set是Java集合框架中的三个核心接口#xff0c;它们在存取元素时各自具有独特的特点。以下是对这三个接口存取元素特点的详细分析#xff1a;
List接口 有序性#xff1a;
List中的元素是有序的#xff0c;它们按照插入的顺序进行排列。 可重复性#xff1a…List、Map、Set是Java集合框架中的三个核心接口它们在存取元素时各自具有独特的特点。以下是对这三个接口存取元素特点的详细分析
List接口 有序性
List中的元素是有序的它们按照插入的顺序进行排列。 可重复性
List允许存储重复的元素即List中可以有多个相同的元素。 索引访问
List提供了基于索引的访问方式可以通过索引位置来访问和修改List中的元素。这类似于数组的访问方式。 实现类
List接口的主要实现类包括ArrayList和LinkedList。ArrayList基于动态数组实现适合随机访问但插入和删除效率较低LinkedList基于双向链表实现插入和删除操作效率高但查询效率较低。
Set接口 元素唯一性
Set中的元素是唯一的不允许重复。如果尝试向Set中添加一个已经存在的元素则添加操作会失败。其实通过查看源码就知道其实是Set的add方法中通过map不能存储重复的key来保证唯一的Set 集合的 add 方法有一个 boolean 的返回值当集合中没有某个元素此时 add 方法可成功加入该元素时 则返回 true当集合含有与某个元素 equals 相等的元素时此时 add 方法无法加入该元素 返回结果为 false。
public boolean add(E e) {return map.put(e, PRESENT)null;
} 无序性
Set中的元素没有特定的顺序即不保证元素存储的顺序与插入顺序一致。但是某些Set的实现类如LinkedHashSet可以维护元素的插入顺序。 无索引访问
Set不支持通过索引来访问和修改元素。它主要通过迭代器Iterator或增强型for循环来遍历元素。 实现类
Set接口的主要实现类包括HashSet、LinkedHashSet和TreeSet。HashSet基于哈希表实现查找效率高但不保证顺序LinkedHashSet继承自HashSet使用双向链表维护插入顺序TreeSet基于红黑树实现可以按元素的自然顺序或自定义顺序进行排序。
HashSet延伸
HashSet的存储方式
注意HashSet的存储方式是按照 hashcode 值的某种运算方式进行存储而不是直接按 hashCode 值的大小进行存储。通过查看源码可以看到运算方式如下
static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16);
}
HashSet如何比较相等
在 Java 中HashSet 是一个基于哈希表的数据结构用于存储不重复的元素。当你将一个对象添加到 HashSet 中时它会根据对象的哈希码通过调用对象的 hashCode() 方法来确定该对象应该存放在哪个桶bucket中。为了确定两个对象是否相等HashSet 依赖两个条件
哈希码相等两个对象的哈希码必须相等。这是通过调用对象的 hashCode() 方法来确定的。equals 方法如果两个对象的哈希码相等那么 HashSet 会进一步调用对象的 equals() 方法来确认它们是否确实相等。
因此要使 HashSet 正确比较两个对象是否相等必须满足以下要求
覆盖 hashCode() 方法确保两个相等的对象具有相同的哈希码。覆盖 equals() 方法确保 equals() 方法定义了两个对象相等的逻辑。 代码实例
class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Student student (Student) o;return age student.age Objects.equals(name, student.name);}Overridepublic int hashCode() {return Objects.hash(name, age);}Overridepublic String toString() {return Student{ name name \ , age age };}
}public class HashSetEqualsTest {public static void main(String[] args) {HashSetStudent set new HashSet();Student p1 new Student(Alice, 30);Student p2 new Student(Alice, 30);set.add(p1);set.add(p2);System.out.println(Set size: set.size()); // 输出应为 1因为 p1 和 p2 相等System.out.println(set); // 输出 Student{nameAlice, age30}}
}
输出结果
Set size: 1
[Student{nameAlice, age30}] 如果Student不实现hashcode和equals方法则输入结果如下
Set size: 2
[Student{nameAlice, age30}, Student{nameAlice, age30}]
Map接口 键值对存储
Map以键值对key-value的形式存储数据。每个键都是唯一的但值可以重复。 无序性
Map中的键值对没有特定的顺序即不保证键值对的存储顺序与插入顺序一致。但是某些Map的实现类如LinkedHashMap和TreeMap可以维护键值对的顺序。 键的唯一性
Map中的键是唯一的每个键最多映射到一个值。Map使用键的equals()和hashCode()方法来比较键是否相等。 值的多重性
Map中的值可以重复即多个键可以映射到相同的值。 实现类
Map接口的主要实现类包括HashMap、TreeMap、Hashtable、LinkedHashMap和ConcurrentHashMap。HashMap基于哈希表实现查找效率高但不保证顺序TreeMap基于红黑树实现按键的自然顺序或自定义顺序进行排序LinkedHashMap继承自HashMap使用双向链表维护插入顺序或访问顺序Hashtable是线程安全的HashMap但性能较低ConcurrentHashMap是线程安全的HashMap适用于高并发场景。
总结
综上所述List、Map、Set三个接口在存取元素时各有其独特的特点。List适合存储有序的元素列表并允许重复元素Set适合存储不重复的元素集合并提供了高效的查找性能Map则适合存储键值对映射其中键是唯一的而值可以重复。在选择使用哪个接口时应根据具体的应用场景和需求来决定。