Java合集之Set

hello,家人们,昨天外面学习了List,今天我们接着学下面的内容,set!!!

目录

一.🥘🥘Set的特点

二.🍟🍟Set的遍历

三.🍖🍖Set的扩容

四.🍉🍉Set的实现方法


一.🥘🥘Set的特点

无序,不重复

二.🍟🍟Set的遍历

foreach,迭代器

三.🍖🍖Set的扩容

初始容量16,负载因子0.75,扩容增量1倍

四.🍉🍉Set的实现方法

  • HashSet

1.    HashSet概述:

   HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素

2.   HashSet的类图:

3.     HashSet的特点

  • HashSet不能存储重复元素
  • HashSet不能确保插入顺序
  • HashSet是非线程安全的

HashSet中没有重复元素,允许有一个为null
HashSet底层使用了哈希表来支持的,特点:存储快
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,然后通过元素 的哈希值经过移位等运算,就可以算出该元素在哈希表中 的存储位置。
1.如果算出的元素存储的位置目前没有任何元素存储,那么该元素可以直接存储在该位置上
2. 如果算出的元素的存储位置目前已经存在有其他的元素了,那么还会调用该元素的equals方法
与该位置的元素再比较一次,如果equals方法返回的是true,那么该位置上的元素视为重复元
素,不允许添加,如果返回的是false,则允许添加

  • TreeSet

1.  TreeSet的实现原理

TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,java.io.Serializable接口.

一种基于TreeMap的NavigableSet实现

2.   TreeSet的类图

3.    TreeSet的特点

TreeSet是用于对元素进行排序的有序集合类,不允许有重复的元素
TreeSet也是不保证元素的顺序与插入的顺序一致,TreeSet是会对元素进行排序

TreeSet数据结构:二叉树
特点:元素是有大小顺序的

  • TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string
  • TreeSet在遍历集合元素时,是有顺序的【从小到大】(我的理解,如果存的字母,按字典序排列)
  • 排序:当向TreeSet中添加自定义对象时,有2种排序方法:
  • 1:自然排序
  • 2:定制排序自然排序:要求自定义类实现java.lang.Comparable接口并重写compareTo(Object obj)方法。在此方法中,指明按照自定义类的哪个属性进行排序

 4.  实例

第一件事情就是导入jar包

第二件事情就是建一个com.xxx.jeelistdemo的包,

然后我们在类中定义两组数据

	
	private List<Integer> list=new ArrayList<Integer>();
	private Set<Integer>  set=new HashSet<>();
	
	
	
	
	@Before
	public void setup() {
		list.add(1);
		list.add(2);
		list.add(9);
		list.add(9);
		list.add(6);
		
		set.add(1);
		set.add(1);
		set.add(5);
		set.add(4);
		set.add(2);
		set.add(3);
	}

第一种去重方法:

@Test
	public void Test01() {
		List<Integer> tmp=new ArrayList<Integer>(new HashSet<Integer>(list));
	  System.out.println(tmp);
	}

点击@Test旁边,右击点击图中的指标执行

执行结果:

第二种方法:

@Test
	public void Test02() {
		for (Integer i : set) {
			System.out.println(i);
		}
	}

运行结果:

第三种方法:

@Test
	public void Test03() {//利用迭代器
		Iterator<Integer> it=set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}

运行结果:

第四种方法:

@Test
	public void Test04() {
		Set<Student> str=new HashSet<>();
		
		str.add(new Student(1,"小华",24));
		str.add(new Student(2,"小k",35));
		str.add(new Student(2,"小k",35));
		str.add(new Student(3,"小七",2));
		str.add(new Student(4,"小李",22));
		str.add(new Student(5,"小平",9));
		str.add(new Student(6,"小尼",11));
	
		for (Student s : str) {
			System.out.println(s);
		}
		
	}

运行结果:

第五种方法:

@Test
	public void Test05() {
		TreeSet<Student> str=new TreeSet<>(new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				return o1.getAge()-o2.getAge();  
			}
			
		});
		
		str.add(new Student(1,"小华",24));
		str.add(new Student(2,"小k",35));
		str.add(new Student(2,"小k",35));
		str.add(new Student(3,"小七",2));
		str.add(new Student(4,"小李",22));
		str.add(new Student(5,"小平",9));
		str.add(new Student(6,"小尼",11));
	
		for (Student s : str) {
			System.out.println(s);
		}
		
	}

运行结果:

第六种方法:

@Test
	public void Test06() {
		set.remove(3);//删的是一个对象!!
		System.out.println(set);
	}

运行结果:


家人们,今天的小课堂的知识到这里就结束啦~ 咱们下期见

今天也要记得微笑呀.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值