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