Set Interface
除了不能添加重复元素外,set也添加了一些强约束,在执行equals和hashCode方法,这使得集合可以进行有意义的比较操作,即使他们的实现类型不同。
一个Set接口的声明如下:
public interface Set<E> extends Collection<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element); //optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c); //optional
boolean retainAll(Collection<?> c); //optional
void clear(); //optional
// Array Operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
Java平台包含3个通用的set实现:HashSet,TreeSet和LinkedHashSet。HashSet将元素存储在一张hash表中,一般来说,这是set的最优实现。但是它并不关心数据的存储顺序。
TreeSet将元素存储在一棵红黑树中,数据的顺序按照元素的值排列。总体上说,它的性能略低于HashSet。LinkedHashSet使用一个linked list贯穿整个set,并且按照插入顺序排列,由于要处理HashSet的无序性,所以要花费稍微高一些的代价。
以下是一些简单但是很实用的有关set的习惯用法。
假设你有一个结合c,你想创建另一个集合,包含c中的全部元素,并移除所有重复元素,下面的一行代码可以展示这个技巧:
Collection<Type> noDups = new HashSet<Type>(c);
以下是一个小小的变种,它将保留原集合的元素顺序:
Collection<Type> noDups = new LinkedHashSet<Type>(c);
下面是一个泛型方法,它包装了上一行代码:
public static <E> Set<E> removeDups(Collection<E> c) {
return new LinkedHashSet<E>(c);
}
2.Set 的基本操作
size()方法返回set的元素数量(也称作set的基)。isEmpty的功能正如其名字描述的那样。而add方法则会在添加时检查待添加元素是否已经存在于集合中。
下面的程序示例将演示Set的基本用法,该程序将统计程序参数字符串中的重复单词,并生成一个包含非重复单词的集合
import java.util.*;
public class FindDups {
public static void main(String[] args) {
Set<String> s = new HashSet<String>();
for (String a : args)
if (!s.add(a))
System.out.println("Duplicate detected: " + a);
System.out.println(s.size() + " distinct words: " + s);
}
}
现在运行程序:
java FindDups i came i saw i left
得到输出结果:
Duplicate detected: i
Duplicate detected: i
4 distinct words: [i, left, saw, came]
注意: 在上面的代码中,我们使用接口类型(Set)而不是实现类型(HashSet)来引用我们的HashSet实例。这是一种
强烈推荐的编程习惯,这样做可以给予程序更多的柔韧性,因为你可以通过仅仅更改构造器来将程序的实现更改。(比如你可以很容易的做出一个ArrayList版本的例子,仅仅需要改变以下构造器即可)。
此外,程序是否可以成功运行也得不到保证。因为程序使用了一个在早期版本中编写的非标准操作方法,而在新的版本中此方法并没有被实现,那么程序就会失败。使用接口来引用实例,可以使你不会使用非标准方法。
3. Bulk Operations
这里,假设有两个set s1与s2
s1.containsAll(s2) s2是否为s1子集
s1.addAll(s2) s1与s2的并集
s1.removeAll(s2) 将s1中也属于s2的元素去掉
s1.retainAll(s2) s1与s2的交集
如果希望在不破坏原有集合的基础上进行以上操作,需要对目标集合进行以此copy,下面是常用的代码:
Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
Set<Type> intersection = new HashSet<Type>(s1);
intersection.retainAll(s2);
Set<Type> difference = new HashSet<Type>(s1);
difference.removeAll(s2);
4.数组操作
与Collection的数组操作一致
(to be continued...)
分享到:
相关推荐
在熟悉了Java内置的数据结构后,进一步研究Apache的Java Collections Framework实现,如Apache Commons Collections,可以加深对高级数据结构设计的认识。 总的来说,Java的学习是一个循序渐进的过程,从基础语言...
这两个框架的对比和研究能让你对Java的集合处理有更全面的认识。 总之,学习Java需要耐心和实践,通过阅读高质量的书籍和参考资料,结合实际编程练习,你可以逐渐掌握这门语言的精髓。《Thinking in Java》、《Core...
通过这种映射关系,可以在教学中将Java Collections框架的讲授与数据结构的知识体系相结合,从而加深学生对数据结构在Java编程中应用的认识。 文章强调,Java Collections框架的设计目的主要是满足高性能、一致性、...
1. **不安全的反序列化库**:某些Java库(如Apache Commons Collections)在反序列化时没有足够的安全性检查,可能导致远程代码执行。攻击者可以通过构造恶意的序列化对象来触发这些库的漏洞。 2. **未验证的数据源...
Java的Collections框架提供了sort()方法,可以对List接口的实现类进行排序。根据需求,可以选择升序或降序排列,也可以自定义比较器进行复杂排序。排序后的数据会更新到视图上,通过JTable或者JList组件呈现给用户,...
1. **认识Java**:这一章通常会介绍Java的历史、特点、应用领域以及其与其他编程语言的对比。它还会解释Java平台,包括Java虚拟机(JVM)的概念,以及如何安装和配置Java开发环境。 2. **Java虚拟机简介**(第02章...
031314_【第13章:Java类集】_集合工具类:Collections笔记.pdf 031315_【第13章:Java类集】_Stack类笔记.pdf 031316_【第13章:Java类集】_属性类:Properties笔记.pdf 031317_〖第13章:Java类集〗_范例讲解:一...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
8. **了解Java的应用领域**:对Java在实际项目中的应用场景有一定的认识。 #### 考试内容详解 1. **Java语言的特点和实现机制**:深入探讨Java的跨平台性、内存管理机制、垃圾回收机制等。 2. **Java体系结构**: ...
1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 Java...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
##### 1.1 认识Java - **诞生时间**:1995年5月23日,Java语言由Sun Microsystems公司推出。 - **创始人**:James Gosling,通常被称为“Java之父”。 ##### 1.2 Java的发展史 - **起源**:Java最初被设计用于消费...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
14. **Java EE**:简述Java企业版,包括Servlet、JSP、Filter、Listener等Web开发技术,以及MVC设计模式和Spring框架的初步认识。 通过【Java课件_张孝详】中的内容,学习者可以系统性地学习Java编程,逐步提高编程...
1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...
#### 1.2 认识Java语言 Java语言具有跨平台性(一次编写,到处运行)、面向对象、健壮性和安全性等特点。它的设计目标是让程序员能够更容易地开发出稳定可靠的软件系统。 #### 1.3 Java平台的体系结构 Java平台...
课程目标 认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。 学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。 培养和建立面向对象编程...