黑马程序员技术交流社区

标题: 刚学完集合,老师说ArrayList很常用 [打印本页]

作者: yangshaoqiang    时间: 2015-10-24 00:13
标题: 刚学完集合,老师说ArrayList很常用
2.2.2.        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是使用频率最高的一个集合。

作者: 赵飞    时间: 2015-10-25 17:50
不错不错
作者: samge    时间: 2015-10-25 23:13
来学习学习啦,谢谢分享哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2