零、 关闭IDEA调试时自动隐藏空元素
一、 集合的概念
存储一个班学员信息,假定一个班容纳20名学员
当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。
数组有什么缺点?
数组一旦定义,长度将不能再变化。然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。
● 而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。Java中对于各种数据结构的实现,就是我们用到的集合。
集合和数组既然都是容器,它们的区别:
数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
二、 集合 API
集合体系概述
Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。
单列集合:一次放进去一个值(对象)
双列集合:键值
三、 Collection 接口
Collection 接口:定义了存取一组对象的方法,其子接口 Set 和 List 分别定义了存储方式:
● Set 中的数据对象不可以重复。
● List 中的数据对象有顺序(添加顺序)且可以重复。
四、 List 接口及实现类
● List 的实现类
List继承了Collection接口,有三个实现的类
- ArrayList :数组列表,数据采用数组方式存储。
-LinkedList :链表
-Vector :数组列表,添加同步锁,线程安全的
● ArrayList
• ArrayList 实现
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
• ArrayList 常用方法
add(E element) //在数组尾部添加
add(int index , E element) //在索引处添加
get(int index) //获得索引处的值
indexOf(Object o) //返回指定字符在此字符串中第一次一次出现处的索引
lastIndexOf(Object o) //返回指定字符在此字符串中最后一次出现处的索引
remove(int index) // 删除并返回指定位置元素
set(int index, E element) //用于替换动态数组中指定索引的元素
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayListDemo1 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
//添加元素(数组尾部)
arrayList.add("a");
arrayList.add(1);
arrayList.add('b');
arrayList.add("a");
arrayList.add(true);
System.out.println(arrayList);
//在指定索引处添加元素,其他依次后移
arrayList.add(1,"new");
System.out.println(arrayList);
//获得索引处的元素
System.out.println("arrayList.get(1) = "+arrayList.get(1));
//返回指定字符在此字符串中第一次出现处的索引
System.out.println(arrayList.indexOf("a")); //0
//返回指定字符在此字符串中最后一次出现处的索引
System.out.println(arrayList.lastIndexOf("a")); //4
//删除元素(单次)
arrayList.remove("a"); //通过直接输入删除的值来删
arrayList.remove(1); //通过索引来删除
System.out.println(arrayList);
arrayList.remove("1"); //数字只能通过索引来删除
System.out.println(arrayList);
arrayList.remove("b"); //遇到重复相同的字符串,只会删除第一个
System.out.println(arrayList);
//删除元素(指定索引处),其后的依次前移
arrayList.remove(1);
System.out.println(arrayList);
//替换元素(不考虑元素类型)
arrayList.set( 1,"newNew");
System.out.println(arrayList);
//清空元素
arrayList.clear();
System.out.println(arrayList);
//判断是否为空
System.out.println(arrayList.isEmpty()); //true
}
}
• 易错处
由于ArrayList可以存储任何类型的对象,而遍历时,会默认为Object类型,要使用子类的还要涉及向下转型,既麻烦又不可取。因而Java引入一种泛型( <E> ),用来限制可以输入的对象类型
public class ArrayList<E> extends AbstractList<E>
import java.util.ArrayList;
public class ArrayListDemo3 {
public static void main(String[] args) {
/*
集合容器中默认可以添加Object类型
*/
//但是不建议,毕竟好进去不好出来
//因而我们使用 <>泛型 来限定输入的类型
ArrayList<String> arrayList = new ArrayList();
arrayList.add("a");
//arrayList.add(1); //报错
}
}
● LinkedList
• LinkedList 实现
LinkedList采用链表存储方式。插入、删除元素时效率比较高
• LinkedList 常用方法
add(int index , Object element) //添加
addFirist(Object element) //头添加
addLast(Object element) //尾添加
get(int index) //获得索引元素
removeFirst() // 返回头元素
removeLast() //返回尾元素
remove(int index) //删除并返回索引的元素
getFirst() //获得头元素
getLast() //获得尾元素
import java.util.LinkedList;
public class LinkListDemo1 {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("a");
linkedList.add("b");
linkedList.add("c");
System.out.println(linkedList);
linkedList.add(1,"dd"); //向指定位置插入
System.out.println(linkedList);
//获取指定位置上的元素
System.out.println(linkedList.get(1));
//删除并返回是否删除成功
System.out.println(linkedList.remove("a"));
System.out.println(linkedList);
System.out.println(linkedList.pop()); //从这个列表表示的堆栈中弹出一个元素。弹出意味着移除并返回这个列表的第一个元素。
}
}
● Vector
Vector 数组列表,添加同步锁,它是线程安全的
import java.util.Vector;
/*
数组列表,线程安全的
*/
public class VectorDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("a");
vector.add("b");
vector.add("c");
}
}
五、 List接口集合迭代
● for循环遍历
import java.util.ArrayList;
import java.util.Arrays;
public class ListTraverse {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
/*
通过for循环遍历
*/
for(int i = 0;i<arrayList.size();i++){
System.out.println(arrayList.get(i));
}
System.out.println();
//for循环时可以修改元素
for(int i = 0;i<arrayList.size();i++){
if("a".equals(arrayList.get(i))){
arrayList.remove(i);
}
System.out.println(arrayList.get(i));
}
System.out.println();
}
}
● 增强for循环的遍历
import java.util.ArrayList;
import java.util.Arrays;
public class ListTraverse {
public static void main(String[] args) {
ArrayList<String> arrayList1 = new ArrayList<>();
arrayList1.add("a");
arrayList1.add("b");
arrayList1.add("c");
/*
通过增强for循环遍历
*/
for(String s:arrayList1){
System.out.println(s);
}
System.out.println();
//增强for循环时不允许修改元素
for(String s:arrayList1){
if(s.equals("a")){
arrayList1.remove(s);
}
System.out.println(s);
}
}
}
注:增强for循环遍历元素时,不允许修改元素(增添或删除)
● 迭代器遍历(Iterator)
import java.util.ArrayList;
import java.util.Iterator;
public class ListTraverse1 {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
/*
使用迭代器遍历
*/
//获得集合对象的迭代器对象
Iterator<String> it = arrayList.iterator();
while (it.hasNext()){
String s = it.next();//获取到下一个元素
System.out.println(s);
}
ArrayList<String> arrayList1 = new ArrayList<>();
arrayList1.add("a");
arrayList1.add("b");
arrayList1.add("c");
Iterator<String> its = arrayList1.iterator();
while (its.hasNext()){
String s = its.next();//获取到下一个元素
if(s.equals("a")){
its.remove(); //使用迭代器对象删除元素
}
System.out.println(s);
}
}
}