List、Set、数据结构、Collections
数据结构
常见的数据结构
栈
队列
数组
链表
红黑树
List集合
List接口介绍
java.util.List
接口继承自Collection
接口,是单列集合的一个重要分支,习惯性地会将实现了List 接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
看完API,我们总结一下
List接口特点
-
它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的
存储就是按照11、22、33的顺序完成的)。
-
它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个
道理)。
-
集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
tips:List接口的子类java.util.ArrayList类,该类中的方法都是来自List中定义的
List接口中常用方法
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
java.util.List接口 extends Collection接口
List接口的特点:
1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123)
2.有索引,包含了一些带索引的方法
3.允许存储重复的元素
List接口中带索引的方法(特有)
- public void add(int index,Eelement):将指定的元素,添加到该集合中的指定位置上
- public E get(int index):返回集合中指定位置的元素。
- public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。
- public E set(int index, Eelement):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意:
操作索引的时候,一定要防止索引越界异常
IndexOut0fBoundsException:索引越界异常,集合会报
ArrayIndexOutOfBoundsException:数组索引越界异常
StringIndexOutofBoundsException:字符串索引越界异常
*/
public class Demo01List{
public static void main(String[] args){
//创建一个List集合对象,多态
List<String> list = new ArrayList<String>();
//使用add方法往集合中添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
//打印集合
System.out.println(list);//[a,b,c,d,a] 不是地址重写了toString方法
//public void add(int index,Eelement):将指定的元素,添加到该集合中的指定位置上
//在c和d之间添加一个itzhu
list.add(3,"itzhu");
System.out.println(list);//[a,b,c,itzhu,d,a]
//public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素
//移除c元素
String reomoveE = list.remove(2);
System.out.println("被移除的元素:" + reomoveE);//被移除的元素:c
System.out.println(list);//[a,b,itzhu,d,a]
// public E set(int index, Eelement):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
//把最后一个a,替换成A
String setE = list.set(4,"A");
System.out.println("被替换的元素:" + setE);//被替换的元素:a
System.out.println(list);//[a,b,itzhu,d,A]
//List集合遍历有3中方式
//使用普通的for循环
for(int i = 0; i < list.size(); i++){
//public E get(int index):返回集合中指定位置的元素
System.out.println(list.get(i));
}
System.out.println("=====================");
//使用迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("=====================");
//使用增强for
for(String s:list){
System.out.println(s);
}
}
}
List的子类
ArrayList集合
java.util.Arraylist
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合。
许多程序员开发时非常随意地使用ArrayList
完成任何需求,并不严谨,这种用法是不提倡的。
LinkedList集合
java.util.LinkedList
集合数据存储的结构是链表结构。方便元素添加、 删除的集合
LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JzuLLB1a-1621579581934)(D:\朱相龙\java学习\笔记\图片\LinkedList双向链表.png)]
import java.util.LinkedList;
/*
java.util.LinkedList集合 implements List接口
LinkedList集合的特点:
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:
使用LinkedList集合特有的方法,不能使用多态
- public void addFirst(E e):将指定元素插入此列表的开头
- public void addLast(E e):将指定元素添加到此列表的结尾
- public void push(E e):将元素推入此列表所表示的堆栈
- public E getFirst():返回此列表的第一个元素
- public E getLast():返回此列表的最后一个元素
- public E removeFirst():移除并返回此列表的第一个元素
- public E removeLast():移除并返回此列表的最后一个元素
- public E pop():从此列表所表示的堆栈处弹出一个元素
- public boolean isEmpty():如果列表不包含元素,则返回true
*/
public class Demo02LinkedList {
public static void main(String[] args) {
show03();
}
/*
- public void addFirst(Ee):将指定元素插入此列表的开头
- public void addLast(Ee):将指定元素添加到此列表的结尾
- public void push(Ee):将元素推入此列表所表示的堆栈
*/
private static void show01(){
//创建LinkedList集合对象
LinkedList<String> linked = new LinkedList<String>();
//使用add方法往集合中添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);//[a, b, c]
//public void addFirst(E e):将指定元素插入此列表的开头
//linked.addFirst("wwww");
linked.push("wwww");
System.out.