Set
无序,无下表,不能重复(当我们new 一个HashSet实例时, 其实底层是新创建了一个HashMap实例。 放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。)
这里是用字符串来添加,如果是类的话,就先创建对象,然后将对象添加到set里面,方法是一致的。
Set<String> set=new HashSet<>();//如果是对类进行操作 就需要将String换成类名
set.add("java");
set.add("python");
set.add("C++");
set.add("python");
输出结果为python C++ java (无序和不能重复)
for(String st:set){
System.out.println(st);
}
4.2 使用迭代器 Iterator
Iterator<String> it=set.iterator();
while(it.hasNext){
System.out.println(it.next());
}
set.contains("java");//元素是否存在
set.isEmpty();//集合是否为空
HashSet
-
特点
1 存储结构:哈希表(数组+链表+红黑树)
2 允许有null值
3 基于HashCode计算元素存放位置。
4 当存入元素的HashCode相同时,会调用equals进行确认,若结果为true,就拒绝后者存入。
5 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。 -
操作
因为是set的实现类,其创建,添加,删除,遍历和set是一样的
TreeSet(红黑树)
基于排序顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序
元素对象的类型必须实现Comparable接口,指定排序规则
通过CompareTo方法确定是否为重复元素
2. ## 操作
其对字符串的操作和set是一样的
但在对类进行添加操作时,类必须实现Comparable接口,
implement Comparable
重写CompareTo方法
@Override
public int CompareTo(Person o){
int n1=this.getid().compareTo(0.getid());//先比较id
int n2=this.age-0.getAge();//然后比较两个人的年龄
return n1==0?n2:n1;//如果id相同,就按两个人的年龄进行比较
}