单例集合List和Set

 首先了解集合框架构成:

 

 

首先了解到List与Set是单例集合Collection接口的两个重要子接口

1.LIst:有序,可重复的接口

  ---->ArrayList:主要实现类,底层使用Object[] 存储,效率高,但线程不安全

   Collections工具类中提供了将ArrayList转换为线程安全的方法

   ---->LinkedList:   频繁的插入和删除操作,使用该类,因为效率高,底层使用双向链表实现

     ---->Vector ;底层使用Object[] 存储,效率低,但线程安全 

 

面试题:你如何区分List接口下的三个实现类

ArrayList源码分析:jdk7:

1.1ArrayList:主要实现类,底层使用Objec[ ]存储,效率高,但线程不安全

package list;
/*
 * 增:add()
 * 删:remove()
 * 改:set(int index ,Object ele)
 * 查:get(int index)
 * 插:add(int index ,Object ele)
 * 遍历:iterator/增强for循环
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.Test;

public class ListTest {
    @Test
    public void test1() {
        List list =new ArrayList<>();
        list.add(123456);
        list.add(1, 66);
        System.out.println(list);
        //list.remove(1);
        System.out.println(list);
        System.out.println(list.size());
        list.set(1,  new String[]{"123","11"});
        /*for (Object obj : list) {
            System.out.println(obj);
        }*/
        Iterator it =list.iterator();
        while (it.hasNext()) {
            
            System.out.println(it.next());
        }        
        
    }
}

 

2. Set:不可重复,无序性的接口
  |--->HashSet:主要实现类,底层使用的数据结构,主要是hashMap()实现
        --->LinkedHashSet:HashSet的子类:底层使用数据结构+链表;可以按照添加元素的顺序实现遍历
  |--->TreeSet:底层使用红黑树实现;按照添加元素的指定属性大小实现遍历
   set在继承Collection基础上没有定义额外的方法
 无序性:指的是添加数据是,不是依次紧密排列
 不可重复性:添加到Set中的元素是不可重复的----->重写hashcode方法获取hash值,确保不重复
   set在开发中用来去重,确保重写的hashcode方法和equals方法一致

package list;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

/*
 * Set接口:存储是无序的,不可重复的
 * |--->HashSet:主要实现类,底层使用的数据结构
 *       --->LinkedHashSet:HashSet的子类:底层使用数据结构+链表;可以按照添加元素的顺序实现遍历
 * |--->TreeSet:底层使用红黑树实现;按照添加元素的指定属性大小实现遍历
 *
 * set在继承Collection基础上没有定义额外的方法
 * 无序性:指的是添加数据是,不是依次紧密排列
 * 不可重复性:添加到Set中的元素是不可重复的----->重写hashcode方法获取hash值,确保不重复
 * set在开发中用来去重,确保重写的hash方法和equals方法一致
 */
public class SetTest {
    @Test
    public    void test1(){    
        Set set=new HashSet<>();
        set.add("aa");
        set.add("ss");
        set.add("dd");
        set.add("dds");
        set.add("dxs");
        set.add(new Person("tom", 13));
        set.add(new Person("tom", 13));
        for (Object object : set) {
            System.out.println(object);
        }
    }
}

TreeSet:向TreeSet中添加数据,必须是同一个类创建的对象 ,必须指定排序方式

例如:定义一个person类,使用TreeSet集合装person类对象的数据,必须先重写该person类的hashCode方法和equals方法

  在使用TreeSet()时,确定他的排序方式,是自然排序还是自定义排序

 TreeSet指定自然排序,添加的数据必须是同一个类创建的对象,必须重写Equals()方法和hashCode()方法

package list;

import static org.hamcrest.CoreMatchers.instanceOf;

public class Person implements Comparable {
    private String name;
    private int age;
    
    
    
    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = 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 "Person [name=" + name + ", age=" + age + "]";
    }

//重写hashcode方法和equals方法
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

//定义自然排序
    @Override
    public int compareTo(Object o) {
        if (this ==o) {
            return 0;
        } 
        if (o instanceof Person) {
            Person p1=(Person) o;
            if( this.age-p1.age==0) {
                return this.name.compareTo(p1.name);
            }
        }
        throw new RuntimeException();
    }
    
    
    
}

 TreeSet指定定制排序,添加的数据必须是同一个类创建的对象,必须重写Equals()方法和hashCode()方法

/*
 * 要求:向TreeSet中添加的数据,必须是同一个类创建的对象
 *         向TreeSet中添加数据,必须指定排序方式
 */
public class TreeSetTest {
    
    public void test() {
        Set s=new TreeSet();
        
        s.add(new Person("jacklbo", 15));
        s.add(new Person("jaclbo", 15));
        s.add(new Person("lbo", 15));
        s.add(new Person("onglbo", 15));
        s.add(new Person("tonglbo", 15));
        
        for (Object object : s) {
            System.out.println(object);
        }
    }
    @Test
    public void test1() {
        Set s=new TreeSet();
        
        s.add(new Person("jacklbo", 15));
        s.add(new Person("jaclbo", 15));
        s.add(new Person("lbo", 15));
        s.add(new Person("onglbo", 15));
        s.add(new Person("tonglbo", 15));
Comparator com
=new Comparator() { //实现compartor,定制排序 @Override public int compare(Object o1, Object o2) { if (o1 instanceof Person && o2 instanceof Person) { Person p1=(Person) o1; Person p2=(Person) o2; return p1.getName().compareTo(p2.getName()); } return 0; } }; for (Object object : s) { System.out.println(object); } } }

 

posted @ 2020-03-01 16:17  我的二天  阅读(585)  评论(0编辑  收藏  举报