Java基础笔记总结(10)-集合(2)Set集合 HashSet LinkedHashSet TreeSet(Comparable与Comparator)

Set集合 -----保证元素唯一

HashSet实现了Set接口,不保证set的迭代顺序,允许存储null值

HastSet 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 ihs = new LinkedHashSet<>();

产生1-20个随机数,并且不能重复

Random random = new Random();

HashSet hs = new HashSet<>();

while(hs.size()<10){

    hs.add(random.nextInt(20)+1);

}

-------------------------------------------------------------------

去除字符串重复字符

String str = "aaabbbcccddd";

char[] arr = str.toCharArray();

HashSet hashSet = new HashSet<>();

for(char c :arr){

    hashSet.add(c);

}

-------------------------------------------------------------------

去除集合中的重复元素

LinkedHashSet linkedHashSet  = new LinkedHashSet<>();

List list = new List();

linkedHashSet.addAll(list);

list.clear();

list.addAll(linkedHashSet);

-------------------------------------------------------------------

TreeSet 存储

TreeSet ts = new TreeSet<>();

1、不能存入重复数据

2、对数据进行自动排序

二叉树 小的存储左边,大的存储右边,相等不存储

利用compareTo方法进行比较的返回值

返回0 集合只有一个元素

返回-1 存储在元素左边

返回1 存储在元素右边

需要在类上实现Comparable的接口

public int compareTo(Person o){

  return this.age-o,age;

}

-------------------------------------------------------------------------

TreeSet的比较器排序

需求 将字符串按照长度进行排序

class CompareByLen extends Object implements Comparator{

  public int compare(String o1,String o2){

int num = o1.length-o2.length;

        return num ==0?s1.compareTo(s2):num ;

}

TreeSet ts = new TressSet<>(new CompareByLen());

注意新进入的元素相当于s1 原来的元素相当于s2

对List用该方法只需要改写

return num ==0?1:num;

你可能感兴趣的:(Java基础笔记总结(10)-集合(2)Set集合 HashSet LinkedHashSet TreeSet(Comparable与Comparator))