本课目标
掌握Java集合框架包含的内容
掌握 ArrayList 和 LinkedList 的使用
掌握 HashSet 的使用
掌握增强型 for 循环的用法
- 在某些问题上数组存储对象数据时存在一些明显的缺陷:
1. 数组长度固定不变,不能很好地适应元素数量动态变化的情况。
2.通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数
3.数组采用在内存中分配连续空间的方式存储,根据元素信息查找时效率比较低,需要多次比较。
在不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,此时可以使用集合框架
一、Java集合框架包含的内容
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于 iava.util 包中
二、Collection 接口
- Collection 接口存储一组不唯一,无序的对象
- List 接口继承 Collection 接口,存储一组不唯一,有序(插入顺序)的对象
- Set 接口存储一组唯一,无序对象
三、List 接口
- ArrayList 实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
- LinkedList 采用链表存储方式。插入、删除元素时效率比较高
ArrayList 和 LinkedList 的区别:
ArrayList :基于动态数组的数据结构,地址连续,查询效率高
LinkedList :基于链表的数据结构,地址无序,新增删除效率高
1.List 接口 常用的方法
方法名 | 说明 |
---|---|
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开始 |
练习1:使用ArrayList存储企鹅信息
public class Pengin {
private String name;
private String sex;
public Pengin() {
}
public Pengin(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;
}
public static void showList(List<Pengin> penginList) {
for(int i = 0;i < penginList.size();i ++){
Pengin pengin = (Pengin) penginList.get(i);
System.out.println(pengin.getName() + "\t" + pengin.getSex());
}
}
}
public class Test {
public static void main(String[] args) {
Pengin pengin1 = new Pengin("欧欧","Q仔");
Pengin pengin2 = new Pengin("亚亚","Q妹");
Pengin pengin3 = new Pengin("菲菲","Q妹");
Pengin pengin4 = new Pengin("美美","Q妹");
List<Pengin> penginList = new ArrayList<>();
penginList.add(pengin1);
penginList.add(pengin2);
penginList.add(pengin3);
penginList.add(pengin4);
System.out.println("共计有" + penginList.size() + "只企鹅");
System.out.println("分别是:");
Pengin.showList(penginList);
System.out.println("***************************");
penginList.remove(pengin3);
penginList.remove(pengin4);
System.out.println("删除以后还剩" + penginList.size() + "只企鹅");
System.out.println("分别是:");
Pengin.showList(penginList);
System.out.println("*************************");
System.out.println("集合中是否包含美美的信息:" + penginList.contains(pengin4) );;
}
}
2.LinkedList 集合类
LinkedList 的特殊方法
练习2:使用LinkedList存储新闻信息
public class News {
private String article;
public News() {
}
public News(String article) {
this.article = article;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public static void show(List<News> newsList){
for (News news : newsList) {
System.out.println(news.getArticle() + "\t");
}
}
}
public class NewsMain {
public static void main(String[] args) {
News news1 = new News("看看上海怎样垃圾分类");
News news2 = new News("华为麒麟最强芯片980问世");
News news3 = new News("美国一意孤行要对中国加征关税");
News news4 = new News("2019河南本科一批平行志愿正式开档");
News news5 = new News("日本富士山于20日凌晨一点爆发");
LinkedList<News> newsList = new LinkedList<>();
newsList.add(news1);
newsList.add(news4);
newsList.add(news5);
News.show(newsList);
System.out.println("**************************************");
newsList.addFirst(news2);
newsList.addFirst(news3);
System.out.println("头条和末条新闻已添加!\n");
System.out.println("头条新闻的标题为:" + news2.getArticle());
System.out.println("排在最后的新闻标题为:" + news3.getArticle());
System.out.println("*****************************************");
newsList.removeFirst();
newsList.removeLast();
System.out.println("删除的头条新闻标题为:" + news2.getArticle());
System.out.println("删除的末条新闻标题为:" + news3.getArticle());
System.out.println("删除后剩余的新闻标题条数:" + newsList.size());
System.out.println("*****************************************");
System.out.println("遍历所有新闻标题:");
System.out.println("新闻标题名称:" + news1.getArticle());
System.out.println("新闻标题名称:" + news4.getArticle());
System.out.println("新闻标题名称:" + news5.getArticle());
}
}
四、Set 接口
- Set 接口存储一组唯一,无序的对象
- Set 接口常用的实现类:HashSet
- HashSet 集合的特点:
1.集合内的元素是无序排列且不允许重复
2.HashSet 集合的查找效率高
3.允许集合元素值为null
1.Set 接口常用方法
在 HashSet 中使用 增强型for循环 : 迭代器Iterator 实现遍历 Set 集合
练习3:使用HashSet存储新闻信息
public class Title {
private String news;
public Title(String news) {
this.news = news;
}
public String getNews() {
return news;
}
public void setNews(String news) {
this.news = news;
}
public static void show(Set<Title> titleSet){
for(Title news : titleSet){
System.out.println(news.getNews());
}
}
}
public class TitleMain {
public static void main(String[] args) {
Title title1 = new Title("看看上海怎样垃圾分类");
Title title2 = new Title("华为麒麟最强芯片980问世");
Title title3 = new Title("美国一意孤行要对中国加征关税");
Title title4 = new Title("2019河南本科一批平行志愿正式开档");
Title title5 = new Title("日本富士山于20日凌晨一点爆发");
HashSet<Title> titleSet = new HashSet<>();
titleSet.add(title1);
titleSet.add(title2);
titleSet.add(title3);
titleSet.add(title4);
titleSet.add(title5);
Title.show(titleSet);
System.out.println("**********************");
System.out.println("新闻标题数目为:" + titleSet.size() + "条");
System.out.println("芯片新闻是否存在:" + titleSet.contains(title2) );
titleSet.remove(title2);
System.out.println("芯片对象已删除");
System.out.println("集合是否为空:" + titleSet.isEmpty());
System.out.println();
System.out.println("遍历所有新闻标题");
Title.show(titleSet);
System.out.println("**********************");
}
}