赞
踩
今天来看看Java集合中的Set集合,为什么Set集合中元素不能重复?为什么Set集合是无序的?我们来共同交流交流
目录
元素不可重复(相同内容不会被加入,没有下标)
无序(存进去是这个顺序,取出来就不一定是这个顺序)(Set容器可以与数学中的“集合”的概念相对应)
Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有有顺序的,而且不可以重复。
Set容器类:HashSet、TreeSet
- import java.util.HashSet;
- import java.util.Set;
-
- public class SetTest {
- public static void main(String[] args){
- Set s = new HashSet();
- s.add("hello");
- s.add("world");
- s.add(new Name("f1","f2"));
- s.add(new Integer(100));
- s.add(new Name("f1","f2")); //相同的元素不会被加入
- s.add("hello"); //相同的元素不会被加入
- System.out.println(s);
- }
- }
输出结果:[100,hello,world,f1 f2]
- import java.util.Set;
- import java.util.HashSet;
-
- public class SetTest2 {
- public static void main(String[] args){
- Set s1=new HashSet();
- Set s2 =new HashSet();
- s1.add("1");
- s1.add("b");
- s1.add("c");
- s2.add("d");
- s2.add("a");
- s2.add("b");
- //Set和List容器类都具有Constructor(Collection c)
- //构造方法用以初始化容器类
- Set sn = new HashSet(s1);
- sn.retainAll(s2);
- Set su = new HashSet(s1);
- su.addAll(s2);
- System.out.println(sn);
- System.out.println(su);
- }
- }
输出结果:
[a,b]
[d,a,c,b]
下面我们来具体说说HashSet和TreeSet的使用吧~
- 不可重复
- 无序的,即不会记录插入的顺序
- 可以存不同类型数据
- 集合元素可以存null(但只能存储一个null值)
add:添加元素
remove:删除元素
contains:判断是否包含某个元素
clear:清空
Iterator:使用迭代器遍历集合
foreach:遍历集合
- import java.net.SocketOption;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
-
- public class HashSetTest {
- public static void main(String[] args) {
- //实例化一个HashSet集合
- Set set = new HashSet();
-
- //添加元素
- set.add(1);
- set.add("a");
- System.out.println(set);
-
- //删除元素
- set.remove(1);
- System.out.println(set);
-
- //判断是否包含某个元素
- System.out.println(set.contains(1));
-
- //清空集合
- set.clear();
- System.out.println(set);
-
-
-
- set.add("a");
- set.add("b");
- set.add("c");
- set.add("d");
- set.add("d"); //重复的元素不会被添加
- set.add(null); //可以存取空值
- System.out.print(set);
-
- //使用迭代器遍历集合
- Iterator it =set.iterator();
- while (it.hasNext()){
- System.out.println(it.next());
- }
-
- //for each迭代集合
- for (Object obj:set){//把set的每一个值取出来,赋值给obj,直到循环完set的所有值
- System.out.println(obj);
- }
- System.out.println(set.size()); //获取集合的元素个数
- }
- }
如果想要让集合只能存同样类型的对象,怎么做呢?实例化时就指定出具体数据类型
- //使用泛型
- Set<String> set1 = new HashSet<String>();
- set1.add("a");
- set1.add("123");
注:可能很多小伙伴发现自己添加的元素有重复内容,但集合自动去重了,Set的去重原理是什么?这里有一篇还不错的博客,可以转战观看:Java笔记 —— Set集合的去重原理(源码分析)_一纸春秋的博客-CSDN博客_java set 去重原理
- 有序(底层在添加元素的时候会自动进行排序)
- 可以对元素进行排序(自然排序(默认)、定制排序)
为什么TreeSet的存储结构是有序的?
在进行add添加元素的时候底层会进行一个逻辑判断,如果要新添加的元素在集合中存在,则该集合的元素保持;如果要添加的元素在集合中不存在,则将元素添加到集合中,并且进行自然排序:
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列
- 如果this>obj,返回正数1
- 如果this<obj,返回正数-1
- 如果this=obj,返回0,则认为这两个对象相等
必须放入同样类的对象。(默认会进行排序)否则可能会发生类型转换异常,我们可以使用泛型来进行限制
add:添加元素
remove:删除元素
contains:判断是否包含某个元素
clear:清空
- import java.util.Iterator;
- import java.util.Set;
- import java.util.TreeSet;
-
- public class TreeSetTest {
- public static void main(String[] args) {
- Set<Integer> set = new TreeSet<Integer>();
- //TreeSet自然排序
- set.add(5);
- set.add(2);
- set.add(4);
- set.add(3);
- System.out.println(set); //输出结果为2 3 4 5
-
- //删除元素
- set.remove(5);
-
- //判断是否包含某个元素
- set.contains(3);
-
- //清空集合
- set.clear();
-
- //使用迭代器遍历集合
- Iterator<Integer> it = set.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }
-
- //for each迭代集合
- for (Integer i:set){
- System.out.println(i);
- }
- }
- }
在创建TreeSet集合对象时,提供一个Comparator接口的实现类对象。由该Comparator对象负责集合元素的排序逻辑
- import java.util.Comparator;
- import java.util.Iterator;
- import java.util.Set;
- import java.util.TreeSet;
-
- public class TreeSetTest {
- public static void main(String[] args) {
-
-
- //-------------------------------------
- Person p1 = new Person("唐三",21);
- Person p2 = new Person("小舞",21);
- Person p3 = new Person("戴沐白",25);
- Person p4 = new Person("奥斯卡",24);
- Person p5 = new Person("朱竹清",20);
- Person p6 = new Person("宁荣荣",19);
- Person p7 = new Person("马红俊",26);
-
- Set<Person> personSet = new TreeSet<Person>(new Person());
- personSet.add(p1);
- personSet.add(p2);
- personSet.add(p3);
- personSet.add(p4);
- personSet.add(p5);
- personSet.add(p6);
- personSet.add(p7);
-
- for(Person p:personSet){
- System.out.println(p.name+" "+p.age);
- }
- }
- }
-
- class Person implements Comparator<Person> {
- String name ;
- int age;
- public Person(){}
- public Person(String name,int age){
- this.name=name;
- this.age=age;
- }
-
- //自己定制的比较方法,调用这个方法来判断age
- public int compare(Person o1,Person o2){
- if(o1.age>o2.age){
- return 1;
- }else if(o1.age<o2.age){
- return -1;
- }else{
- return 0;
- }
- }
- }
输出结果为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。