组团学

Set集合

阅读 (373700)

1、Set概述

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不 同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet 、 java.util.LinkedHashSet、java.util.TreeSet这三个集合。

2、HashSet类

虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看 HashSet的add(Object obj)方法的实现就可以一目了然了。

import java.util.HashSet; import java.util.Iterator; public class SetDemo01 { public static void main(String[] args) { //创建Set集合对象 HashSet<String> set = new HashSet<String>() ; //添加元素(增) set.add("hello"); set.add("java") ; set.add("java") ; set.add("world") ; set.add("world") ; set.add("world") ; System.out.println("集合中添加的元素:"+set);//打印的是内容(原因:传入参数类型是String,底层重写了toString()方法) System.out.println("集合中元素的个数:"+set.size()); //增强for遍历 Iterator i=set.iterator(); while(i.hasNext()){ System.out.println(i.next()); } //删除元素(删) System.out.println("是否成功删除:"+set.remove ("hello"));//删除是否成功 System.out.println("删除后集合中的元素:"+set); //查询 System.out.println("是否包含此元素:"+set.contains ("hello")); } }
import java.util.HashSet; import java.util.Iterator; class Book{ String name; double price; public Book(String name,double price) { // TODO Auto-generated constructor stub this.name = name; this.price = price; } @Override public String toString() { // TODO Auto-generated method stub return "[书名:" + this.name + " 价格:" + this.price + "]"; } @Override public int hashCode() { // TODO Auto-generated method stub return this.name.hashCode(); } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub Book b = (Book) obj; return this.name.equals(b.name); } } public class SetDemo02 { public static void main(String[] args) { // TODO Auto-generated method stub //不允许重复,增加自定义对象 HashSet<Book> books = new HashSet<Book>(); books.add(new Book("深入Javaweb",34)); books.add(new Book("java神书",78)); books.add(new Book("java神书",78)); // books.remove(new Book("java神书",78)); //修改书名 Iterator<Book> it = books.iterator(); while(it.hasNext()){ Book b = it.next(); if(b.name.equals("java神书")){ b.name = "java编程思想"; } } //为什么改了名字后不能删除了! books.remove(new Book("java编程思想",78)); System.out.println("集合的元素: "+ books); } }

3、LinkedHashSet类

LinkedHashSet是有序的而且不能重复,是HashSet的一个子类,一个链表; 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;

import java.util.Iterator; import java.util.LinkedHashSet; class Student{ private int age; private String name; public Student(int age,String name) { this.age = age; this.name = name; } //要显示Student类的信息,必须重写toString 方法 public String toString(){ return "age :"+age+" name:"+name; } public int hashCode() { return age*name.hashCode(); } public boolean equals(Object o){ Student s = (Student) o; return age == s.age && name.equalsIgnoreCase(s.name); } } public class SetDemo03 { public static void main(String[] args) { // TODO Auto-generated method stub LinkedHashSet linkHashSet = new LinkedHashSet(); Student linkedstu1 = new Student(18,"zxx"); Student linkedstu2 = new Student(23,"zyj"); Student linkedstu3 = new Student(25,"xmh"); Student linkedstu4 = new Student(25,"zah"); Student linkedstu5 = new Student(25,"zah"); linkHashSet.add(linkedstu3); linkHashSet.add(linkedstu4); linkHashSet.add(linkedstu1); linkHashSet.add(linkedstu2); linkHashSet.add(linkedstu5); linkHashSet.add(null); Iterator it = linkHashSet.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //经过测试是有序的而且不能重复 } }

4、TreeSet类

SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

TreeSet提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。

import java.util.HashSet; import java.util.LinkedHashSet; import java.util.TreeSet; public class SetDemo04 { public static void main(String[] args) { HashSet<String> hs = new HashSet<String>(); //增加元素 hs.add("B"); hs.add("A"); hs.add("D"); hs.add("E"); hs.add("C"); hs.add("F"); System.out.println("HashSet 顺序:\n"+hs); LinkedHashSet<String> lhs = new LinkedHashSet<String>(); lhs.add("B"); lhs.add("A"); lhs.add("D"); lhs.add("E"); lhs.add("C"); lhs.add("F"); System.out.println("LinkedHashSet 顺序:\n"+lhs); TreeSet<String> ts = new TreeSet<String>(); ts.add("B"); ts.add("A"); ts.add("D"); ts.add("E"); ts.add("C"); ts.add("F"); System.out.println("TreeSet 顺序:\n"+ts); } }
需要 登录 才可以提问哦