zoukankan      html  css  js  c++  java
  • 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是使用频率最高的一个集合。

    author@nohert
  • 相关阅读:
    计算机是如何启动的
    比特币
    区块链技术
    哈夫曼树与哈夫曼编码
    Prim Algoritm(最小生成树)
    机器学习概述总览
    线性查找算法(BFPRT)
    DFS(深度优先搜索)
    BFS(广度优先搜索)
    (Dijkstra)迪杰斯特拉算法-最短路径算法
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13605285.html
Copyright © 2011-2022 走看看