71.Java集合之ArrayList

ArrayList

--| Iterable
              ----| Collection
                 ------| List
                      ---------| ArrayList  底层采用数组实现,默认10。每次增长
                    60%,((oldCapacity * 3)/2 + 1) 查询快,增删慢。
                 ---------| LinkedList          

ArrayList:实现原理:

数组实现, 查找快, 增删慢

数组为什么是查询快?因为数组的内存空间地址是连续的.

   ArrayList底层维护了一个Object[] 用于存储对象,默认数组的长度是10。可以通过 new ArrayList(20)显式的指定用于存储对象的数组的长度。

   当默认的或者指定的容量不够存储对象的时候,容量自动增长为原来的容量的1.5倍。

由于ArrayList是数组实现, 在增和删的时候会牵扯到数组增容, 以及拷贝元素. 所以慢。数组是可以直接按索引查找, 所以查找时较快

可以考虑,假设向数组的0角标未知添加元素,那么原来的角标位置的元素需要整体往后移,并且数组可能还要增容,一旦增容,就需要要将老数组的内容拷贝到新数组中.所以数组的增删的效率是很低的.

 

练习:去除ArrayList集合中重复元素

      1:存入字符串元素

      2:存入自定义对象元素(如Perosn对象)

原理:

     循环遍历该集合,每取出一个放置在新的集合中,放置之前先判断新的集合是否以包含了新的元素。

思路:
 存入人的对象.
 1先定义person 类
 2将该类的实例存入集合
 3 将对象元素进行操作. 注意:自定义对象要进行复写toString 和 equals 方法.
 为什么? 因为object 是person 的父类,object 中的toString 返回的是哈希值,object 类中equals
 方法比较的是对象的地址值.
 思路
 1存入字符串对象 
 2存入自定义对象 如person
 2创建容器,用于存储非重复元素
 3对原容器进行遍历,在遍历过程中进行判断遍历到的元素是否在容器中存在.(contains)
 4如果存在,就不存入,否则存入.
 5 返回新容器
public class Demo6 {
    public static void main(String[] args) {
        ArrayList arr = new ArrayList();
        Person p1 = new Person("jack", 20);
        Person p2 = new Person("rose", 18);
        Person p3 = new Person("rose", 18);
        arr.add(p1);
        arr.add(p2);
        arr.add(p3);
        System.out.println(arr);
        ArrayList arr2 = new ArrayList();
        for (int i = 0; i < arr.size(); i++) {
            Object obj = arr.get(i);
            Person p = (Person) obj;
            if (!(arr2.contains(p))) {
                arr2.add(p);
            }
        }
        System.out.println(arr2);
    }
}

class Person {
    private String name;
    private int age;

    public Person() {

    }

    public Person(String name, int age) {

        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 int hashCode() {
        return this.name.hashCode() + age * 37;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Person)) {
            return false;
        }
        Person p = (Person) obj;

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

    @Override
    public String toString() {
        return "Person@name:" + this.name + " age:" + this.age;
    }

}

在实际的开发中ArrayList是使用频率最高的一个集合。

posted @ 2020-09-03 00:25  nohert  阅读(182)  评论(0编辑  收藏  举报