javaSE进阶-Set集合

javaSE进阶-Set集合


Set集合概述和特点

  • 基础自Colletion集合
  • 不存储重复元素的集合
  • 没有带索引的方法,所以不能使用普遍for循环遍历
  • 它是由子类HashSet实现的,HashSet对集合的迭代顺序不做任何保证,它的底层数据结构是哈希表

Set集合存储数据并遍历

在这里插入图片描述如图:我们添加了四个元素,其中存储了重复的元素java,但是当我们遍历时,集合里是没有两个Java元素的

注:Set集合添加重复元素时,编译和运行时都不会出错,但是不会重复添加

LinkedHashSet集合的概述与特点

概述

  • 继承自HashSet,是HashSet的子类,实现set接口
  • 它是由哈希表与链表实现的Set,也就是说LinkedHashSet集合的底层数据结构是有两个的,一个是哈希表,一个是链表

特点

  • 是哈希表和链表实现的Set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复的元素

LinkedHashSet集合存储字符串并遍历

在这里插入图片描述我们通过实例可以发现,元素的存储和取出顺序是一致的,而我们在编译时,添加了一个重复元素Java,发现它并没有被重复的添加进集合中

TreeSet集合概述和特点

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
  • 没有带索引的方法,所以不能使用普遍for循环遍历
  • 由于继承自Set集合,所以不能存储重复元素的集合

  • TreeSet()(无参构造):根据其元素的自然排序进行排序
  • 自然排序:让元素所属的类实现Comparable接口,重写compareTo(To)方法

  • TreeSet(Comparator comparator)(有参构造):根据指定的比较器进行排序
  • 比较器排序:就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,To2)方法

练习:存储整数并遍历

在这里插入图片描述
集合里的泛型只能是引用类型,所以得使用Integer,使用int会报错
可以发现TreeSet集合不能存储重复元素,因为使用的无参构造,所以会自然排序,从小到大

自然排序Comparable的使用

  • 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
    在这里插入图片描述当我们使用Comparable自然排序遍历输出对象时,程序报了一个错误:类转换错误
    这是因为:
    如果我们要对象自然排序,我们就要类实现Comparable接口
    重写comparable方法
public int compareTo(Student arg0) {
			// TODO Auto-generated method stub
			return -1;
			
			当返回值为0:
			它会先存储第一个元素,后面元素存储时,程序会认为后面的元素与第一个元素是同一个,
			所以就后面的元素不会再添加,即后面的元素就存储不到TreeSet集合中
			
			当返回值为1:
			先存储第一个元素,后面元素会与第一个元素比较,因为返回值为1,是一个正数,
			所以程序就认为s2会比s1大,所以s2就存储在s1后面,同理可得:s3在s2后面,s4在s3后面,
			所以当返回值为1时:它是按照存储顺序正序遍历输出出来的
			
			当返回值为-1时:
			先存储第一个元素,后面元素会与第一个元素比较,因为返回值为-1,是一个负数,
			所以程序就认为s2会比s1小,所以s2就存储在s1前面,同理可得:s3在s2前面,s4在s3前面,
			所以当返回值为1时:它是按照存储顺序倒序遍历输出出来的
			
		}

所以当我们要按年龄大小比较时,就需要有两个年龄

	public int compareTo(Student s) {
			return this.age-s.age;
			s.age是第一个元素的年龄,因为他不需要比较,
			所以直接存储在对象中
			this.age是后面的元素,它会与第一个比较,如果是正数,就在第一个元素的后面
			此时:s.age就有两个元素的年龄了,当后面的元素再添加进来时,
			就会与这两个元素比较,正数排在该元素后面,负数在后面
			
		}

在这里插入图片描述这时,我们可以看到,因为s4和s5的年龄相同,相比较返回值为0,所以s5这个元素就没有存储,
所以当年龄相同时,我们就比较按字母顺序排序
在这里插入图片描述注意:字符串比较时,是与字符串每个字母都比较
在这里插入图片描述如图,s6与s5年龄相同,但是字符串的字母末尾不同
linqingxia lingqingxie ,
末尾的a的顺序在e的前面,所以遍历时s5在s6前面

比较排序Comparator的使用

存储学生对象并遍历,创建TreeSet集合使用有参构造方法

  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

在这里插入图片描述比较器排序使用匿名内部类的方式,实体类可以不用实现Comarator接口,

不重复的随机数

编写一个程序,获取10个1-20之间的随机数,要求随机数
不能重复,并在控制台输出

思路:

  • 创建Set集合
  • 创建随机数对象
  • 判断集合的长度是不是小于10
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值