集合
文章目录
1、集合和数组存储数据的概述:
集合、数组都是对多个数据进行存储操作的结构,简称java容器。(此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储)。
开发应用程序时,如果想存储多个同类型的数据,可以通过数组来实现,但是使用数组存在如下一些明显的缺陷:
-
数组长度固定不变,不能很好的适应元素数量动态变化的情况。
-
可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。
-
数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较。
java集合框架提供了一套优良,使用方便的接口和类,他们都位于java.util包中,其主要内容及彼此之间的关系如下图所示:(虚线框代表接口 、实现框代表接口的实现类)
2、List接口
List接口常用的实现类有:ArrayList和LinkedList.
1)使用ArrayList动态存储数据
java集合框架提供了ArrayLIst 集合类,对数组进行了封装,实现了长度可变的数组,他不等同于数组,ArrayList集合中可以添加任何类型的数据,并且添加的数据都将转换成Obejct类型,而在数组中只能添加同一数据类型的数据。
下面是ArrayList类的常用方法:
package ArrayLIst;
import java.util.ArrayList;
public class day1 {
public static void main(String[] args) {
ArrayList list = new ArrayList(); //创建ArrayList对象
// boolean add(Object o) add方法在列表的末尾添加元素o,起始索引位置从0开始
list.add("张三丰");
list.add("郭靖");
list.add("黄蓉");
list.add(10);
list.add(10.0);
//boolean contains(Object o) contains方法 判断列表中是否存在指定元素o
System.out.println(list.contains("李莫愁"));
System.out.println("----------------------");
//Object remove(int index) remove方法 从列表中删除指定位置的元素,起始索引位置从0开始
list.remove(0);
//void set(int index,Object obj) set方法 将index索引位置的元素替换为obj员素
list.set(1,"黄蓉");
for (int i=0;i<list.size();i++){ //size()方法 返回列表中的元素个数
//get方法,返回指定索引位置处的元素
Object name = list.get(i);
System.out.println(name);
}
System.out.println("------------------");
//int indexOf(Object obj) indexOf 方法 返回元素在集合中出现的索引位置 没有返回-1
System.out.println(list.indexOf("小龙女"));
}
}
运行结果
false
----------------------
郭靖
黄蓉
10
10.0
------------------
-1
练习题:
使用ArrayLIst集合存储新闻标题信息(包含ID、名称、创建者),输出新闻标题的总数量及每条新闻标题的名称。
2)使用LInkedList类动态存储数据
LinkedList类是LIst接口的链接列表实现类,他支持实现所有LIst接口可选的列表操作,并且允许元素值是任何数据,包括null.
LinkedLIst类采用链表存储方式存储数据,优点在于插入,删除元素时效率比较高,但是LinkedList类的查找效率很低。
他除了包含ArrayLIst类包含的方法外,还提供了以下方法,可以在LinkedList类的首部或尾部进行插入,删除操作。
LInkedLIst类的常用方法如下:这里用一个实例说明;
实例:使用LInkedLIst集合存储新闻标题(包含Id、名称、创建者),实现获取、添加及删除头条和末条新闻标题信息功能,并遍历集合。
package LinkedLIst;
import java.util.LinkedList;
public class NewTitle {
int id;
String name;
String creator;
public NewTitle() {
}
public NewTitle(int id, String name, String creator) {
this.id = id;
this.name = name;
this.creator = creator;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public static void main(String[] args) {
NewTitle car = new NewTitle(1, "汽车", "管理员");
NewTitle medical = new NewTitle(2, "医学", "管理员");
NewTitle fun = new NewTitle(3, "娱乐", "管理员");
NewTitle gym = new NewTitle(4, "体育", "管理员");
LinkedList newsTileList = new LinkedList();
newsTileList.add(car);
newsTileList.add(medical);
newsTileList.addFirst(fun);//void addFirst(Object obj) 将指定元素插入到当前集合的首部
newsTileList.addLast(gym);//void addLast(Object obj) 将指定元素插入到当前集合的尾部
System.out.println("头条和末条新闻已添加");
//获取头条以及末条新闻标题
NewTitle first =(NewTitle) newsTileList.getFirst();//Object getFirst() 获得当前集合的第一个元素
System.out.println("头条新闻的标题为:"+first.getName());
NewTitle last = (NewTitle) newsTileList.getLast();//Object getLast() 获取当前集合的最后一个元素
System.out.println("末条新闻的标题为:"+last.getName());
//删除头条和末条新闻标题
newsTileList.removeFirst();//Object removeFirst() 移除并返回点前集合的第一个元素
newsTileList.removeLast();//Object removeLast() 移除并返回当前的最后一个元素
System.out.println("头条和末条新闻标题已移除");
System.out.println("遍历所有的新闻标题");
for (Object obj:newsTileList){
NewTitle newTitle=(NewTitle)obj;
System.out.println("新闻标题名称:"+newTitle.getName());
}
}
}
运行结果:
头条和末条新闻已添加
头条新闻的标题为:娱乐
末条新闻的标题为:体育
头条和末条新闻标题已移除
遍历所有的新闻标题
新闻标题名称:汽车
新闻标题名称:医学
进程已结束,退出代码 0
3.Set接口
Set接口是Collection接口的另外一个常用子接口,Set接口描述的是一种比较简单的集合。集合中的对象并不按一定的方式排序,并且不能保存重复的对象,也就是说Set接口可以存储一组唯一、无序对象。
Set接口常用的实现类有HashSet
1)使用HashSet类动态存储数据
HashSet集合的特点:
-
集合内的元素是无序排列的。
-
HashSet类是非线程安全的。
-
允许集合元素值为null。
下表是HashSet类的常用方法:
方法 说明 boolean add(Object obj) 如果Set中尚未包含指定元素obj,则添加指定元素obj void clear() 从Set中移除所有元素 int size() 返回Set中的元素的数量(Set的容量) boolean isEmpty() 如果Set不包含任何元素,则返回true boolean contians(Object obj) 如果Set包含指定元素obj,则返回true Boolean remove(Object obj) 如果指定元素obj存在于Set中,则将其移除
练习题:使用HashSet列的常用方法存储并操作新闻标题信息,并遍历集合
4.Map接口
1)Map接口概述:
Map接口存储一组成对的 键(key) 值(value)对象,提供key到value的映射,通过key来检索,Map接口中的key不要求有序,不允许重复,value同样不要求有序。但允许重复。
下表列举了Map接口的常用的方法:
方法 | 说明 |
---|---|
Object put(Object key,Object value) | 将相互关联的一个key与一个value放入该集合,如果次Map接口中已经包含了可以对应的value,则旧值将被替换 |
Object remove(Object key) | 从当前集合中移除与指定key 相关的映射,并返回该key关联的旧value,如果key没有任何关联,则返回null |
Object get(Object key) | 获得与key相关的value,如果该key不关联任何非null值,则返回null |
boolean containsKey(Object key) | 判断集合中是否存在key |
boolean containsValue(Object value) | 判断集合中是否存在value |
boolean isEmpty() | 判断集合中是否存在元素 |
void clear() | 消除集合中的所有元素 |
int size() | 返回集合中元素的数量 |
Set keySet() | 获取所有key的集合 |
Collection value() | 获取所有value的集合 |
Map 接口中存储的数据都是键值对,例如,一个身份证号对应一个人,其中身份证号及时key ,榆次号码对应的人就是value。
2)使用HashMap类动态存储数据
最常用的Map实现类是HashMap,其优点是查询指定元素效率高。
下面是一个实例:练习一下上面的方法
实例:使用HashMap类存储学生信息,要求可以根据英文名称检索学生信息。
package HashMap;
import java.util.HashMap;
public class Student {
String name;
String sex;
public Student() {
}
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;
}
public static void main(String[] args) {
Student student1 = new Student("黎明", "男");//创建保存“键值对”的集合对象
Student student2 = new Student("琉璃", "女");
HashMap students = new HashMap();
students.put("jack",student1);
students.put("Rose",student2);
System.out.println("已添加"+students.size()+"个学生信息");
System.out.println("键集:"+students.keySet());//输出键集
//判断是否存在jack这个键,如果存在,则根据键获取相应的值
String key="jack";
if(students.containsKey(key)){
Student student =(Student) students.get(key);
System.out.println("英文名"+key+"的学生姓名:"+student.getName());
}
System.out.println("输出学生名:");
for (Object key1:students.keySet()){
System.out.println(key1.toString());
}
//输出学生详细信息
System.out.println("输出学生详细信息");
for (Object value:students.values()){
Student student=(Student)value;
System.out.println("姓名:"+student.getName()+"性别:"+student.getSex());
}
}
}
运行结果:
已添加2个学生信息
键集:[Rose, jack]
英文名jack的学生姓名:黎明
输出学生名:
Rose
jack
输出学生详细信息
姓名:琉璃性别:女
姓名:黎明性别:男
进程已结束,退出代码 0
泛型
1、认识泛型
泛型是JDK 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数,使代码可以应用于多种类型,简单来说,java语言引入泛型的好处是安全简单,且所有强制转换都是自动和隐式进行的,提高了代码的重用率。
泛型的定义语法格式如下:类1或者接口<类型实参> 对象=new 类2<类型实参>();
例如:ArrayLIst list=new ArrayList();
上述代码表示创建一个AarryList集合,但规定该集合中存储的元素类型必须为String类型。
2、泛型在集合中的应用
在学习如何使用泛型之前,还需要了解以下两个重要的概念:
- 参数化类型:参数化类型包含一个类的接口,以及实际的类型参数列表。
- 类型变量:是一种非限定性标识符,用来指定类、接口或者方法的类型。
1)使用LinkedList的泛型:
package ArrayLIst;
import java.util.LinkedList;
public class NewTitle2 {
int id;
String name;
String creator;
public NewTitle2() {
}
public NewTitle2(int id, String name, String creator) {
this.id = id;
this.name = name;
this.creator = creator;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public static void main(String[] args) {
NewTitle2 car = new NewTitle2(1, "汽车", "管理员");
NewTitle2 medical = new NewTitle2(2, "医学", "管理员");
NewTitle2 fun = new NewTitle2(3, "娱乐", "管理员");
NewTitle2 gym = new NewTitle2(4, "体育", "管理员");
LinkedList<NewTitle2> newsTileList = new LinkedList<NewTitle2>();
newsTileList.add(car);
newsTileList.add(medical);
newsTileList.addFirst(fun);//void addFirst(Object obj) 将指定元素插入到当前集合的首部
newsTileList.addLast(gym);//void addLast(Object obj) 将指定元素插入到当前集合的尾部
System.out.println("头条和末条新闻已添加");
//获取头条以及末条新闻标题
NewTitle2 first = newsTileList.getFirst();//Object getFirst() 获得当前集合的第一个元素
System.out.println("头条新闻的标题为:"+first.getName());
NewTitle2 last = newsTileList.getLast();//Object getLast() 获取当前集合的最后一个元素
System.out.println("末条新闻的标题为:"+last.getName());
//删除头条和末条新闻标题
newsTileList.removeFirst();//Object removeFirst() 移除并返回点前集合的第一个元素
newsTileList.removeLast();//Object removeLast() 移除并返回当前的最后一个元素
System.out.println("头条和末条新闻标题已移除");
System.out.println("遍历所有的新闻标题");
for (NewTitle2 title2:newsTileList){
System.out.println("新闻标题名称:"+title2.getName());
}
}
}
2)使用HashMap的泛型
package HashMap;
import java.util.HashMap;
public class Student {
String name;
String sex;
public Student() {
}
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;
}
public static void main(String[] args) {
Student student1 = new Student("黎明", "男");//创建保存“键值对”的集合对象
Student student2 = new Student("琉璃", "女");
HashMap<String,Student> students = new HashMap<String, Student>();
students.put("jack",student1);
students.put("Rose",student2);
System.out.println("已添加"+students.size()+"个学生信息");
System.out.println("键集:"+students.keySet());//输出键集
//判断是否存在jack这个键,如果存在,则根据键获取相应的值
String key="jack";
if(students.containsKey(key)){
Student student =students.get(key);
System.out.println("英文名"+key+"的学生姓名:"+student.getName());
}
System.out.println("输出学生名:");
for (Object key1:students.keySet()){
System.out.println(key1.toString());
}
//输出学生详细信息
System.out.println("输出学生详细信息");
for (Student value:students.values()){
System.out.println("姓名:"+value.getName()+"性别:"+value.getSex());
}
}
}