集合框架 Collection 接口的子接口set接口的特点及具体实现类HashSet、LinkedHashSet、TreeSet

Set接口:
特点:无序,值唯一(不允许重复)
具体实现类:

  • HashSet类:无序、值唯一
  • LinkedHashSet类:有序,值唯一
  • TreeSet类:自动排序,值唯一

HashSet类:无序、值唯一

package com.ztt.Demo02;

import java.util.Arrays;
import java.util.HashSet;

public class demo01 {
	public static void main(String[] args) {
		//添加新元素
		//特征1:不允许重复元素,如果存在元素存在,则返回false
	
		HashSet set=new HashSet();
		
		boolean isAdd1=set.add("1.小乔");
		System.out.println(isAdd1);
		
		boolean isAdd2=set.add("2.大乔");
		System.out.println(isAdd2);
		
		boolean isAdd3=set.add("3.小乔");
		System.out.println(isAdd3);
		
		//特征2:无序
		set.addAll(Arrays.asList("3.曹操","4.许诸","5.张辽","6.赵云","7.典韦","8.夏侯惇"));
		
		//输出
		System.out.println(set);
	}

}

运行结果:

true
true
true
[1.小乔, 7.典韦, 5.张辽, 3.小乔, 4.许诸, 8.夏侯惇, 2.大乔, 3.曹操, 6.赵云]

如何解决哈希冲突:

1、开放定址法:我们在遇到哈希冲突时,去寻找一个新的空闲的哈希地址 

2、再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。虽然不易发生聚集,但是增加了计算时间。

3、链地址法:将所有哈希地址相同的记录都链接在同一链表中。

4、建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。

package com.ztt.Demo02;

import java.util.HashSet;

public class demo02 {
	public static void main(String[] args) {
		//哈希冲突
		System.out.println("通话".hashCode());
		System.out.println("重地".hashCode());
		
		//通过当前保存的数据,计算哈希值
		//然后通过哈希值计算在哈希表中的下标
		String item = "诸葛亮";
		int hashCode = item.hashCode();
		System.out.println("哈希值:" + hashCode);
		System.out.println("下标值:" + hashCode%16);
		
		HashSet set = new HashSet();
		set.add(item);
	}
}

运行结果:

1179395
1179395
哈希值:35505067
下标值:11

遍历Set :

1.基于“迭代器"方式遍历Set(迭代器:遍历对应的集合)

2.foreach :迭代器方式的语法简化(语法糖)

package com.ztt.Demo02;

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

public class demo03 {
	public static void main(String[] args) {
		HashSet set=new HashSet();
		set.addAll(Arrays.asList("1.小乔","2.大乔","3.曹操","4.许诸","5.张辽","6.赵云","7.典韦","8.夏侯惇"));

		//基于“迭代器"方式遍历Set
		//迭代器:遍历对应的集合
		Iterator it=set.iterator();
		while(it.hasNext()) {
			String item=it.next();
			System.out.println(item);
			
			//foreach :迭代器方式的语法简化(语法糖)
//			for(String name:set) {
//				System.out.println(name);
//			}
		}
		
	}
}

运行结果:

1.小乔
7.典韦
5.张辽
4.许诸
8.夏侯惇
2.大乔
3.曹操
6.赵云

 LinkedHashSet有序、值唯一): 是HashSet类的子类,在原有基础上,多维护了一条链表,用于保存数据 

package com.ztt.Demo02;

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;

public class demo04 {
	public static void main(String[] args) {
		//无序
		HashSet set1=new HashSet();
		set1.addAll(Arrays.asList("1.小乔","2.大乔","3.曹操","4.许诸","5.张辽","6.赵云","7.典韦","8.夏侯惇"));
		
		//有序: HashSet类的子类,在原有基础上,多维护了一条链表,用于保存数据
		LinkedHashSet set2=new LinkedHashSet();
		set2.addAll(Arrays.asList("1.小乔","2.大乔","3.曹操","4.许诸","5.张辽","6.赵云","7.典韦","8.夏侯惇"));
		
		System.out.println(set1);
		System.out.println(set2);
	}
}

运行结果:

[1.小乔, 7.典韦, 5.张辽, 4.许诸, 8.夏侯惇, 2.大乔, 3.曹操, 6.赵云]
[1.小乔, 2.大乔, 3.曹操, 4.许诸, 5.张辽, 6.赵云, 7.典韦, 8.夏侯惇]

过滤重复字符 

package com.ztt.Demo02;

import java.util.LinkedHashSet;

public class demo05 {
	public static void main(String[] args) {
		String s="莺莺燕燕袅袅花唧唧复唧唧";
		
		//过滤重复字符
		LinkedHashSet set=new LinkedHashSet();
		for(int i=0;i

运行结果:

重复字符:莺
重复字符:燕
重复字符:袅
重复字符:唧
重复字符:唧
重复字符:唧
[莺, 燕, 袅, 花, 唧, 复]

TreeSet类:(自动排序,值唯一) 

构造方法,允许传入一个Comparator接口的比较器

package com.ztt.Demo02;

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

public class demo06 {
	public static void main(String[] args) {
		//一个包含重复字符串的数组
		String[] ans = {"ABC","AB","ABCD","A","DEF","BCD","AC","BCD","ABCDE","B","AD","A","BCD","ABCD"};
		
		//需求1:过滤重复字符串
		//需求2:自动排序(先按长度,如果长度一致,再按照内容比较)
		
		//构造方法,允许传入一个Comparator接口的比较器
		TreeSet set=new TreeSet(new Comparator() {

			@Override
			public int compare(String o1, String o2) {
				if(o1.length() != o2.length()) {
					//按照长度比较
					return o1.length()-o2.length();
				}else {
					//按照内容比较
					return o1.compareTo(o2);
				}
				
			}
			
		});
		for(String s:ans) {
			set.add(s);
		}
		
		for(String s:set) {
			System.out.println(s);
		}

	}

}

运行结果:

A
B
AB
AC
AD
ABC
BCD
DEF
ABCD
ABCDE

 

你可能感兴趣的:(哈希算法,散列表,算法,java,开发语言)