目录
4. Collection子接口1:List
4.1 List接口特点
4.2 List接口方法
4.3 List接口主要实现类:ArrayList
4.4 List的实现类之二:LinkedList
4.5 List的实现类之三:Vector
4.6 练习
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));}//还可以使用增强forfor (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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic 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);}/* @Overridepublic 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;}}