Set集合 -----保证元素唯一
HashSet实现了Set接口,不保证set的迭代顺序,允许存储null值
HastSet<String> hs = new HashSet<>();
如果是重复元素值,会返回false
HashSet的继承体系有重写toString()
由于Set集合中无索引,不可以重复,存取顺序不一致(无序)。----->位置随机存放
只要能用迭代器迭代,既可以使用foreach
--------------------------------------------------------------------------------------------------------------------------------------------
存储自定义对象,并保证元素的唯一性(重写hashCode()和equals()方法)
如果不重写,说明其内部元素
public boolean equals(Object obj){
Person p = (Person)obj;
return this.name.equals(p.name);
}
public in hashCode(){
final int NUM = 38;
return name.hashCode()*NUM+age;
}
HashSet有筒结构,优化结构
------------------------------------------------------------------------------------------------------------------------------------------
HashSet如何保证元素唯一性的原理
hashCode中为什么prime是31,31是质数,能被1和自身整除,这个数字不大不小,且数字好计算 是2的五次方-1,2左移五位再减1
该方法 属性相同的对象返回值必须相同,属性不同的返回值尽量不同
如果两个引用中,自己指向自己,则返回true
如果传入对象为null,调用引用指向返回引用,会返回false
再比较两个对应的字节码文件是否是同一个,需要判断
再向下转型,比较类的属性值
true不存,false存入
-------------------------------------------------------------------
LinkedHashSet 存取的顺序一致,并且不能写入重复元素
LinkedHashSet<String> ihs = new LinkedHashSet<>();
产生1-20个随机数,并且不能重复
Random random = new Random();
HashSet<Integer> hs = new HashSet<>();
while(hs.size()<10){
hs.add(random.nextInt(20)+1);
}
-------------------------------------------------------------------
去除字符串重复字符
String str = "aaabbbcccddd";
char[] arr = str.toCharArray();
HashSet<Character> hashSet = new HashSet<>();
for(char c :arr){
hashSet.add(c);
}
-------------------------------------------------------------------
去除集合中的重复元素
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
List<String> list = new List<String>();
linkedHashSet.addAll(list);
list.clear();
list.addAll(linkedHashSet);
-------------------------------------------------------------------
TreeSet 存储
TreeSet<Integer> ts = new TreeSet<>();
1、不能存入重复数据
2、对数据进行自动排序
二叉树 小的存储左边,大的存储右边,相等不存储
利用compareTo方法进行比较的返回值
返回0 集合只有一个元素
返回-1 存储在元素左边
返回1 存储在元素右边
需要在类上实现Comparable<T>的接口
public int compareTo(Person o){
return this.age-o,age;
}
-------------------------------------------------------------------------
TreeSet的比较器排序
需求 将字符串按照长度进行排序
class CompareByLen extends Object implements Comparator<String>{
public int compare(String o1,String o2){
int num = o1.length-o2.length;
return num ==0?s1.compareTo(s2):num ;
}
}
TreeSet<String> ts = new TressSet<>(new CompareByLen());
注意新进入的元素相当于s1 原来的元素相当于s2
对List用该方法只需要改写
return num ==0?1:num;