目录
一.集合概述
二. 集合体系概述
1. Collection接口
1.1 List接口
1.2 Set接口
2. Map接口
三. ArrayList
1.ArrayList常用方法
2.ArrayList遍历
2.1 for循环
2.2 增强for循环
2.3 迭代器遍历
一.集合概述
我们经常需要存储一些数据类型相同的元素,之前我们学过的容器就是数组,但是数组存在一个问题
1.数组的长度一旦确定就不能改变
但是我们在实际开发中,往往需要动态增长的容器来帮我们存储数据,显然只用数组的话需要自己去创建新数组并拷贝元素,这大大降低了开发效率,所以java提供了底层不同实现的数据结构的容器称为集合
二. 集合体系概述
1. Collection接口
Collection是一个接口,里面可以定义抽象方法,常量,静态方法,默认方法(jdk8及之后),该接口是单列集合的父接口,其中主要用于定义一些单列集合通用的方法,例如:单列集合的增删改查
1.1 List接口
List接口继承了Collection接口,List接口下的实现类允许出现重复元素,可以用索引和迭代器访问,主要有ArrayList,LinkedList,Vector等实现类
1.2 Set接口
Set接口同样继承了Collection接口,Set接口下的实现类不允许出现重复元素,且不能用索引访问,只能用迭代器访问,主要有HashSet,TreeSet等实现类
2. Map接口
Map是一个接口,里面可以定义抽象方法,常量,静态方法,默认方法(jdk8及之后),该接口是双列(键值对存储)集合的父接口,其中主要定义一些双列集合通用的方法,例如:双列集合的增删改查,主要有HashMap等实现类
三. ArrayList
ArrayList是List接口下的一个实现类,底层是一个可以动态增长的数组,所有的集合容器中都可以添加任意类型的数据,但为了使用时的统一,用一个<>指明集合中的元素类型,这是泛型,例如:<String>
1. ArrayList常用方法
size() | 返回集合中实际元素个数 |
add(E e) | 向集合末尾添加元素,添加成功返回true,添加失败返回false |
add(int index,E e) | 向指定位置处添加元素 |
remove(Object o) | 删除指定内容的元素,删除成功返回true,删除失败返回false |
remove(int index) | 删除指定位置处的元素,删除成功会把该值返回 |
get(int index) | 获取指定位置处的元素 |
indexOf(Object o) | 从左向右查找指定元素,找到返回下标,找不到返回-1 |
lastIndexOf(Object o) | 从右向左查找指定元素,找到返回下标,找不到返回-1 |
set(int index,E element) | 用指定的元素替换指定位置的元素,同时返回旧元素 |
isEmpty() | 判断集合是否为空 |
contains(Object o) | 判断集合中是否包含指定元素 |
四. LinkedList
LinkedList是List接口下的一个实现类,底层是链表结构
1.LinkedList常用方法
int size() | 返回集合中的元素个数 |
boolean add(E e) | 向集合尾部添加指定元素,添加成功返回true,添加失败返回false |
void add(int index,E element() | 向指定位置添加指定元素 |
E get(int index) | 获取指定位置的元素 |
boolean remove(Object o) | 删除指定元素,删除成功返回true,删除失败返回false |
E remove(int index) | 删除指定位置的元素,并将其返回 |
E remove() | 删除头部的元素并返回 |
void addFirst(E e) | 向头部添加元素 |
E removeLast() | 删除尾部元素并返回 |
void addLast(E e) | 向尾部添加元素 |
E pop() | 删除头部元素并返回 |
void clear() | 清空链表元素 |
boolean isEmpty() | 判断链表是否为空 |
boolean contains(Object o) | 判断链表中是否包含指定元素 |
五. Vector
vector和ArrayList底层都是数组,且两者所拥有的方法也都是相同的,唯一的不同是,Vector的方法中被synchronized修饰,是线程安全的,它们两者的关系就好像StringBuffer和StringBuilder的关系一样
六. List接口下的实现类的遍历
这里以ArrayList为例,LinkedList和vector也是类似的
1. for循环
public class ArrayListDemo4 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
for(int i = 0;i < arrayList.size(); i++){
if("a".equals(arrayList.get(i))){
arrayList.remove("a");
i--;
}
}
}
}
注意:用for循环删除集合中的元素时要注意索引和元素位置的变化,将索引减回去,避免删除元素不彻底
2. 增强for循环
public class ArrayListDemo4 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
/*
2.增强for循环
增强for循环遍历元素时,不允许修改集合元素(删除,添加)
*/
for(String s:arrayList){
//arrayList.remove(s);
System.out.print(s+" ");
//arrayList.add("1");
}
}
}
注意:在使用增强for循环遍历集合时不能对集合进行增删改查等操作
3. 迭代器遍历
public class ArrayListDemo4 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("a");
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
/*
迭代器遍历
*/
//获得集合对象的迭代器对象
Iterator<String> it = arrayList.iterator();
//正向遍历
while(it.hasNext()) {
String s = it.next();//获取到下一个元素
System.out.print(s+" ");
/*if(s.equals("b")){
it.remove();//使用迭代器对象删除元素
}*/
}
System.out.println();
//ListIterator 迭代器 只能对List接口下的实现类遍历
//listIterator(index);可以从指定的位置开始向前或者向后遍历
ListIterator<String> listIterator = arrayList.listIterator(1);
while(listIterator.hasNext()){
System.out.print(listIterator.next()+" ");
}
System.out.println();
//反向遍历
ListIterator<String> listIterator1 = arrayList.listIterator(arrayList.size());
while(listIterator1.hasPrevious()){
System.out.print(listIterator1.previous()+" ");
}
}
}
使用迭代器遍历集合是更推荐的方法,它既可以在遍历时对集合进行操作,也不用自己去管下一个元素是否会被略过