一、问题
1.存储一个班学员信息,假定一个班容纳20名学员
以之前所学的一位数组思想我们可能这样创建数组,假设类名为Student:
Student[] stus = new Student[20];
2.那如何存储每天的新闻信息呢?
猜想方法1:采用二维数组:第一维存放新闻标题,第二维存放新闻对象
猜想方法2:用String[]存放标题,String[]存放新闻内容(两数组长度一样),再让两个数组关联(怎么关联?,求解)
猜想方法3: 先创建新闻类News,再建立数组News[] a = new News[?];(?的不确定体现了了新闻数量随机,从而可能导致一个问题出现,即长度太短浪费空间,太多空间不足)
3.如何存储一个课程的代码与课程信息,能够通过代码方便地获得课程信息?
综上问题1可以由简单的创建数组的方式解决,而问题2和问题3的复杂数据存储问题就引发了一个办法:
如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象–可以使用 java集合框架
那么集合框架又是什么呢? 细看下文==>
二、Java集合框架包含的内容
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中,即集合框架就是接口和类(注:util包属于java的工具包)
【注:虚线框指的是接口,实线框指的是类,右下方的类时工具类提供以上接口和类的方法,空白箭头指的是继承关系,实线箭头无继承关系指的是派生意义,该图需要特意记忆】
Collection接口存储一组不唯一、无序的对象
List接口存储一组不唯一、有序( 插入顺序)的对象
Set接口存储一组唯一、无序的对象
Map接口存储一组键值对象,提供key和value的映射
三、List接口的实现类
ArrayList 实现了 长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
LinkedList 采用 链表 存储方式。插入、删除元素时效率比较高
ArrayList集合类
问题: 新闻管理系统,需求如下:
1.可以存储各类新闻标题(包含ID、名称、创建者)
2.可以获取新闻标题的总数
3.可以逐条打印每条新闻标题的名称<遍历=>ArrayList>
分析:
确定存储方式
1.ArrayList类时List接口的一个具体实现类
2.ArrayList对象实现了可变大小的数组
3.随机访问和遍历元素时,他提供更好的性能
确定存储对象
1.创建类型:新闻标题
2.包含属性:ID、名称、创建者
具体实现
package com.lch.Collection;
//新闻标题类
public class NewsTitle {
//ID 新闻题目 作者
private int id; //ID
private String title; //新闻标题
private String author; //作者
public NewsTitle(){
}
public NewsTitle(int id, String title,String author) {
super();
this.id = id;
this.author = author;
this.title = title;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
下面展示一些 内联代码片
。
package com.lch.Collection;
import java.util.ArrayList;
//新闻管理系统
public class ArrayListDemo {
public static void main(String[] args) {
//集合存储多条新闻标题
NewsTitle title1 = new NewsTitle(1,"中国天晴了1","admin");
NewsTitle title2 = new NewsTitle(2,"中国天晴了2","admin");
NewsTitle title3 = new NewsTitle(3,"中国天晴了3","admin");
NewsTitle title4 = new NewsTitle(4,"中国天晴了4","admin");
NewsTitle title5 = new NewsTitle(5,"中国天晴了5","admin");
ArrayList list = new ArrayList();
list.add(title1); //add()指的是将集合加到某个元素里
list.add(title2);
list.add(title3);
list.add(title4);
//list.add(1, title5); //void add(int index,Object o)指的是插队数据
System.out.println("输出结果:");
System.out.println("新闻标题的总数:"+list.size()); //size指的是集合的长度
//遍历list,取出每条新闻标题的题目
for(int i=0;i<list.size();i++){
NewsTitle title = (NewsTitle)list.get(i); //get(Object)指的是取出相应位置的元素
System.out.println(title.getTitle());
}
System.out.println("*******************************");
for(Object obj : list){ //增强型的for ,因为对象list里面现在向里边加的都是Object
NewsTitle title = (NewsTitle)obj;
System.out.println(title.getId()+" "+title.getTitle()+" "+title.getAuthor());
}
}
}
输出结果:
新闻标题的总数:4
中国天晴了1
中国天晴了2
中国天晴了3
中国天晴了4
*******************************
1 中国天晴了1 admin
2 中国天晴了2 admin
3 中国天晴了3 admin
4 中国天晴了4 admin
ArrayList常用方法
【注:详细方法请查看jdk的帮助文档】
除了以上所有红颜色方法为Collection接口常用通用方法外,还有clear()、isEmpty()、iterator、toArray(),且由于这些方法都在Collection接口中,故这些方法List和Set接口都有且都可以使用
使用void add(int index,Object o);来插入title5数据
list.add(1, title5); //void add(int index,Object o)指的是插队数据
输出结果:
新闻标题的总数:5
中国天晴了1
中国天晴了5
中国天晴了2
中国天晴了3
中国天晴了4
*******************************
1 中国天晴了1 admin
5 中国天晴了5 admin
2 中国天晴了2 admin
3 中国天晴了3 admin
4 中国天晴了4 admin
其他方法展示
System.out.println("*******************************");
System.out.println(list.contains(title1)); //contains指的是是否包含
list.remove(title1); //remove指的是移除
System.out.println(list.contains(title1));
list.remove(2); //remove(int index)指的是从列表中删除指定位置元素,起始索引位置从0开始
System.out.println(list.contains(title3));
System.out.println("*******************************");
list.clear(); //清空集合数据
System.out.println(list.size());
System.out.println(list.isEmpty()); //list.isEmpty判断集合是不是空的,true为空
System.out.println(list.iterator()); //返回集合迭代器,请参考Set章节
System.out.println(list.toArray()); //把一个集合变成一个序列
输出结果:
*******************************
true
false
false
*******************************
0
true
java.util.ArrayList$Itr@7de26db8
[Ljava.lang.Object;@1175e2db
证明ArrayList插入效率不高,调试list.add()
图片黄色部分,是插入了一条信息title5在第0位置上,1-4位置都受到了影响
LinkedList集合类
LinkedList类是List接口的链接列表实现类。它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null。
LinkedList类采用链表存储方式存储数据,如图所示,优点在于插入、删除元素时效率比较高,但是LinkedList类的查找效率很低。
问题: 新闻管理系统,需求如下:
1.可以添加头条新闻标题
2.获取头条和最末条新闻标题
3.可以删除末条新闻标题
关于LinkedList插入、删除元素更高效的说法,一幅图是最容易说明问题的:
分析:
确定存储方式
1.LinkedList 类是List接口的一个具体实现类
2.LinkedList类用于创建链表数据结构
3.插入或者删除元素时,它提供更好的功能
具体实现
package com.lch.Collection;
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo {
public static void main(String[] args){
//集合存储多条新闻标题
NewsTitle title1 = new NewsTitle(1,"中国天晴了1","admin");
NewsTitle title2 = new NewsTitle(2,"中国天晴了2","admin");
NewsTitle title3 = new NewsTitle(3,"中国天晴了3","admin");
NewsTitle title4 = new NewsTitle(4,"中国天晴了4","admin");
NewsTitle title5 = new NewsTitle(5,"中国天晴了5","admin");
NewsTitle title6 = new NewsTitle(6,"中国天晴了6","admin");
NewsTitle title7 = new NewsTitle(7,"中国天晴了7","admin");
// List list = new LinkedList(); //这样声明,无法使用LinkedList独有的方法
LinkedList list = new LinkedList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(1,title4);
list.addFirst(title5);//列表最头上 ,若是使用父类创建对象List list = new LinkedList();,则addFirst addLast指定性方法报错,是由于这些方法为子类独有的方法
list.addLast(title6);//当前列表列表最末尾,当前列表指的是前边的兄弟从上往下运行的顺序列表:51423
list.add(title7);
// System.out.println(list.size());
for(int i=0;i<list.size();i++){
NewsTitle title = (NewsTitle)list.get(i);
System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
}
System.out.println("********************");
for(Object obj : list){
NewsTitle title = (NewsTitle)obj;
System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
}
System.out.println("********************");
list.removeFirst(); //清除最头上的数据
for(Object obj : list){
NewsTitle title = (NewsTitle)obj;
System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
}
System.out.println("********************");
list.removeLast(); //清除列表最末尾的数据
for(Object obj : list){
NewsTitle title = (NewsTitle)obj;
System.out.println(title.getId()+"*"+title.getAuthor()+"*"+title.getTitle());
}
System.out.println("********************");
NewsTitle firstNews = (NewsTitle)list.getFirst(); //列表第一条信息,相当于 for(int j =0;j<1;j=0){
// NewsTitle title = (NewsTitle)list.get(j);
// System.out.println("头条新闻标题:"+title.getTitle());
// break;
// }
System.out.println("头条新闻标题:"+firstNews.getTitle());
NewsTitle lastNews = (NewsTitle)list.getLast(); //列表末条信息,在至此的表格相当于System.out.println("末条新闻标题"+title6.getTitle());
System.out.println("末条新闻标题:"+lastNews.getTitle());
}
}
LinkedList常用方法
【注:详细请见帮助文档,并在此声明以上方法及ArrayList与LinkedList独有方法与以父类List声明的ArrayList与LinkedList的实操在上面代码中体现,请留意区别】
证:LinkedList为什么比ArrayList的插入删除更高效
代码为:
LinkedList list = new LinkedList();
list.add(title1);
list.add(title2);
list.add(title3);
list.add(1,title4); //title4插入数据
title4插入数据,在调试中只有next与first才会出现黄色提示,除黄色部分其他数据无反应,以此比较于ArrayList有点“牵一发动全身”的感觉,明显并有力证明了对于插入删除数据LinkedList更高效是有依据的