目录
4. Collection子接口1:List
4.1 List接口特点
-
鉴于Java中数组用来存储数据的局限性,我们通常使用
java.util.List
替代数组 -
List集合类中
元素有序
、且可重复
,集合中的每个元素都有其对应的顺序索引。-
举例:List集合存储数据,就像银行门口客服,给每一个来办理业务的客户分配序号:第一个来的是“张三”,客服给他分配的是0;第二个来的是“李四”,客服给他分配的1;以此类推,最后一个序号应该是“总人数-1”。
-
-
JDK API中List接口的实现类常用的有:
ArrayList
、LinkedList
和Vector
。
4.2 List接口方法
List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引
来操作集合元素的方法。
-
插入元素
-
void add(int index, Object ele)
:在index位置插入ele元素 -
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
-
-
获取元素
-
Object get(int index)
:获取指定index位置的元素 -
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
-
-
获取元素索引
-
int indexOf(Object obj):返回obj在集合中首次出现的位置
-
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
-
-
删除和替换元素
-
Object remove(int index)
:移除指定index位置的元素,并返回此元素 -
Object set(int index, Object ele)
:设置指定index位置的元素为ele
-
举例:
import java.util.ArrayList;
import java.util.List;
public class TestListMethod {
public static void main(String[] args) {
// 创建List集合对象
List<String> list = new ArrayList<String>();
// 往 尾部添加 指定元素
list.add("图图");
list.add("小美");
list.add("不高兴");
System.out.println(list);
// add(int index,String s) 往指定位置添加
list.add(1,"没头脑");
System.out.println(list);
// String remove(int index) 删除指定位置元素 返回被删除元素
// 删除索引位置为2的元素
System.out.println("删除索引位置为2的元素");
System.out.println(list.remove(2));
System.out.println(list);
// String set(int index,String s)
// 在指定位置 进行 元素替代(改)
// 修改指定位置元素
list.set(0, "三毛");
System.out.println(list);
// String get(int index) 获取指定位置元素
// 跟size() 方法一起用 来 遍历的
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//还可以使用增强for
for (String string : list) {
System.out.println(string);
}
}
}
注意:在JavaSE中List名称的类型有两个,一个是java.util.List集合接口,一个是java.awt.List图形界面的组件,别导错包了。
4.3 List接口主要实现类:ArrayList
-
ArrayList 是 List 接口的
主要实现类
-
本质上,ArrayList是对象引用的一个”变长”数组
-
Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList(…) 返回值是一个固定长度的 List 集合
4.4 List的实现类之二:LinkedList
-
对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。
-
特有方法:
-
void addFirst(Object obj)
-
void addLast(Object obj)
-
Object getFirst()
-
Object getLast()
-
Object removeFirst()
-
Object removeLast()
-
4.5 List的实现类之三:Vector
-
Vector 是一个
古老
的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全
的。 -
在各种List中,最好把
ArrayList作为默认选择
。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。 -
特有方法:
-
void addElement(Object obj)
-
void insertElementAt(Object obj,int index)
-
void setElementAt(Object obj,int index)
-
void removeElement(Object obj)
-
void removeAllElements()
-
4.6 练习
练习1:
-
定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器,toString(),equals()方法。
-
使用ArrayList集合,保存录入的多个学生对象。
-
循环录入的方式,1:继续录入,0:结束录入。
-
录入结束后,用foreach遍历集合。
-
代码实现,效果如图所示:
Student.java
package exer1;
import java.util.Objects;
/**
* ClassName:IntelliJ IDEA
* Description:
* 定义学生类,属性为姓名、年龄,提供必要的getter、setter方法,构造器,toString(),equals()方法
* @Author zyjstart
* @Create:2024/10/2 16:13
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
/* @Override
public int hashCode() {
return Objects.hash(name, age);
}*/
}
StudentTest.java
package exer1;
import java.util.ArrayList;
import java.util.Scanner;
/**
* ClassName:IntelliJ IDEA
* Description:
*
* @Author zyjstart
* @Create:2024/10/2 16:17
*/
public class StudentTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList list = new ArrayList();
System.out.println("请录入学生信息:");
while (true){
System.out.println("1:继续录入,0:结束录入");
int selection = sc.nextInt();
if (selection == 0){ //输入是0,退出循环
break;
}
System.out.print("请输入学生的姓名:");
String name = sc.next();
System.out.print("请输入学生的年龄:");
int age = sc.nextInt();
// 将输入的姓名和年龄封装到对象里边
Student s = new Student(name,age);
// 将对象添加到集合里边
list.add(s);
}
//遍历集合中的学生信息
System.out.println("遍历学生信息:");
for (Object s : list){
System.out.println(s.toString());
}
sc.close();
}
}
练习2:
1、请定义方法public static int listTest(Collection list,char s)统计集合中指定元素出现的次数
2、创建集合,集合存放随机生成的30个小写字母
3、用listTest统计,a、b、c、x元素的出现次数
4、效果如下
ListTest.java
package exer2;
import java.util.ArrayList;
import java.util.Collection;
/**
* ClassName:IntelliJ IDEA
* Description:
*
* @Author zyjstart
* @Create:2024/10/2 19:19
*/
public class ListTest {
public static void main(String[] args) {
// 需求1:随机生成30个字符,存放在ArrayList中
ArrayList list = new ArrayList();
for (int i=0;i<30;i++){
// 'a' - 'z' [97,122]
list.add((char)(Math.random() * 26 + 97));//使用Math类产生随机数,Random方法的范围为[0,1)
}
System.out.println(list);
// 调用方法,将该字符出现的次数返回
int aCount = listTest(list, 'a');
int bCount = listTest(list, 'b');
int cCount = listTest(list, 'c');
int xCount = listTest(list, 'x');
// 输出结果
System.out.println("a:" + aCount);
System.out.println("b:" + bCount);
System.out.println("c:" + cCount);
System.out.println("x:" + xCount);
}
// 需求2:遍历ArrayList,查找指定的元素出现的次数
public static int listTest(Collection list,char s){
int count = 0; // 用于统计该字符出现的次数
for (Object obj : list){
if (s == (char)obj){
count++;
}
}
return count;
}
}