List集合常用子类: ArrayList, LinkedList有序、可重复、有索引
ArrayList:
底层数据结构是数组,查询快,增删慢
一般写法:
List<> ls = new ArrayList<>();
向上类型转换(小转大):
语法规则:<父类型> <引用变量名> = new <子类型>();
- 此时通过父类引用变量调用的方法是子类覆盖或继承
父类的方法,不是父类的方法。 - 此时通过父类引用变量无法调用子类特有的方法。
ArrayList几乎满足List的所有功能,List是接口不能直接使用。
-
public void add(int index, E element):
将指定的元素,添加到该集合中的指定位置上。 -
public E get(int index) :
返回集合中指定位置的元素。 -
public E remove (int index):
移除列表中指定位置的元素,返回的是被移除的元素。 -
public E set(int index, E element) :
用指定元素替换集合中指定位置的元素,返回值更新前的元素。
ArrayList遍历的方式:
Collection集合没有for循环方式;
List系列集合多了索引,所以多了一种按照索引遍历集合的for循环。
List遍历方式:
- for循环
- 迭代器
- foreach增强for
- JDK 1.8新技术Lambda。
LinkedList:
底层数据结构是链表,查询慢,增删快
一般写法:
LinkedList<> ls = new LinkedList<>();
因为要调用其特有方法
LinkedList是支持双链表,定位前后的元素是非常快的,增删前后的元素也是最快的,
所以LinkedList除了拥有List集合的全部功能还多了很多操作首尾元素的特殊功能:
void addFirst(E e) 在该列表开头插入指定的元素。
void addLast(E e) 将指定的元素追加到此列表的末尾。
E getFirst() 返回此列表中的第一个元素。
E getLast() 返回此列表中的最后一个元素。
E removeFirst() 从此列表中删除并返回第一个元素。
E removeLast() 从此列表中删除并返回最后一个元素。
E pop() 从此列表表示的堆栈中弹出一个元素。
void push(E e) 将元素推送到由此列表表示的堆栈上。
分别使用ArrayList和LinkedList完成存储字符串并遍历
public class ListTest {
public static void main(String[] args) {
// ArrayList
ArrayList<String> array = new ArrayList<>();
array.add("hello");
array.add("world");
array.add("java");
// 遍历
for (String s : array) {
System.out.println(s);
}
System.out.println("--------------");
for (int i = 0; i < array.size(); i++) {
String s = array.get(i);
System.out.println(s);
}
System.out.println("--------------");
Iterator<String> it = array.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
System.out.println("--------------");
// LinkedList
LinkedList<String> linkls = new LinkedList<>();
linkls.add("hello");
linkls.add("java");
for (String s : linkls) {
System.out.println(s);
}
for (int i = 0; i < linkls.size(); i++) {
String s = linkls.get(i);
System.out.println(s);
}
Iterator<String> itls = linkls.iterator();
while (itls.hasNext()) {
String s = itls.next();
System.out.println(s);
}
}
}