Java ArrayList与Vector和LinkedList的使用及源码分析
ArrayList是List接口实现类中的其中一个(重点):
- 数组结构实现,查询快,增删慢
- jdk1.2版本,运行效率快、线程不安全。
ArrayList的使用:和之前使用的类似。
直接看代码:
主类:
package com.collections.test; import Java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; public class Demo02 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); Student s1 = new Student("aaa",18); Student s2 = new Student("bbb",19); Student s3 = new Student("ccc",20); // 添加 arrayList.add(s1); arrayList.add(s2); arrayList.add(s3); System.out.println("元素个数:"+arrayList.size()); System.out.println(arrayList.toString()); // 删除 // arrayList.remove(s1); // 重写equal方法,使equal方法www.devze.com比较的是属性后,可以进行如下删除 arrayList.remove(new Student("aaa",18)); System.out.println("删除后:"+arrayList.size()); System.out.println(arrayList.toString()); // 遍历 // 使用迭代器 System.out.println("----------使用迭代器--------------"); Iterator it = arraphpyList.iterator(); while (it.hasNext()){ Student s = (Student) it.next(); System.out.println(s); } System.out.println("----------列表迭代器正序--------------"); // 列表迭代器 ListIterator listIterator = arrayList.listIterator(); while (listIterator.hasNext()){ Student s = (Student) listIter开发者_JAVA学习ator.next(); System.out.println(s); } System.out.println("----------列表迭代器逆序--------------"); while (listIterator.hASPrevious()){ Student s = (Student) listIterator.previous(); System.out.println(s); } } }
Student类:重写了equal方法,使比较方法变为属性之间的比较。
package com.collections.test; import java.util.Objects; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { retandroidurn 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 "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object obj) { // 1.判断是不是同一类型 if(this==obj){ return true; } if(obj==null){ return false; } // 3.判断是否是Student类型 if(obj instanceof Student){ // 强制类型转换 Student s = (Student)obj; if(s.age == this.age && s.name == this.name){ return true; } } return false; } }
删除和添加可以直接输入属性添加了。
运行结果:
ArrayList源码分析:
1.进入ArrayList源码中,先记住几个变量。
往下还有个size,表示元素个数。
重点记住三个:
默认容量DEFAULT_CAPACITY = 10、存放元素的数组:elemtData 和 实际元素个数size()
往下翻:
因为我们引用的是无参构造方法,有参就跳过,直接看无参的。
也就是说,当没有向集合中添加任何元素时,集合容量为0
当我们添加元素时,也就是add()方法,会是什么情况?进入到add源码中查看。
我们再进入到这方法中来看:
也就是说,当向集合中添加了1个元素时,集合容量就变为10。
如果添加了超过10个元素,会进行扩容,还是和上述方法一样,一步一步看下来,会发现:
当输入第11个元素时,容量最后会变成15,也就是说,每次扩容会是原来的1.5倍。 其实就是上述第11步的右移一位,相当于加上了原来值的二分之一,也就是1.5倍。
总结一下:
如果集合中没有元素时,容量为0,如果添加了一个元素,集合会是默认容量10,如果超出容量大小,会进行扩容,每次容量时原来的1.5倍。
源码查看:ctrl+鼠标左键。
Vector的使用:
直接看代码:
package com.collections; import java.util.Enumeration; import java.util.Vector; //Vector集合的使用 //存储方式:数组 public class Demo04 { public static void main(String[] args) { Vector vector = new Vector(); // 添加 vector.add("苹果"); vector.add("梨子"); vector.add("西瓜"); System.out.println("元素个数为:"+vector.size()); // 枚举器遍历 Enumeration elements = vector.elements(); while (elements.hasMoreElements()){ String s = (String) elements.nextElement(); System.out.println(s); } System.out.println("-----------------------------------"); // 其他方法firstElement 第一个元素 lastElement最后一个元素 elementAt()位置遍历 System.out.println(vector.firstElement()); System.out.println(vector.lastElement()); System.out.println(vector.elementAt(2)); } }
LinkedList的使用:
package com.collections.test; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.ListIterator; //LinkList的使用 public class Demo03 { public static void main(String[] args) { LinkedList linkedList = new LinkedList(); Student s1 = new Student("aaa",18); Student s2 = new Student("bbb",19); Student s3 = new Student("ccc",20); // 添加 linkedList.add(s1); linkedList.add(s2); linkedList.add(s3); System.out.println("元素个数:"+linkedList.size()); System.out.println(linkedList.toString()); // 删除 // linkedList.remove(s1); System.out.println("删除后:"+linkedList.size()); System.out.println(linkedList.toString()); // 遍历 // for 循环 System.out.println("----------for循环--------------"); for (int i = 0; i <linkedList.size() ; i++) { System.out.println(linkedList.get(i)); } System.out.println("----------增强for循环--------------"); for (Object o:linkedList) { System.out.println(o); } // 使用迭代器 System.out.println("----------使用迭代器-python-------------"); Iterator it = linkedList.iterator(); while (it.hasNext()){ Student s = (Student) it.next(); System.out.pripythonntln(s); } System.out.println("----------列表迭代器正序--------------"); // 列表迭代器 ListIterator listIterator = linkedList.listIterator(); while (listIterator.hasNext()){ Student s = (Student) listIterator.next(); System.out.println(s); } System.out.println("----------列表迭代器逆序--------------"); while (listIterator.hasPrevious()){ Student s = (Student) listIterator.previous(); System.out.println(s); } } }
到此这篇关于Java ArrayList与Vector和LinkedList的使用及源码分析的文章就介绍到这了,更多相关Java ArrayList内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论