java学习总结:Set集合

1,用HashSet存储字符串并遍历

package com.heima.set;

import java.util.HashSet;

public class Demo_1Hashset {
	/*
	 * set集合,无索引,不可以重复,无序(存取不一致)
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HashSet<String> hs = new HashSet<>();		//创建HashSet对象
		boolean b1 = hs.add("a");
		boolean b2 = hs.add("a");		//当向set集合中存储重复元素的时候返回false
		hs.add("b");
		hs.add("c");
		hs.add("d");
		System.out.println(hs);			//HashSet的继承体系中有重写toString方法
		System.out.println(b1);
		System.out.println(b2);
		
		for (String string : hs) {		//只要能用迭代器迭代的,就可以使用增强for循环遍历
			System.out.println(string);
		}
	}

}

在这里插入图片描述
底层代码

public boolean equals(Object obj) {
		if (this == obj)						//调用的对象和传入的对象是同一个对象
			return true;						//直接返回true
		if (obj == null)						//传入的对象为null
			return false;						//返回false
		if (getClass() != obj.getClass())		//判断两个对象对应的字节码文件是否是同一个字节码
			return false;						//如果不是直接返回false
		Person other = (Person) obj;			//向下转型
		if (age != other.age)					//调用对象的年龄不等于传入对象的年龄
			return false;						//返回false
		if (name == null) {						//调用对象的姓名为null
			if (other.name != null)				//传入的对象姓名不等于null
				return false;					//返回false
		} else if (!name.equals(other.name))	//调用对象的姓名不等于传入对象的姓名
			return false;						//返回false
		return true;							//返回true

2,LinkedHashSet的概述

LinkedHashSet

  • 底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象
  • 因为是HashSet的子类,所以也是保证元素唯一的,于HashSet的原理一样

产生1到20 间的随机数并且不能重复(代码演示)

package com.heima.set;

import java.util.HashSet;
import java.util.Random;

public class Demo2 {
/*
 * 获取10个1至20 的随机数,要求随机数不能重复,并输出
 * 分析:
 * 1.有random类创建随机数对象
 * 2.需要存储10个随机数,而且不能重复,所以我们用hashset集合
 * 3.如果HashSet的size是小于10就可以不断存储,如果大于10就停止存储
 * 4.通过random类中的nextInt(n)方法获取1到20 之间的随机数,并将这些随机数存储在HashSet集合中
 * 5.遍历HashSet
 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//1.有random类创建随机数对象
		Random r = new Random();
		//2.需要存储10个随机数,而且不能重复,所以我们用HashSet集合
		HashSet<Integer> hs = new HashSet<Integer>();
		// 3.如果HashSet的size是小于10就可以不断存储,如果大于10就停止存储
		while(hs.size() < 10) {
		//4.通过random类中的nextInt(n)方法获取1到20 之间的随机数,并将这些随机数存储在HashSet集合中
			hs.add(r.nextInt(20) + 1);
		}
		// 5.遍历HashSet
		for (Integer integer : hs) {
			System.out.println(integer);
		}
	}

}

在这里插入图片描述

3,练习(在一个集合中存储无序并且重复的字符串,定义一个方法,让其有序(字典顺序)而且不能去重复)

package com.heima.set;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;

public class Demo3 {
/*
 * 在一个集合中存储无序并且重复的字符串,定义一个方法,让其有序(字典顺序)而且不能去重复
 * 
 * 分析:
 * 1.定义一个list集合,并存储重复的无序的字符串
 * 2.定义方法对其排序保留重复
 * 3.打印list集合
 */
	public static void main(String[] args) {
		//1.定义一个list集合,并存储重复的无序的字符串
		ArrayList<String> list = new ArrayList<>();
		list.add("aaa");
		list.add("aaa");
		list.add("ccc");
		list.add("ddd");
		list.add("afffffffff");
		list.add("adr");
		list.add("sdafsdf");
		list.add("bbbbbb");
		list.add("ewstw");
		
		//2.定义方法对其排序保留重复
		sort(list);
		
		//3.打印list集合
		System.out.println(list);
	}
/*
 * 定义方法,排序并保留重复
 * 分析:
 * 1.创建Treeset集合对象,因为本身就具备比较功能,但是重复的不会保留,所以我们用比较器
 * 2.将list集合中所有的元素添加到TreeSet集合中,对其排序,保留重复
 * 3.清空list集合
 * 4.将TreeSet集合中排好序的元素添加到list中
 */
private static void sort(ArrayList<String> list) {
	// TODO Auto-generated method stub
	//1.创建Treset集合对象,因为本身就具备比较功能,但是重复的不会保留,所以我们用比较器
	TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {

		@Override
		public int compare(String o1, String o2) {
			// TODO Auto-generated method stub
			int num = o1.compareTo(o2);		//比较内容为主要条件
			return num == 0 ? 1 : num;		//保留重复
		}
		
	});
	//2.将list集合中所有的元素添加到TreeSet集合中,对其排序,保留重复
	ts.addAll(list);
	//3.清空list集合
	list.clear();
	//4.将TreeSet集合中排好序的元素添加到list中
	list.addAll(ts);
	
}

}

其中

new Comparator<String>() {

		@Override
		public int compare(String o1, String o2) {
			// TODO Auto-generated method stub
			int num = o1.compareTo(o2);		//比较内容为主要条件
			return num == 0 ? 1 : num;		//保留重复
		}
		
	});           // 采用匿名内部类
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值