Java中的集合类就像一个容器,专门用来存储Java类的对象。
数组可以用来保存对个对象,但有时无法事先确定需要保存对象的个数,此时数组便不再使用,因为数组的长度不可变。
为了在程序中保存数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变————集合类
Collection:单列集合类的根接口
{1.List——元素有序(元素的存入顺序与取出顺序一致)、可重复
2.Set———元素无序、不可重复
}
方法声明
List接口继承自Collection接口,习惯性地将实现了List接口的对象称为List集合。
List集合中允许出现重复的元素,所有元素是以一种 线性方式 进行存储,可以通过索引来访问集合中的指定元素。
List集合元素有序————元素的存入顺序与取出顺序一致。
void add(int index,Object element)
将元素 element插入在List 集合的index处
boolean addAll(int index,Collection c)
将集合c所包含的所有元素插入到 List 集合的index处
Object get(int index)
返回集合索引index处的元素
Object remove(int index)
删除index 索引处的元素
Object set(int index, Object element)
将索引 index 处元素替换成 element 对象,并将替换后的元素返回
int indexOf(Object o)
返回对象o在List 集合中出现的位置索引
int lastlndexOf(Object o)
返回对象o在List集合中最后一次出现的位置索引
List subList(int fromlndex, int tolndex)
返回从索引fromindex(包括)到 tolndex(不包括)处所有元素集合组成的子集合
ArrayList是List接口的一个实现类,它是程序中最常见的集合。
在ArrayList内部封装了一个 长度可变的 数组对象,但存入元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储。
由于ArrayList底层是使用数组保存元素,增删指定位置元素会导致创建新的数组,效率较低,因此不适合做大量的增删操作。
但这种数据结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。
为了克服ArrayList集合增删元素效率低的问题,LinkedList类在内部维护了一个双向循环链表。
链表中的每一个元素都是用引用的方式来记住前一个与后一个元素,增删只需要修改这种引用关系即可。
LinkedList中定义的方法:
1.ArrayList 类似于 数据结构中的顺序表,顺序存储,查询容易,增删麻烦,不适合做大量的增删操作,查询迅速(下标索引)。
2.LinkedList 类似于 数据结构中的双向循环链表,增删非常容易,不需要移动大量元素。
主要用于迭代访问Collection中的元素。
任务描述:简易KTV点歌系统
分别使用LinkedList和ArrayList集合,实现编写一个模拟KTV点歌系统的程序
功能要求: 指令0代表添加歌曲 1代表置顶某歌曲 2代表将歌曲前移一位 3代表删除歌曲 4代表退出点歌系统
package com.yushifu.collection.list;
import java.util.ArrayList;
import java.util.Scanner;
//任务描述:简易KTV点歌系统
// 分别使用LinkedList和ArrayList集合,实现编写一个模拟KTV点歌系统的程序
// 功能要求: 指令0代表添加歌曲 1代表置顶某歌曲 2代表将歌曲前移一位 3代表删除歌曲 4代表退出点歌系统
public class ArrayListDemo02 {
public static void main(String[] args) {
//创建歌曲列表
ArrayList list = new ArrayList();
System.out.println("欢迎使用本KTV点歌系统!请按照以下指令操作:");
System.out.println("0——添加歌曲");
System.out.println("1——置顶歌曲");
System.out.println("2——前移歌曲");
System.out.println("3——删除歌曲");
System.out.println("4——退出点歌系统");
//初始化歌单
firstAddSong(list);
while (true){
System.out.println("请输入指令:");
//接收键盘输入的指令
Scanner scanner = new Scanner(System.in);
int command = scanner.nextInt();
//执行对应序号的功能
switch (command){
case 0:
addSong(list);//添加歌曲
break;
case 1:
setTop(list);//置顶歌曲
break;
case 2:
moveSong(list);//前移歌曲
break;
case 3:
deleteSong(list);//删除歌曲
break;
case 4: //退出系统
exit();
break;
default:
System.out.println("您输入的指令有误,请按照指示重新输入!");
break;
}
}
}
//初始添加歌曲到歌单中
public static void firstAddSong(ArrayList list){
list.add("New Boy");
list.add("Yellow");
list.add("西湖");
list.add("挪威的森林");
list.add("我记得");
list.add("半岛铁盒");
System.out.println("初始歌单列表为:"+list);
}
//添加歌曲
public static void addSong(ArrayList list){
System.out.println("请输入需要添加的歌名,按Enter键结束输入。");
//保存从键盘输入的歌曲名
String name = new Scanner(System.in).nextLine();
list.add(name);//添加到当前歌单的末尾
System.out.println("已添加歌曲:"+name);
System.out.println("当前歌单列表为:"+list);
}
//删除歌曲
public static void deleteSong(ArrayList list){
System.out.println("请输入需要删除的歌名,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//indexOf(Object j)方法可以返回查找元素的位置
if (location<0){//判断歌曲是否存在,因为ArrayList集合的下标为0,1,2,3.....
System.out.println("歌单中不存在您要删除的歌曲!");
}else {
list.remove(name);
System.out.println("删除成功!");
System.out.println("当前歌单列表为:"+list);
}
}
//前移歌曲
public static void moveSong(ArrayList list){
System.out.println("请输入您要前移一位得歌曲名称,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//获取所需操作歌曲的下标
if (location<0){//判断是否存在用户输入的歌曲
System.out.println("未找到您需要前移的歌曲");
}else if (location == 0){
System.out.println("您的歌曲已在第一位,无法前移。");
}else {
list.remove(name);//先将原来歌单中的删除,再插入到想要的位置
list.add(location-1,name);
}
System.out.println("当前歌单列表为:"+list);
}
//将歌曲置顶
public static void setTop(ArrayList list){
System.out.println("请输入您需要置顶的歌曲名称,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//获取所需操作歌曲的下标
if (location<0){//判断歌单中是否存在用户输入的歌曲
System.out.println("并未找到您的歌曲!");
} else if (location==0) {
System.out.println("您的歌曲已置顶!");
}else {
list.remove(name);//先将原来歌单中的删除,再插入到想要的位置
list.add(0,name);
}
System.out.println("当前歌单为:"+list);
}
public static void exit(){
System.out.println("您已退出程序!");
System.exit(0);//终止当前虚拟机
}
}
package com.yushifu.collection.list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
//任务描述:简易KTV点歌系统
// 分别使用LinkedList和ArrayList集合,实现编写一个模拟KTV点歌系统的程序
// 功能要求: 指令0代表添加歌曲 1代表置顶某歌曲 2代表将歌曲前移一位 3代表删除歌曲 4代表退出点歌系统
public class LinkedListDemo02 {
public static void main(String[] args) {
//创建歌曲列表
LinkedList list = new LinkedList();
System.out.println("欢迎使用本KTV点歌系统!请按照以下指令操作:");
System.out.println("0——添加歌曲");
System.out.println("1——置顶歌曲");
System.out.println("2——前移歌曲");
System.out.println("3——删除歌曲");
System.out.println("4——退出点歌系统");
//初始化歌单
firstAddSong(list);
while (true){
System.out.println("请输入指令:");
//接收键盘输入的指令
Scanner scanner = new Scanner(System.in);
int command = scanner.nextInt();
//执行对应序号的功能
switch (command){
case 0:
addSong(list);//添加歌曲
break;
case 1:
setTop(list);//置顶歌曲
break;
case 2:
moveSong(list);//前移歌曲
break;
case 3:
deleteSong(list);//删除歌曲
break;
case 4: //退出系统
exit();
break;
default:
System.out.println("您输入的指令有误,请按照指示重新输入!");
break;
}
}
}
//初始添加歌曲到歌单中
public static void firstAddSong(LinkedList list){
list.add("New Boy");
list.add("Yellow");
list.add("西湖");
list.add("挪威的森林");
list.add("我记得");
list.add("半岛铁盒");
System.out.println("初始歌单列表为:"+list);
}
//添加歌曲
public static void addSong(LinkedList list){
System.out.println("请输入需要添加的歌名,按Enter键结束输入。");
//保存从键盘输入的歌曲名
String name = new Scanner(System.in).nextLine();
list.addLast(name);//添加到当前歌单的末尾
System.out.println("已添加歌曲:"+name);
System.out.println("当前歌单列表为:"+list);
}
//删除歌曲
public static void deleteSong(LinkedList list){
System.out.println("请输入需要删除的歌名,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//indexOf(Object j)方法可以返回查找元素的位置
if (location<0){//判断歌曲是否存在,因为ArrayList集合的下标为0,1,2,3.....
System.out.println("歌单中不存在您要删除的歌曲!");
}else {
list.remove(name);
System.out.println("删除成功!");
System.out.println("当前歌单列表为:"+list);
}
}
//前移歌曲
public static void moveSong(LinkedList list){
System.out.println("请输入您要前移一位得歌曲名称,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//获取所需操作歌曲的下标
if (location<0){//判断是否存在用户输入的歌曲
System.out.println("未找到您需要前移的歌曲");
}else if (location == 0){
System.out.println("您的歌曲已在第一位,无法前移。");
}else {
list.remove(name);
list.add(location-1,name);
}
System.out.println("当前歌单列表为:"+list);
}
//将歌曲置顶
public static void setTop(LinkedList list){
System.out.println("请输入您需要置顶的歌曲名称,按Enter键结束输入。");
String name = new Scanner(System.in).nextLine();
int location = list.indexOf(name);//获取所需操作歌曲的下标
if (location<0){//判断歌单中是否存在用户输入的歌曲
System.out.println("并未找到您的歌曲!");
} else if (location==0) {
System.out.println("您的歌曲已置顶!");
}else {
list.remove(name);
list.addFirst(name);
}
System.out.println("当前歌单为:"+list);
}
public static void exit(){
System.out.println("您已退出程序!");
System.exit(0);//终止当前虚拟机
}
}