1、目标
了解java集合框架体系结构
会使用ArrayList存取数据
会使用LinkedList存取数据
了解ArrayList与LinkedList区别
2、集合框架
使用场景:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架
java集合框架包含的内容:java集合框架提供了一套性能优良、使用方便的接口和类,他们位于java.util包中
其中主要包括三部分:
1、接口
Collection,主要由 List、Set、Queue 组成:
Map,代表键值对的集合,典型代表就是 HashMap
2、具体类
3、算法 collections:提供了对集合进行排序、遍历等多种算法实现
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序(插入顺序)的对象
Set 接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射
2.1 LIst接口实现类
ArratList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式,插入、删除元素时效率比较高
ArrayList类是List接口的一个具体实现类
ArrayList对象实现了可变大小的数组
随机访问和遍历元素时,它提供更好的性能
ArrayList常用方法
方法名 | 说明 |
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()
LinkedList常用方法
LinkedList类是List接口的一个具体实现类
LinkedList 类用于创建链表数据结构
插入或者删除元素时,它提供更好的性能
方法名 | 说明 |
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
2.2 set接口
Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
Set中存放对象的引用
通过代码可以看出,set集合中不能有相同的元素
Set接口如何判断加入对象是否已经存在呢?
采用对象的equals()方法比较两个对象是否相等
2.2.1 HashSet
HashSet是set接口常用的实现类
Set newsTitleSet = new HashSet();
NewTitle car = new NewTitle(1, "汽车", "管理员");
//增加元素
newsTitleSet.add(car);
//获取元素个数
System.out.println("新闻标题数目为:" + newsTitleList.size() + "条");
Set接口中不存在get方法,我们不能使用get方法来获取特定元素
那我们应该怎样进行元素输出呢
方法1:通过迭代器Iterator实现遍历
获取Iterator :Collection 接口的iterator()方法
Iterator的方法boolean hasNext(): 判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
方法2:增强型for循环
2.3 Map接口
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作
最常用的实现类是HashMap
Map接口常用方法
方法名 | 说明 |
Object put(Object key, Object val) | 以“键-值”对的方式进行存储 |
Object get(Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
遍历Map集合
方法1:通过迭代器Iterator实现遍历
方法2:增强型for循环
方法一、方法二都需要与Set集合联合使用
方法3:键值对
2.4 泛型集合
如何解决以下强制类型转换时容易出现的异常问题
List的get(int index)方法获取元素
Map的get(Object key)方法获取元素
Iterator的next()方法获取元素
通用泛型:
JDK5.0使用泛型改写了集合框架中的所有接口和类
2.4.1 泛型
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性
本质是参数化类型
2.4.2 泛型集合
泛型集合可以约束集合内的元素类型
典型泛型集合ArrayList<E> 、HashMap<k,v>
<E>,<k,v>表示该泛型集合中的元素类型
泛型集合中的数据不再转换为Object
除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样
2.5 Collections算法类
Java集合框架将针对不同数据结构算法的实现都保存在工具类中
Collections类定义了一系列用于操作集合的静态方法
Collections类常用方法
Collections和Collection不同,前者是集合的操作类,后者是集合接口
Collections提供的常用静态方法sort():排序max()\min():查找最大\最小值
Collections排序
Collections类可以对集合进行排序、查找和替换操作
实现一个类的对象之间比较大小,该类要实现Comparable接口
重写compareTo()方法
练习
练习一、ArrayList实现
新闻管理系统,需求如下可以存储各类新闻标题(包含ID、名称、创建者)可以获取新闻标题的总数可以逐条打印每条新闻标题的名称
Test
package exercise01;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
News n1 = new News(10001,"123","123");
News n2 = new News(10002,"123","123");
News n3 = new News(10003,"123","123");
News n4 = new News(10004,"123","123");
News n5 = new News(10005,"123","123");
News n6 = new News(10006,"123","123");
ArrayList<News> l = new ArrayList<>();
l.add(n1);
l.add(n2);
l.add(n3);
l.add(n4);
l.add(n5);
l.add(n6);
System.out.println("总数为:" + l.size());
for (News a : l){
System.out.println("新闻标题:" + a.getTittle());
}
}
}
News
package exercise01;
public class News {
private int nid;
private String tittle;
private String author;
public News(int nid, String tittle, String author) {
this.nid = nid;
this.tittle = tittle;
this.author = author;
}
public int getNid() {
return nid;
}
public void setNid(int nid) {
this.nid = nid;
}
public String getTittle() {
return tittle;
}
public void setTittle(String tittle) {
this.tittle = tittle;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
练习二、LinkedList实现
新闻管理系统,需求如下可以添加头条新闻标题获取头条和最末条新闻标题可以删除末条新闻标题
New01
package exercise02;
public class News01 {
private int id;
private String tittle;
private String author;
public News01(int id, String tittle, String author) {
this.id = id;
this.tittle = tittle;
this.author = author;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTittle() {
return tittle;
}
public void setTittle(String tittle) {
this.tittle = tittle;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
Test
package exercise02;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
News01 n1 = new News01(10001,"123","123");
News01 n2 = new News01(10002,"123","123");
News01 n3 = new News01(10003,"123","123");
News01 n4 = new News01(10004,"123","123");
News01 n5 = new News01(10005,"123","123");
News01 n6 = new News01(10006,"123","123");
LinkedList<News01> l = new LinkedList<>();
l.add(n1);
l.add(n2);
l.add(n3);
l.add(n4);
l.add(n5);
l.add(n6);
//获取头条和末尾新闻
System.out.println("头条新闻:" + l.getFirst().getId());
System.out.println("末尾新闻:" + l.getLast().getId());
//删除头条
System.out.println("删除的头条新闻为:" + l.getFirst().getId());
l.removeFirst();
System.out.println("删除的末尾新闻为:" + l.getLast().getId());
l.removeLast();
System.out.println("删除后头条为:" + l.getFirst().getId());
System.out.println("删除后末尾新闻:" + l.getLast().getId());
}
}
练习三、
学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象。请实现通过英文名称,获得该学员对象的详细信息学员属性包括姓名以及性别
Test
package exercise03;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Map<String,Student> m = new HashMap();
Student s = new Student("李明","男");
m.put("jack",s);
Set key= m.keySet();
for (Object ename : key){
System.out.println(" " + ename + "对应的学员为" + m.get(ename).getName() + ";性别为:" + m.get(ename).getSex());
}
}
}
Student
package exercise03;
public class Student {
private String name;
private String sex;
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
练习四、
需求说明学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象。请实现通过英文名称,获得该学员对象的详细信息学员属性包括姓名以及性别通过泛型解决该问题
同上
作业
作业一、
1.使用ArrayList。创建用户类,包含用户ID,用户名,用户密码,性别,账户余额字段。
(1)初始化3个用户对象
(2)循环输出三个用户信息
(3)根据用户选择编号,修改对应的用户名,修改后提示修改成功并循环打印
(4)添加用户,提示用户输入用户ID,用户名,密码,性别,并添加集合
(5)找出账户为负数的用户,并循环显示
Test
package homework01;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Test {
//遍历数组
public static void bianli(ArrayList<User> l){
int i = 0;
for (User u : l){
System.out.println((i+1)+",id:" + u.getId() + ",用户名:" + u.getName() +",用户密码:" + u.getPwd() + ",性别:" + u.getSex() + ",账户余额: " + u.getMoney());
i++;
}
}
//修改用户名
public static void updateUser(ArrayList<User> l,int key,String name){
Map<Integer,User> map = new HashMap();
map.put(1,l.get(0));
map.put(2,l.get(1));
map.put(3,l.get(2));
map.get(key).setName(name);
}
//添加用户
public static void addUser(User user,ArrayList<User> l){
l.add(user);
}
//查找负数
public static void searchUser(ArrayList<User> l){
for (User u : l){
if (u.getMoney()<0){
System.out.println("id:" + u.getId() + ",用户名:" + u.getName() +",用户密码:" + u.getPwd() + ",性别:" + u.getSex() + ",账户余额: " + u.getMoney());
}
}
}
public static void main(String[] args) {
int i = 0;
Scanner sc = new Scanner(System.in);
User u1 = new User("10001","张三","123456","男",1000);
User u2 = new User("10002","李四","131313","女",-100);
User u3 = new User("10003","王五","122121213456","男",1900);
ArrayList<User> l = new ArrayList<>();
l.add(u1);
l.add(u2);
l.add(u3);
//根据编号修改对应的用户名,修改后提示修改成功,并循环打印
bianli(l);
System.out.println("请输入你要修改的用户编号, ");
int key = sc.nextInt();
System.out.println("请输入你要修改的用户名");
updateUser(l,key,sc.next());
bianli(l);
//添加用户
String id,name,pwd,sex;
double money;
System.out.println("请依次输入用户id,用户名,用户密码,性别,账户余额");
id = sc.next();
name = sc.next();
pwd = sc.next();
sex = sc.next();
money = sc.nextDouble();
addUser(new User(id,name,pwd,sex,money),l);
bianli(l);
//负数账户
searchUser(l);
}
}
User
package homework01;
public class User {
private String id;
private String name;
private String pwd;
private String sex;
private double money;
public User(String id, String name, String pwd, String sex, double money) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.sex = sex;
this.money = money;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
作业二、
2.使用set。创建汽车类,包含品牌,型号,车牌号,价格四个字段。
(1)初始化三辆汽车
(2)使用迭代器循环打印汽车信息。
(3)使用增强for循环打印汽车信息。
Test
package homework02;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void list(ArrayList<Car> l){
Car c1 = new Car("宝马","x3","京A123454",100000);
Car c2 = new Car("兰博基尼","大牛","京A123454",100000);
Car c3 = new Car("奔驰","5系","京A123454",100000);
l.add(c1);
l.add(c2);
l.add(c3);
}
public static void main(String[] args) {
ArrayList<Car> l = new ArrayList<>();
list(l);
System.out.println(l.size());
//迭代器
Iterator<Car> t = l.iterator();
while (t.hasNext()){
Car c= (Car) t.next();
System.out.println(c.getBrand());
}
//for增强
for (Car c:l){
System.out.println(c.getBrand());
}
}
}
Car
package homework02;
public class Car {
private String brand;
private String model;
private String license;
private double price;
public Car(String brand, String model, String license, double price) {
this.brand = brand;
this.model = model;
this.license = license;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getLicense() {
return license;
}
public void setLicense(String license) {
this.license = license;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}