java之集合—List接口、ArrayList、LinkedList
一、List
1.1 概念
List是继承Collection父接口的子接口,是集合的规范之一。
特点:有序、有下标、元素可重复。
List的实现类有:ArrayList
、LinkedList
、Vector(已放弃)。
由于List是接口,不能直接实现,需要向上转型的方式来创建对象,以其实现类ArrayList
为例:
List list = new ArrayList();//通过向上转型的方式创建对象
1.2 独有方法
List继承了Collection接口,为了符合List的特点,拥有许多独特方法。
1.2.1 add(int index,Object obj)
作用:在指定下标index除插入元素obj
返回值类型:void(无返回值)
代码演示:
List list = new ArrayList();
list.add("张三");
list.add("李四");
System.out.println(list);
list.add(1,"王五");
System.out.println(list);
运行结果:
[张三, 李四]
[张三, 王五, 李四]
1.2.2 addAll(int index,Collection c)
作用:将集合c中的所有元素添加到集合的指定下标处
返回值类型:boolean
代码演示:
List list1 = new ArrayList();
List list2 = new ArrayList();
list1.add("苹果");
list1.add("香蕉");
list1.add("菠萝");
System.out.println(list1);
list2.add("大象");
list2.add("长颈鹿");
list1.addAll(1,list2);
System.out.println(list2);
运行结果:
[苹果, 香蕉, 菠萝]
[苹果, 大象, 长颈鹿, 香蕉, 菠萝]
1.2.3 get(int index)
作用:返回下标index处的元素
返回值类型:Object
代码演示:
List list = new ArrayList();
list.add("张三");
list.add("李四");
System.out.println(list.get(1));
运行结果:
李四
1.2.4 set(int index,Object obj)
作用:修改指定下标位置的元素。下标不能越界!(不能超过长度-1)
代码演示:
List list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王五");
System.out.println(list);
list.set(1,"赵六");//更改下标1位置的元素为:"赵六"
System.out.println(list);
运行结果:
[张三, 李四, 王五]
[张三, 赵六, 王五]
1.2.5 subList(int from,int to)
作用:将集合中从下标from开始,到下标to - 1位置的所有元素返回
返回值:List
代码演示:
List list1 = new ArrayList();
list1.add("苹果");
list1.add("香蕉");
list1.add("菠萝");
list1.add("桃子");
list1.add("西瓜");
System.out.println("list1的数据:");
System.out.println(list1);
List list2 = list1.subList(1,4);//将list1从下标1到下标3的所有元素赋值给list2
System.out.println("list2的数据:");
System.out.println(list2);
运行结果:
list1的数据:
[苹果, 香蕉, 菠萝, 桃子, 西瓜]
list2的数据:
[香蕉, 菠萝, 桃子]
1.2.6 indexOf(Object obj)
作用:在集合中查找obj元素第一次出现的位置,如果不存在则返回-1
返回值类型:int
代码演示:
List list = new ArrayList();
list.add("苹果");
list.add("香蕉");
list.add("苹果");
System.out.println("苹果的下标:" + list.indexOf("苹果"));
System.out.println("西瓜的下标:" + list.indexOf("西瓜"));
运行结果:
苹果的下标:0
西瓜的下标:-1
1.2.7 lastIndexOf(Object obj)
作用:在集合中查找obj元素最后一次出现的位置,如果不存在则返回-1
返回值类型:int
代码演示:
List list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("张三");
list.add("王五");
System.out.println("张三的下标:" + list.lastIndexOf("张三"));
System.out.println("赵六的下标:" + list.lastIndexOf("赵六"));
运行结果:
张三的下标:2
赵六的下标:-1
1.2.8 listIterator()
作用:列表迭代器,用于显示元素,功能比迭代器更强大
特点:添加元素、删除元素、修改元素
返回值类型:ListIterator
代码演示:
List list = new ArrayList();
list.add("苹果");
list.add("香蕉");
list.add("菠萝");
list.add("西瓜");
list.add("哈密瓜");
ListIterator lit = list.listIterator();//创建列表迭代器对象
System.out.println("正序迭代:");
while(lit.hasNext()){//从前向后迭代元素
//hasNext():如果下一个元素存在,返回true,否则返回false
//nextIndex():返回下一个元素的下标
//next():返回下一个元素的值,并指向下一个元素
System.out.print(lit.nextIndex() + "..." + lit.next() + " ");
}
System.out.println();//用于换行,无实际意义
System.out.println("逆序迭代:");
while(lit.hasPrevious()){//从后向前迭代元素
//注意:逆序迭代的前提是正序迭代过!!
//hasPrevious():如果上一个元素存在,返回true,否则返回false
//previousIndex():返回下一个元素的下标
//previous():返回下一个元素的值,并指向下一个元素
System.out.print(lit.previousIndex() + "..." + lit.previous() + " ");
}
System.out.println();
lit.remove();//删除下一个元素,并指向该元素的下一个元素
System.out.println("删除元素后:");
while(lit.hasNext()){
System.out.print(lit.nextIndex() + "..." + lit.next() + " ");
}
运行结果:
正序迭代:
0…苹果 1…香蕉 2…菠萝 3…西瓜 4…哈密瓜
逆序迭代:
4…哈密瓜 3…西瓜 2…菠萝 1…香蕉 0…苹果
删除元素后:
0…香蕉 1…菠萝 2…西瓜 3…哈密瓜
二、ArrayList
2.1 概念
ArrayList是List接口的实现类之一,存储结构为数组结构
。
2.2 特点
- 必须开辟连续空间。
- 因为有连续空间,所以可通过下标查找元素,
查询快
,修改快
。 - 因为有连续空间,增加和删减元素需要将后面所有元素进行位置改变,
增删慢
。 - 集合在创建后,没有任何元素时,集合的容量是
0
。 - 集合中第一次添加元素后,集合的容量为
10
。 - 每当集合中的元素数量到达容量值后,集合扩容至原容量的
1.5倍
。 - 线程不安全。
ArrayList是具体类,可以直接创建对象:
ArrayList list = new ArrayList();
三、LinkedList
3.1 概念
LinkedList是List接口的实现类之一,存储结构为双向链表
。
3.2 特点
- 不用开辟连续空间。
- 因为不需要连续空间,所以增加和删除元素只需要改变上下元素的指向,
增删快
。 - 因为不需要连续空间,所以查找元素时只能依靠每个元素的指向一个个查找,
查询慢
,修改慢
。 - 可以实现
栈
的操作:入栈(push)和出栈(pop)。 - 可以实现
队列
的操作:入队(offer)和出队(pull)。
LinkedList作为List接口的实现类,可以直接创建对象:
LinkedList list = new LinkedList();
3.2 栈
3.2.1 概念
栈,是一种存储结构,有入栈和出栈两种操作。
特点:先进后出
3.2.2 图片演示
入栈顺序:a -> b -> c
出栈顺序:c -> b -> a
3.2.3 代码实现
Stack类,继承Vector类,LinkedList实现了栈结构:
LinkedList stack = new LinkedList();
//push(Object obj):实现栈的入栈操作,相当于在下标0处插入元素。
stack.push("苹果");
System.out.println(stack);
stack.push("香蕉");
System.out.println(stack);
stack.push("葡萄");
System.out.println(stack);
stack.push("火龙果");
System.out.println(stack);
//pop():实现栈的出栈操作,相当于删除下标0处的元素。
stack.pop();
System.out.println(stack);
stack.pop();
System.out.println(stack);
stack.pop();
System.out.println(stack);
stack.pop();
System.out.println(stack);
运行结果:
[苹果]
[香蕉, 苹果]
[葡萄, 香蕉, 苹果]
[火龙果, 葡萄, 香蕉, 苹果]
[葡萄, 香蕉, 苹果]
[香蕉, 苹果]
[苹果]
[]
3.3 队列
3.3.1 概念
队列,是一种存储结构,有入队和出队两种操作。
特点:先进先出
3.3.2 图片演示
入队顺序:a -> b -> c
出队顺序:a -> b -> c
3.3.3 代码实现
Queue接口,继承Collection接口,LinkedList实现了Queue接口:
LinkedList queue = new LinkedList();
//offer(Object obj):实现队列的入队操作,相当于add(Object obj)
queue.offer("张三");
System.out.println(queue);
queue.offer("李四");
System.out.println(queue);
queue.offer("王五");
System.out.println(queue);
queue.offer("赵六");
System.out.println(queue);
//poll():实现队列的出队操作,相当于删除下标0处的元素。
queue.poll();
System.out.println(queue);
queue.poll();
System.out.println(queue);
queue.poll();
System.out.println(queue);
queue.poll();
System.out.println(queue);
运行结果:
[张三]
[张三, 李四]
[张三, 李四, 王五]
[张三, 李四, 王五, 赵六]
[李四, 王五, 赵六]
[王五, 赵六]
[赵六]
[]
总结
今天介绍了集合体系中的List及其实现类:ArrayList和LinkedList。
至于Vector为什么不讲,是因为这个类已经废弃。
之后我会继续讲解其他集合类型。