1.Set接口
Set 接口继承 Collection 接口,而且它不允许集合中存在重复项,每个具体的 Set 实现类依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一个Collection,只不过其行为不同。
下面介绍Set接口3种主要的实现类。
HashSet 为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()。
TreeSet 保存次序的Set,底层为树结构。使用它可以从Set中提取有序的序列。元素必须实现Comparable接口。
LinkedHashSet 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入顺序)。在使用迭代器遍历Set时,结果会按插入的次序显示。元素必须定义hashCode()方法。
2.HashSet
1)是实现Set接口的hash table(哈希表),依靠HashMap来实现的。
2)我们应该为要存放到散列表的各个对象定义hashCode()和equals()。
import java.util.HashSet;
import java.util.Iterator;
class HashSetTest {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<Student>();
hs.add(new Student(1, "zhangsan"));
hs.add(new Student(2, "lisi"));
hs.add(new Student(3, "wangwu"));
hs.add(new Student(1, "zhangsan"));// 重写hashCode()方法、equals()方法后,hashset不再接受重复的元素
Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
class Student {
int num;
String name;
Student(int num, String name) {
this.num = num;
this.name = name;
}
public int hashCode() {// 重写hashCode()方法
return num * name.hashCode();
}
public boolean equals(Object o) {// 重写equals()方法
Student s = (Student) o;
return num == s.num && name.equals(s.name);
}
public String toString() {
return num + ":" + name;
}
}
结果:
1:zhangsan
3:wangwu
2:lisi
3.TreeSet
1)TreeSet是依靠TreeMap来实现的。
2)TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。
3)我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。
示例一,是按照缺省的自然顺序(对于String,则是字母顺序)排列。
import java.util.Iterator;
import java.util.TreeSet;
class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> ts = new TreeSet<String>();
ts.add("a");
ts.add("b");
ts.add("c");
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
结果:
a
b
c
示例二Student类通过实现Comparable接口来自定义排列顺序。这里排序的依据是Student类的成员变量(int num)。从运行结果可以发现,当出现num重复的情况,只保存首次加入的元素。
import java.util.Iterator;
import java.util.TreeSet;
class TreeSetTest {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>();
ts.add(new Student(2, "Tom"));
ts.add(new Student(1, "Jeff"));
ts.add(new Student(3, "Ada"));
ts.add(new Student(3, "Mary"));
ts.add(new Student(1, "Peter"));//compareTo()返回0,则不加入
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
class Student implements Comparable {
int num;
String name;
Student(int num, String name) {
this.num = num;
this.name = name;
}
public int compareTo(Object o) {
Student s = (Student) o;
return num > s.num ? 1 : (num == s.num ? 0 : -1);
}
public String toString() {
return num + ":" + name;
}
}
结果:
1:Jeff
2:Tom
3:Ada
示例三通过Student的内部类StudentComparator,来实现第二关键字的排序,即当第一关键字num相等时,使用第二关键字name排序。
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class TreeSetTest {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>();
ts.add(new Student(2, "Tom"));
ts.add(new Student(1, "Jeff"));
ts.add(new Student(3, "Ada"));
ts.add(new Student(3, "Mary"));
ts.add(new Student(1, "Peter"));
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
class Student implements Comparable {
int num;
String name;
Student(int num, String name) {
this.num = num;
this.name = name;
}
private class StudentComparator implements Comparator {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1);
if (result == 0) {
result = s1.name.compareTo(s2.name);
}
return result;
}
}
public int compareTo(Object o) {
/*Student s = (Student) o;
return num > s.num ? 1 : (num == s.num ? 0 : -1);*/
StudentComparator sc=new StudentComparator();
return sc.compare(this, o);
}
public String toString() {
return num + ":" + name;
}
}
结果:
1:Jeff
1:Peter
2:Tom
3:Ada
3:Mary
4.LinkedHashSet
1)应该为要存放到散列表的各个对象定义hashCode()和equals()。
2)按插入顺序输出元素。(比较下面示例结果与HashSet示例的结果)
import java.util.Iterator;
import java.util.LinkedHashSet;
public class LinkedHashSetTest2 {
public static void main(String[] args) {
LinkedHashSet<Student> hs = new LinkedHashSet<Student>();
hs.add(new Student(1, "zhangsan"));
hs.add(new Student(2, "lisi"));
hs.add(new Student(3, "wangwu"));
hs.add(new Student(1, "zhangsan"));// 重写hashCode()方法、equals()方法后,hashset不再接受重复的元素
Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
class Student {
int num;
String name;
Student(int num, String name) {
this.num = num;
this.name = name;
}
public int hashCode() {// 重写hashCode()方法
return num * name.hashCode();
}
public boolean equals(Object o) {// 重写equals()方法
Student s = (Student) o;
return num == s.num && name.equals(s.name);
}
public String toString() {
return num + ":" + name;
}
}
结果:
1:zhangsan
2:lisi
3:wangwu
5.SortedSet接口
“集合框架”提供了个特殊的Set接口:SortedSet,它保持元素的有序顺序。添加到SortedSet实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeSet类是它的唯一一份实现。
因为集必须包含唯一的项,如果添加元素时比较两个元素导致了0返回值(通过Comparable的compareTo()方法或Comparator的compare()方法),那么新元素就没有添加进去。
注意,SortedSet意思是“根据对象的比较顺序”,而不是“插入顺序”进行排序。
SortedSet中的元素一定是有序的。这使得SortedSet接口多了一些方法:
① Comparator comparator():返回Set锁使用的Comparator对象,或者用null表示它使用Object自有的排序方法。
② Object first():返回最小的元素。
③ Object last():返回最大的元素。
④ SortedSet subSet(fromElement, toElement):返回Set的子集,其中的元素从fromElement开始到toElement为止(包括fromElement,不包括 toElement)。
⑤ SortedSet headSet(toElement):返回Set的子集,其中的元素都应小于toElement。
⑥ SortedSet headSet(toElement):返回Set的子集,其中的元素都应大于fromElement。
import java.util.Collections;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedSetDemo {
static void print(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
SortedSet<String> sortedSet = new TreeSet<String>();
Collections.addAll(sortedSet, "one two three four five six seven eight"
.split(" "));
print(sortedSet);
String low=sortedSet.first();
String high=sortedSet.last();
print(low);
print(high);
Iterator<String> it=sortedSet.iterator();
for(int i=0;i<=6;i++){
if(i==3)
low=it.next();
if(i==6)
high=it.next();
else it.next();
}
print(low);
print(high);
print(sortedSet.subSet(low, high));
print(sortedSet.headSet(high));
print(sortedSet.tailSet(low));
}
分享到:
相关推荐
Set接口不允许重复元素,HashSet是最常用的实现。Queue接口则定义了队列操作,如offer、poll等。 2. **Map接口**: Map接口是键值对存储的数据结构,HashMap和TreeMap是常见的实现。HashMap提供快速查找,基于哈希...
* Collection 接口:Java.util.Collection 接口是一个容器接口,提供了基本的容器操作,如 add、remove、size 等。 * List 接口:Java.util.List 接口是一个有序容器接口,提供了有序容器操作,如 get、set、indexOf...
Java中的`java.util.List`接口是集合框架的重要组成部分,它扩展了`Collection`接口,并引入了一些特定于列表的特性,如有序性、可重复性以及对元素的索引访问。这篇博客将深入探讨`List`接口及其常用实现类,如`...
3. Set接口:无序、不可重复、唯一,实现类有HashSet、TreeSet、LinkedHashSet等。 4. List接口:有序、可重复、多个null元素,实现类有ArrayList、LinkedList、Vector等。 集合框架的底层数据结构: 1. ArrayList...
Java Collection Framework 主要有六个核心接口: - `Collection`: 所有单列集合的根接口。 - `Set`: 不允许重复元素的集合。 - `List`: 有序且可重复的集合。 - `Map`: 存储键值对的映射表。 - `Queue`: 支持元素...
1. Collection 接口:是集合框架的核心接口,定义了集合的基本操作,例如 add、remove、contains 等。 2. Map 接口:是集合框架中的一种特殊的集合,用于存储键值对的数据。 3. Iterator 接口:是集合框架中的一种...
Java集合框架(Java Collection Framework)是Java标准库中的一个重要组成部分,它提供了一系列用于存储和操作数据集合的接口和实现类。这些接口和类的设计遵循一致的原则和约定,使得开发者能够更高效地管理不同...
Java集合框架中的Set接口是Java编程中不可或缺的一部分,主要用于存储不允许重复的元素。...了解和熟练使用这些方法对于Java开发人员来说至关重要,因为Set接口及其实现类在处理无重复数据集时非常实用。
- **`AbstractCollection`**:实现了大部分集合接口的通用方法。 - **`ArrayList`**:基于动态数组实现的`List`接口。 - **`LinkedList`**:基于双向链表实现的`List`接口。 - **`HashSet`**:基于哈希表实现的`Set`...
该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等
本文将深入探讨Java集合框架中的四个主要接口:Collection、List、Set和Map,以及它们的实现原理。 ### 集合框架概述 集合框架是Java API中用于存储和管理对象的统一框架。它为数据结构提供了抽象接口,使得程序员...
1. Set:不允许重复的集合,常用的实现类有 HashSet、TreeSet、LinkedHashSet 等。 * HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。 * TreeSet:基于红黑树实现,支持有序性操作,但查找效率不如 ...
1. Collection和Iterator接口 2. Set集合 3. List集合 4. Queue集合 5. Map 6. Hashset和Hashmap的性能选项 7. 操作集合的工具类:Collections 8. Enumeration 泛型编译时不检查类型的异常: 1. 手动实现编译时...
Collection接口是Java集合框架的根接口,定义了基本的集合操作,而List接口和Set接口继承自Collection接口,提供了有序和无序的集合操作。Map接口提供了键值对的存储和操作。 Java集合框架是Java语言中最基本也是最...
8. `java.util.Set`:Set接口表示不允许重复元素的集合。 9. `java.util.Arrays`:Arrays类提供了静态方法来操作数组,如排序、比较和填充。 10. `java.util.Iterator`:Iterator接口用于遍历集合中的元素,提供`...
1. 核心集合接口:如Collection、List、Set和Map,定义了基本的行为和操作。 2. 通用目的的实现:如ArrayList、LinkedList、HashSet、TreeSet、HashMap和TreeMap,它们是接口的具体实现。 3. 包装器实现:如...
- `Collection`接口是所有集合类的根接口,分为`List`和`Set`两大分支。 - `List`接口包括`ArrayList`和`LinkedList`等实现,`ArrayList`适合随机访问,`LinkedList`适合频繁的插入和删除操作。 - `Map`接口用于...
首先,集合框架的基础是`Collection`接口,它是所有单值容器的父接口,包括`List`, `Set`和`Queue`等子接口。`List`接口用于存储有序的元素,允许重复;`Set`接口则存储不重复的元素,无序;而`Queue`接口则定义了...
2. Set接口:Set接口不允许重复元素,且不保证元素的顺序。HashSet是最常见的Set实现,它基于哈希表提供快速的查找。TreeSet则按照元素的自然排序或自定义比较器进行排序。 3. Map接口:Map不是集合,而是键值对的...
`java.util.Set` 接口定义了集合的行为,常用的实现类有 `HashSet` 和 `TreeSet`。`HashSet` 基于哈希表,提供快速查找,而 `TreeSet` 使用红黑树,保证元素排序。 5. **映射(Map)**: 映射(Map)将键(Key)与...