集合框架(ArrayList去重复)和(Hashset和Treeset的结构特点)

    xiaoxiao2021-04-15  184

    集合框架

    集合框架ArrayList中的重复元素去重及其底层原理 判断list 集合中元素是否相同,原理是arrayList调用Contains()的方法,当调用Contains()方法时会自动调用它的底层equals()的方法,我们要将原有的集合遍历,再将遍历后的元素存放到新的集合中,存放前做一个判断,再重写equals()的方法。

    package com.wangshoyang.collection;

    import java.util.ArrayList; import java.util.Iterator;

    import sun.net.www.content.text.plain;

    public class ListDemo2 { public static void main(String[] args) { ArrayList list = new ArrayList<>(70);

    list.add(new Person("lll",17)); list.add(new Person("xxxx",19)); list.add(new Person("dddd",45)); list.add(new Person("wsy",21)); list.add(new Person("lll",17));

    // System.out.println(list.size());

    ArrayList singleList=singleList(list); Iterator it=singleList.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } public String toString() { return super.toString(); } /** * 思路 * 将原有的集合遍历 *遍历后元素放到新的集合中 *存放前做一个字符串的判断 * *java.lang.String是不是被重写过? * @param list * @return */ private static ArrayList singleList(ArrayList list) { ArrayList newAl=new ArrayList<>(); Iterator it=list.iterator(); while(it.hasNext()) { Object obj=it.next(); if(!newAl.contains(obj)) { newAl.add(obj); } } return newAl; }

    } class Person { private String name; private int age;

    public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } public Person() { super(); } public boolean equals(Object obj) { if(obj instanceof Person) { Person p=(Person) obj; System.out.println(this.getName()+"equlas" +p.getName()); return this.getName().equals(p.getName())&&this.getAge()==p.getAge(); } return false; } public String toString() { return "Person [name="+name+",age="+age+"]"; }

    } 这样我们可以看到加入的两个lll只有一个出来了 Set集合 set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法)。

    1、HashSet HashSet的特点:数据结构是哈希表、元素是无序(存入和取出的顺序不一定一致),字符串元素不可以重复;

    探究HashSet判断元素重复问题 原理:利用HashSet调用add方法的同时底层会自动调用HashCode()和equals()方法,重写两个方法,HashCode()比较的是内存地址,equals()比较的是元素内容

    package com.wangshoyang.collection.set; import java.util.HashSet; import java.util.Iterator;

    /**

    hashset本身具备去重复的功能 那么需要奥探究HashSet为什么能够去重复 它依靠的是啥?@author wsy

    */

    public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet();

    hs.add(new Person("QAQA",123)); hs.add(new Person("AAA",13)); hs.add(new Person("BBB",15)); hs.add(new Person("QQWQ",88)); hs.add(new Person("QAQA",123)); Iterator it = hs.iterator(); while (it.hasNext()) { System.out.println(it.next()); } }

    }

    class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(String name, int age) { super(); this.name = name; this.age = age; } /** * 返回值代表容器中具体的位置的坐标 */ public int hashCode() { return this.getName().hashCode() + this.age; } public Person() { super(); } public boolean equals(Object obj) { if (obj instanceof Person) { Person p = (Person) obj; System.out.println(this.getName() + "equlas" + p.getName()); return this.getName().equals(p.getName()) && this.getAge() == p.getAge(); } return false; } public String toString() { return "Person1 [name=" + name + ",age=" + age + "]"; } public int compareTo(Person o) { int num=this.getAge() - o.getAge(); if(num==0) { return this.getName().compareTo(o.getName()); } return num; }

    } 这样我们就可以得出只有一个QAQA了 2、集合框架TreeSet 2.1、TreeSet自然排序 TreeSet可以对set集合中元素进行排序,String实现了Comparable接口,所以可以直接进行排序,引用数据类型想要排序,必须实现Comparable接口,其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。注意:排序时,当主要条件相同时,一定要判断次要条件。

    TreeSet是SortedSet接口的实现类,TreeSet可以保证了集合元素处于排序状态(所谓排序状态,就是元素按照一定的规则排序,比如升序排列,降序排列)。 与HashSet集合相比。 Comparator comparator():如果TreeSet采用了定制排序,则该方法返回定制排序所使用的Comparator,如果采用了自然排序,则返回null。 Object first(): 返回集合中的第一个元素。 Object last():返回集合中的最后一个元素。 Object lower(Object e):返回集合中位于指定元素e之前的元素(即小于指定元素的最大元素,参考元素e不必是集合中的元素)。 Object higher(Object e): 返回集合中位于指定元素e之后的元素(即大于指定元素的最小元素,参考元素e不必是集合中的元素)。 SortedSet subSet(Object fromElement, Object toElement): 返回集合中所有在fromElemt和toElement之间的元素(包含fromElent本身,不包含toElement本身)。 SortedSet headSet(Object toElement): 返回此set的子集,由小于toElement的元素组成。 SortedSet tailSet(Object fromElement):返回此set的子集,由大于或等于fromElement的元素组成。


    最新回复(0)