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