3.Set
-
特点总结
不包含重复元素,最多只能包含一个null元素 特点:无序,不重复 遍历方式不能使用for循环(没有get()方法),只能用迭代器
3.1HashSet
HashSet实现 Set接口,由哈希表(底层: HashMap 实现)支持。
它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。HashSet保证元素唯一。
底层数据结构是哈希表,哈希表依赖于哈希值存储。添加元素时保证元素唯一,此类允许使用null元素。
-
存储特点:
相对无序存储,不可以存储相同元素(排重),通过哈希表实现的集合
-
常用方法和其他的差不多,主要经常用到是int hashCode()和boolean equals(Object obj)
3.1.1代码Code:
package mygather;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest02 {
private long cardNo;
public static void main(String[] args) {
IdCard idCard01 = new IdCard();
idCard01.cardNo = 111L;
Person person01 = new Person();
person01.name = "张三";
IdCard idCard02 = new IdCard();
idCard02.cardNo = 112L;
Person person02 = new Person();
person02.name = "李四";
IdCard idCard03 = new IdCard();
idCard03.cardNo = 113L;
Person person03 = new Person();
person03.name = "王五";
Map<IdCard, Person> map = new HashMap<>();
map.put(idCard01, person01);
map.put(idCard02, person02);
map.put(idCard03, person03);
System.out.println(map.size());
System.out.println(map.hashCode());
//迭代器遍历
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry entry = (Map.Entry) iterator.next();
IdCard idCard = (IdCard) entry.getKey();
Person person = (Person) entry.getValue();
System.out.println(idCard.cardNo + ", " + person.name);
}
}
//重写equals()和hashCode()方法
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof IdCard) {
IdCard idCard = (IdCard) obj;
if (this.cardNo == idCard.cardNo) {
return true;
}
}
return false;
}
public int hashCode() {
return new Long(cardNo).hashCode();
}
}
class IdCard {
long cardNo;
}
class Person {
int age;
String name;
}
3.1.2输出结果(截图):
3.2TreeSet
TreeSet基于 TreeMap实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,(排序方式)具体取决于使用的构造方法。
使用元素的自然顺序对元素进行排序(自然排序),根据创建 set 时提供的 Comparator 接口或Comparator接口进行排序(比较器排序)
底层数据结构是红黑树(自平衡二叉树)
-
存储特点:
无序存储,通过二叉树实现的集合,可以给元素进行重新排序(TreeSet保证元素的排序和唯一性的)
3.2.1代码Code:
package mygather;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class MyTreeSet {
public static void main(String[] args) {
Set<String> treeSet = new TreeSet<String>();
treeSet.add("1");
treeSet.add("2");
treeSet.add("3");
treeSet.add("4");
treeSet.add("5");
//set接口是不重复的
treeSet.add("5");
System.out.println(treeSet);
//添加
//因为set接口不重复,所以无法添加自身
treeSet.addAll(treeSet);
System.out.println(treeSet);
Set<String> set = new TreeSet<String>();
set.add("8");
//但可以添加别的集合
treeSet.addAll(set);
System.out.println(treeSet);
//遍历
System.out.println("-----foreach循环遍历-----");
for (String string : treeSet) {
System.out.println(treeSet);
}
System.out.println("-----迭代器遍历-----");
Iterator<String> iterator = treeSet.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
}