集合知识点总结1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cedille/article/details/78586913

集合就是一个已经封装好的对象

集合三大接口

Collection 所有集合类的跟接口

Map 映射接口,存放键值对

Iterator 遍历集合的迭代接口

Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。除Comparable位于Java.lang包


Collection单列集合的跟接口)<E>(泛型)1.2JDK版本

collection因为是接口不能实例化不能新建对象,所以要用实现类,那么要父类引用指向子类对象。

list有序(存和取的顺序一致),有索引可以储存重复

ArrayList-前缀告诉底层是数组,LinkedList-前缀告诉底层是链表实现的,Vector-前缀底层也是数组实现的,但是不遵循list命名。Vector出现比ArrayList要早,在JDK1.0版本的时候出现的,ArrayList则在1.2版本的时候出现的。

@SupperWarning(“rawtypes”,"unchecked")//保持类型,不检查,但没有加泛型,有一定的安全隐患

Collection a=new ArrayList();//父类引用指向子类对象
boolean b= a.add("abc");
boolean c=a.add(true);//自动装箱new boolean(true);
boolean d=a.add(100);
boolean e=a.add(new Client(“李四”,23));//将Client类的封装;
boolean f=a.add("abc")//能放进来重复的元素;
System.out.println(c);//==System.out.println(c.toString);实质上重写了,要往上父类、爷爷类查找。

return true;

return true;

return true;

return true;

return true;

[abc,true,100,Client[name=李四,age=23],abc]

如果是List集合一直返回true,因为可以存储重复元素。如果是Set集合当储存重复元素时候,就会返回false。


set无序(存和取的顺序不一致),无索引不可以储存重复,Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。Set接口中的方法和Collection接口一致。 

HashSet-底层哈希算法 TreeSet-底层二叉树算法

Set接口的常见实现类: 
HashSet:内部数据结构是哈希表,是不同步的。 
HashSet如何保证该集合中元素的唯一性: 
是通过对象的hashCode和equals方法啊来完成对象的唯一性的。如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。如果为true,视为相同元素,不存。如果为false。那么视为不同元素,就进行存储。 

如果元素存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals方法和hashCode方法,建立对象判断是否相同的依据。 
HashSet是无序的,但是下面的子接口LinkedHashSet是具有可预知迭代顺序的set接口的哈希表和链表实现的,有序。 
TreeSet:可以对Set集合中的元素进行指定顺序的排序。是不同步的。 
TreeSet如何保证该集合中元素的唯一性: 
就是根据比较方法compareTo的返回结果是否是0,是0,就判定为相同元素,不存。

TreeSet对元素进行排序的方式一: 
让元素自身具备比较功能,就需要实现Comparable接口。覆盖CompareTo方法。 
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。这个时候可以使用TreeSet集合的第二种排序方式。 
TreeSet集合的第二种排序方式二: 
让集合自身具备比较功能,定义一个类实现Comparator接口。覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。相对来说,这个方法比较常见。

HashSet例一:往hashSet集合中存储Person对象,如果姓名和年龄相同,视为同一个人(相同元素)。 
先新建一类Person:

public class Person {  

    private String name;  
    private int age;  
    public Person() {  
        super();  

    }  
    public Person(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  

    /** 
     * 覆盖Object类中的hashCode方法。建立Person对象自己特点的哈希值算法。 
     */  
    public int hashCode(){  
        //System.out.println(this+"...hascode...");
        return name.hashCode() + age*27;//乘以27是为了尽量保证哈希值唯一。  
    }  
    /**  
     * 覆盖Object类中的equals方法,建立Person对象判断是否相同的依据。 根据Person自身的特点来判断。  
     */  
    public boolean equals(Object obj){  
        //System.out.println(this+"...equals..."+obj);  
        if(!(obj instanceof Person))  
            return false;  

        Person p = (Person)obj;  

        return this.name.equals(p.name) && this.age == p.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;  
    }  

    @Override  
    public String toString() {  

        return name+":"+age;  
    }  

再新建HashSetTest类,进行存储与取出Person对象的操作:

/*
往hashSet集合中存储Person对象,如果姓名和年龄相同,视为同一个人(相同元素)。
 * */
public class HashSetTest {

    public static void main(String[] args) {
        HashSet hs=new HashSet();
        /*HashSet集合数据结构是哈希表,所以存储元素的时候,使用的元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同。*/
        hs.add(new Person("abc1",21));
        hs.add(new Person("abc2",22));
        hs.add(new Person("abc3",23));
        hs.add(new Person("abc4",24));
        hs.add(new Person("abc2",22));

        Iterator it=hs.iterator();
        while(it.hasNext()){
            Person p=(Person)it.next();//因为存入集合容器中的元素都会向上转型为Object类,会丢失掉Person类的特有属性,所以必须强制向下转型为Person类,才可以拿到它的name和age属性;另外,由于同时要拿两个属性,所以等于说it.next()取到的对象不止使用一次,必须用一个变量来接收。
            System.out.println(p.getName()+":"+p.getAge());
        }
    }
}

结果输出为: 
abc3:23 
abc2:22 
abc4:24 
abc1:21

Java集合关系图:


阅读更多
换一批

没有更多推荐了,返回首页