java基础——集合总结

时间:2022-03-27 16:17:50

先来看看集合类型的整体框架图java基础——集合总结

 

首先看看集合的第一大体系collection

java基础——集合总结

collection常见的方法java基础——集合总结

 

collection中set和list的区别

java基础——集合总结

 

集合第二大方面Map

 

java基础——集合总结=java基础——集合总结

===========================================================以下为文字总结=================================================

 

集合排序总结

list: 元素是有序的,元素可以重复,因为该集合体系有索引(脚标)

        常用的子类对象:     面试题重点

        ArrayList 底层的数据结构是使用的数组结构 特点:查询速度快,但是增删比较慢

       LinkedList底层的数据结构使用的是链表结构 特点:增删速度快,但是查询比较慢

        Vector   底层是数组数据结构。线程同步,ArrayList线程不同步,替代了vector 

ArrayList 是可变长度数组,默认长度是10,当添加的元素大于10时,系统自动new一个新的数组且增长原数组的一半长度,并把之前的元 素复制到这个新数组中,vector和它一样,但是延长一倍。

   Arraylist判断和删除元素只依赖于元素自身的equals方法,而hashSet依赖的是hashCode和equals方法,且先判断hashcode不同时,才调用equals方法

关于ArrayList添加对象,自定义判断条件问题以及HashSet集合添加自定义对象问题

虽然两个集合的底层结构不同,但是他们都调用添加对象类中的equals方法,而

   

    ArrayList是通过contains()方法让系统自动调用equals方法

   

    HashSet是通过当add添加元素的时候 系统自动调用hashCode()方法判断hash值

    如果相等则不会被添加,如果相等,再通过hashCode方法调用equals方法判断。

    一般添加的时候都会在类中重写hashCode 和equals以满足实际条件的需求。

    但是,ArrayList和HashSet重写Object类中的equals方法原理都是一样的。

 

例如:         

class Person

{

    private String name;

    private int age;

    Person(String name,int age)

    {

        this.name=name;

        this.age=age;

    }

    public String getName()

    {

        return name;

    }

    public int getAge()

    {

        return age;

    }

此equals是重写Object中的equals方法

obj形参 实参是contains中的,相当于obj=new Person("xiaoxiao11",15); 多态

    public boolean equals(Object obj)

    {

       

判断传进来的对象是否是Person对象不是的话就返回false

        if (!(obj instanceof Person)) 

        {

            return false;

        }

 

因为穿参传进来的对象是Object的子类对象,体现多态性,必须向下转型

        Person p=(Person)obj;

   

        return this.name.equals(p.name)&&this.age==p.age;  

而return中的equlas是字符串中的equals方法~~!比较字符串对象的内容是否相同

    }

 

}

 

 Set:无序,不可重复元素

       HashSet: 数据结构是哈希表,线程是非同步的。

                  保证元素唯一性的原理,判断元素的hashCode值是否相同

                  如果相同,还会继续判断元素的equals方法,是否为true。

 

例:

class 

{

    public static void main(String[] args)

    {

        HashSet users=new HashSet();

        users.add(new User("张三",28));

        users.add(new User("李四",25));

        users.add(new User("王五",20));

        System.out.println(users.size());

 

        users.remove(new User("张三",28));

        System.out.println(users.size());

    }

}

/*在删除元素前打印出的集合中的元素个数是3,删除后再次打印的集合中的

元素个数还是3,这个结果是错误的。这是因为User类虽然覆盖了equals()

方法,但是没有覆盖hashCode()的方法,当两个User实例对象的equals方法

比较的结果相等时,而这两个对象的哈希码却不同,所以导致他们存储进

HashSet集合中出现了问题,为了修正这个问题,应该保证两个User实例对象

的equals方法比较结果相等时,他们的哈希码也相等。

 

通常,用一个类的两个实例对象用equals()方法比较结果相等时,那他们的

哈希码也必须相等,反之不成立。哈希码相等时,他们的不一定equals。

 

当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与

计算的哈希值的字段了,否则,对象修改后的哈希值与最初存储进hashSet集合

时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前

应用作为的参数去HashSet集合中检索对象,也将返回找不到的对象的结果,这

也会导致无法从hashSet集合中单独删除当前对象,从而造成内存泄漏。*/

 

 

 

 

 

        TreeSet: 可以对Set集合中的元素进行排序。底层数据结构是二叉树。

 

关于TreeSet添加自定意对象,让其排序的问题。有两种方式

 

    第一种   让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖

             compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序

            class Student implements Comparable<Student>

            {

                private String name;

                private int age;

                Student(String name,int age)

                {

                    this.name=name;

                    this.age=age;

                }

        当在TreSet中添加对象的时候底层自动调用Comparable接口中的compareTo方法

        class Student implements Comparable <Student>

        {

            private String name;

            private int age;

            Student(String name,int age)

            {

                this.name=name;

                this.age=age;

            }

            public int compareTo(Student s)

            {

                System.out.println(this.name+"...compareto...."+s.name);

                int num= new Integer(this.age).compareTo(new Integer (s.age));

                if(num==0) 

                    return this.name.compareTo(s.name);//比较名字是否相同时次要条件

                return num;

            }

 

            public String getName()

            {

                return name;

            }

            public int getAge()

            {

                return age;

            }

        }

第二种:    当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让

            集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,

            即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。

            比较器--定义一个类,实现Comparator接口,覆盖compare方法。

            而当两种排序都存在时以比较器为主

            使用了泛型--在集合初始化时把new Mycomparator()以构造方法传参传进去即可

            class Mycomparator implements Comparator<String>

            {

                public int compare(String o1,String o2)

                {

 

                    int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));

                    if (num==0)

                    {

                        return o1.compareTo(o2);

                    }

                    return num;

                }

            }