常见集合与应用
什么是集合
java集合类是一种特别有用的工具类,可用于存储数量不等的对象
Java集合包含List(列表)、Set(集合)、Map(映射)以及JDK1.5推出的Quene(队列)四种体系
Java的集合类主要由两个接口派生而出:Collection(所有单数据最顶层的抽象接口)和Map(映射数据结构最顶层的接口)
四种存储结构
- List代表有序、可重复集合
- Quene代表队列特性
- Set代表无序、不可重复集合
- Map代表存储映射关系的集合
Collection接口及实现
Map接口及实现
List接口与ArrayList实现类
List集合
- List集合代表一个元素有序、可重复的集合、集合中每个元素都有其对应的顺序索引
- List集合允许使用重复元素,通过缩影访问指定位置的元素
- List集合默认按元素的添加顺序设置元素的索引
Array与LinkedList
ArrayList、LinkedList、Vector、Stack都是List接口的实现类
ArrayList也就是替代数组用的列表
LinkedList是基于链表数据结构所产生的列表
ArrayList的特点
- ArrayLIst基于数组实现的list类,是Java数组的有效替代品
- ArrayList会自动对容量进行扩容,多数情况下无须指定最大长度
- ArrayList的数据在内存中是连续紧密存储的,基于数据访问速度快
ArrayList的使用方法
//集合存储在Java.util包下
import java.util.ArrayList;
...
//实例化ArrayList
ArrayList<String>bookList = new ArrayList<String>();
//新增元素,尾部追加
bookList.add("三国演义");
//返回第一个元素,索引从0开始
String bookName1 = bookList.get(0);
...
< String >表示在bookList里未来的数据都是一个一个字符串 这种书写方式称为泛型,泛型的作用就是约束列表中每一项元素的类型
add(String e)是在尾部添加数据,返回值是Boolean类型,表示列表是否发生了变化
//add方法返回值代表List集合是否发生变化
boolean result1 = bookList.add("西游记");
System.out.println("列表是否发生变化:" + result1);
结果:列表是否发生变化:true
add(int index,String element)是在下标为index添加element,
get()是获取的意思 括号里填的是元素的下标,如果输入了不存在的下标,就会报IndexOutOfBoundsException的错误
在IDEA中,输入psvm就能快捷创建一个main()方法了,输入sout就是自动生成一个输出换行语句:System.out.println();,ctrl+d :复制当前行到下一行
快捷键**ctrl+shift+回车**快捷在句尾添加分号(如果没有分号的话),如果有分号的话在按一遍就会转到下一行
set(int index,String element)
更新设置的意思,返回值是String,表示更新之前原始数据是什么
//set方法用于更新指定索引的数据,返回值是更新前的原数据
String before = bookList.set(3,"西游记后传");
System.out.println(before);
System.out.println(bookList);
结果:
西游记
[三国演义, 红楼梦, 水浒传, 西游记后传]
remove()
有两种使用方式,第一种就是删除具体的数据,第二种是根据具体的位置来进行删除,第一种返回值为Boolean类型,表示是否找到需要删除的数据并删除,第二种返回值是被删除的数据
//remove方法有两种形式
//按数据删除,传入数据,返回是否删除成功的布尔类型
boolean result2 = bookList.remove("西游记后传");
System.out.println(result2);
System.out.println(bookList);
//按索引位置删除,返回被删除的数据
String item = bookList.remove(0);
System.out.println(item);
System.out.println(bookList);
结果:
true
[三国演义, 红楼梦, 水浒传]
三国演义
[红楼梦, 水浒传]
size()
作用是返回该列表元素的数量,返回值是int
//size方法用于获取List集合的总长度
int count = bookList.size();
System.out.println(count);
结果: 2
size()方法也可和其他方法搭配使用
例如:需要更新列表最后一个数据
//更新最后一个数据
bookList.set(bookList.size() - 1, "测试数据");
System.out.println(bookList);
结果:[红楼梦, 测试数据]
删除列表最后一个数据
//删除最后一个数据
bookList.remove(bookList.size() - 1);
System.out.println(bookList);
结果:[红楼梦]
LinkedList特征与方法应用
特点:
- LinkedList同时实现了List与Deque(双端队列)两个接口
- LinkedList在保障有序、允许重复的前提下,也可以作为队列在队首、队尾快速追加数据(在数据写操作的时候效率要比前面的ArrayLIst效率要高一些)
- LinkedList的数据在内存中是分散存储的,基于链表,拥有良好的数据插入速度,但数据访问低于ArrayList
LinkedList和ArrayList的add()使用办法完全相同
Deque 双端队列接口
无论是在队列的头还是队列的尾都能追加数据,提供addFirst() 在队列的首部新增一个元素、addlast()方法 在队列的尾部新增一个元素
ArrayList与LinkedList存储结构
ArrayList是开辟一段连续的空间来存取数据,遍历一遍的速度比LinkedList快,但是如果是插入数据时,ArrayList会在把数据放入相应位置之后,之后位置上的数据都要往后挪一位
LinkedList是通过指针的方式来存取数据的,在数据存放的地方加上指向上一个数据位置和指向下一个数据位置的指针,这样插入数据就会比ArrayList快。
三种集合的遍历方式
-
for循环遍历
for(类型 对象名 : 相应集合的对象){}
for(String book : bookList){ System.out.println(book); }
可以依次对所有集合中的数据进行提取并且赋值给前面这个对象,开发中最常见
-
forEach方法遍历
利用对象自带的forEach(对象名->){
//相应的处理语句
}
//方式2:利用forEach方法+Lambda表达式简化循环过程 bookList.forEach(book->{ System.out.println(book); });
-
Iterator迭代器遍历
在List这个对象中提供了专门用来遍历集合的对象,名字叫做迭代器,通过迭代器可以完成数据的遍历和获取的任务
interator()返回的也是一个interator对象,也要通过泛型来进行接收,保证和前面每一个元素类型一致
hasNext() 作用判断是否还有下一个元素,如果有就返回true
next()作用是获取下一个元素,返回值适合之前定义的对象保持一致
//方式3:利用Iterator迭代器对象循环输出 Iterator<String> itr = bookList.iterator(); while (itr.hasNext()){ String book = itr.next();//提取出下一个元素,同时将指针向后移动 System.out.println(book); }