Java -集合(Set接口)

Set接口

1 特点

​ 无序且不可重复

2 三种实现类的数据类型与特点

​ a. HashSet
​ 数据结构:hash表(一维数组)
​ 特点:无序且不可重复
​ b. LinkedHashSet
​ 数据结构:双向链表
​ 特点:有序且去重(添加了双向链表的数据结构)
​ ps:
​ 继承关系:class LinkedHashSet extends HashSet
​ c. TreeSet
​ 数据结构:二叉树
​ 特点:根据元素类型自然排序

3 HashSet

3.1 HashSet的使用

package com.qf.hashset_class;

import java.util.HashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class Test01 {
	/**
	 * 知识点:HashSet的使用
	 */
	public static void main(String[] args) {
		
		HashSet<String> set = new HashSet<>();
		
		//添加数据
		set.add("小希");
		set.add("小空");
		set.add("小丽");
		set.add("小光");
		set.add("小步");
		
		//获取元素个数
		int size = set.size();
		System.out.println("获取元素个数:" + size);//5
		
		HashSet<String> newSet1 = new HashSet<>();
		Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
		set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里
		
		//清空集合里所有的元素
		//set.clear();
		
		System.out.println("判断集合中是否包含指定元素:" + set.contains("小康"));//false
		System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true
		
		//没有-true,有-false
		System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false
		
		set.remove("小丽");//通过数据删除元素
		set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集)
		
		HashSet<String> newSet2 = new HashSet<>();
		Collections.addAll(newSet2, "小希","小丽","小步");
		set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集)
		
		//将集合转换为数组
		Object[] array1 = set.toArray();
		System.out.println(Arrays.toString(array1));//[小步, 小希]
		
		//将集合转换为指定类型的数组
		String[] array2 = new String[2];
		set.toArray(array2);
		System.out.println(Arrays.toString(array2));//[小步, 小希]
		
		System.out.println("-----------------------------------------");
 
		//遍历集合 -- foreach
		for (String element : set) {
			System.out.println(element);
		}
		
		System.out.println("-----------------------------------------");
		
		//遍历集合 -- Iterator
		Iterator<String> it = set.iterator();
		while(it.hasNext()){//判断是否有可迭代的元素
			String next = it.next();//获取下一个元素
			System.out.println(next);
		}
		
	}
}

3.2 HashSet的特点

package com.qf.hashset_class;

import java.util.HashSet;

public class Test02 {
	/**
	 * 知识点:HashSet的特点
	 * 
	 * 特点:无序且去重
	 * 
	 * 添加步骤:
	 * 		1.获取元素的hash值 -- hashCode()
	 * 		2.通过hash值计算在数组中的下标
	 * 		3.判断下标上是否有元素
	 * 			3.1 没有元素 -- 直接添加
	 * 			3.2 有元素 ---- 判断两个对象是否相同 hash && (==||equals())
	 * 				3.2.1  相同 -- 不添加数据(达到去重效果)
	 * 				3.2.2 不相同 -- 形成单向链表(JDK1.7头插法、JDK1.8尾插法)
	 * 
	 * 遍历步骤:
	 * 		遍历数组(顺序遍历)
	 * 
	 * 注意:添加步骤处理数据的逻辑和遍历步骤处理数据的逻辑不一样,导致无序
	 * 
	 * 
	 */
	public static void main(String[] args) {
		
		HashSet<String> set = new HashSet<>();
		
		set.add("aaa");
		set.add("bbb");
		set.add("ccc");
		set.add("ccc");
		set.add("Aa");
		set.add("BB");
		
		for (String element : set) {
			System.out.println(element);
		}
	}
}

4 LinkedHashSet

4.1 LinkedHashSet的使用

package com.qf.linkedhashset_class;

import java.util.LinkedHashSet;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class Test01 {
	/**
	 * 知识点:LinkedHashSet的使用
	 */
	public static void main(String[] args) {
		
		LinkedHashSet<String> set = new LinkedHashSet<>();
		
		//添加数据
		set.add("麻生希");
		set.add("椎名空");
		set.add("水菜丽");
		set.add("朝桐光");
		set.add("樱井步");
		
		//获取元素个数
		int size = set.size();
		System.out.println("获取元素个数:" + size);//5
		
		LinkedHashSet<String> newSet1 = new LinkedHashSet<>();
		Collections.addAll(newSet1, "aaa","bbb","ccc","ccc");//利用集合工具类(Collections)批量添加元素
		set.addAll(newSet1);//将newSet1中所有的元素都添加到set集合里
		
		//清空集合里所有的元素
		//set.clear();
		
		System.out.println("判断集合中是否包含指定元素:" + set.contains("侯小康"));//false
		System.out.println("判断集合中是否包含指定集合:" + set.containsAll(newSet1));//true
		
		//没有-true,有-false
		System.out.println("判断集合里是否没有元素:" + set.isEmpty());//false
		
		set.remove("水菜丽");//通过数据删除元素
		set.removeAll(newSet1);//将set中有newSet1的元素全部删除(去除交集)
		
		LinkedHashSet<String> newSet2 = new LinkedHashSet<>();
		Collections.addAll(newSet2, "麻生希","水菜丽","樱井步");
		set.retainAll(newSet2);//将set中有newSet2的元素全部保留(保留交集)
		
		//将集合转换为数组
		Object[] array1 = set.toArray();
		System.out.println(Arrays.toString(array1));//[樱井步, 麻生希]
		
		//将集合转换为指定类型的数组
		String[] array2 = new String[2];
		set.toArray(array2);
		System.out.println(Arrays.toString(array2));//[樱井步, 麻生希]
		
		System.out.println("-----------------------------------------");
 
		//遍历集合 -- foreach
		for (String element : set) {
			System.out.println(element);
		}
		
		System.out.println("-----------------------------------------");
		
		//遍历集合 -- Iterator
		Iterator<String> it = set.iterator();
		while(it.hasNext()){//判断是否有可迭代的元素
			String next = it.next();//获取下一个元素
			System.out.println(next);
		}
		
	}
}

4.2 LinkedHashSet的特点

package com.qf.linkedhashset_class;

import java.util.LinkedHashSet;

public class Test02 {
	/**
	 * 知识点:LinkedHashSet的特点
	 * 
	 * 继承关系:class LinkedHashSet extends HashSet
	 * 特点:有序且去重
	 * 
	 * 添加步骤:
	 * 		在父类HashSet的基础上,添加的元素会存储上一个元素的地址,
	 * 		上一个元素也会存储下一个元素的地址 -- 双向链表
	 * 
	 * 遍历步骤:
	 * 		找到第一个元素,再向下依次找下一个元素
	 * 
	 */
	public static void main(String[] args) {
		
		LinkedHashSet<String> set = new LinkedHashSet<>();
		
		set.add("aaa");
		set.add("bbb");
		set.add("ccc");
		set.add("ccc");
		set.add("Aa");
		set.add("BB");
		
		for (String element : set) {
			System.out.println(element);
		}
	}
}

5 TreeSet

5.1 TreeSet的使用(同HashSet-略)

5.2 TreeSet的特点

package com.qf.treeset_class;

import java.util.TreeSet;

public class Test02 {
	/**
	 * 知识点:TreeSet的特点
	 * 
	 * 特点:自然排序(TreeSet会根据不同的类型使用不同的排序规则)
	 */
	public static void main(String[] args) {
		
		//TreeSet存储String -> 字典排序
		TreeSet<String> set1 = new TreeSet<>();
		
		set1.add("a");
		set1.add("c");
		set1.add("e");
		set1.add("bc");
		set1.add("bb");
		
		for (String element : set1) {
			System.out.println(element);
		}
		
		System.out.println("-----------------------------");
		
		//TreeSet存储Integer -> 数字升序
		TreeSet<Integer> set2 = new TreeSet<>();
		
		set2.add(3);
		set2.add(5);
		set2.add(1);
		set2.add(2);
		set2.add(4);
		
		for (Integer element : set2) {
			System.out.println(element);
		}
	}
}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值