喵星之旅-成长的雏鹰-java高级特性-1-集合与泛型

为什么使用集合框架

如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架。

Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。

Collection 接口存储一组不唯一,无序的对象。

List 接口存储一组不唯一,有序(插入顺序)的对象。

Set 接口存储一组唯一,无序的对象 。

Map接口存储一组键值对象,提供key到value的映射。

Collection接口常用通用方法还有:clear()、isEmpty()、iterator()、toArray()

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开始

LinkedList

LinkedList采用链表存储方式,插入、删除元素时效率比较高。

void addFirst(Object o) 在列表的首部添加元素

void addLast(Object o) 在列表的末尾添加元素

Object getFirst() 返回列表中的第一个元素

Object getLast() 返回列表中的最后一个元素

Object removeFirst() 删除并返回列表中的第一个元素

Object removeLast() 删除并返回列表中的最后一个元素

例子

ArrayList获取并打印新闻标题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61


public class NewTitle {
private int id; //ID
private String titleName; //名称
private String creater; //创建者
public NewTitle() {
}
public NewTitle(int id, String titleName, String creater) {
this.id = id;
this.titleName = titleName;
this.creater = creater;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitleName() {
return titleName;
}
public void setTitleName(String titleName) {
this.titleName = titleName;
}
public String getCreater() {
return creater;
}
public void setCreater(String creater) {
this.creater = creater;
}

}


import java.util.ArrayList;
import java.util.List;

public class NewTitleDemo {

public static void main(String[] args) {
// 具体实现步骤
// 1、创建多个各类新闻标题对象
NewTitle car = new NewTitle(1, "汽车", "管理员");
NewTitle test = new NewTitle(2, "高考", "管理员");
// 2、创建存储各类新闻标题的集合对象
List newsTitleList = new ArrayList();
// 3、按照顺序依次添加各类新闻标题
newsTitleList.add(car);
newsTitleList.add(test);
// 4、获取新闻标题的总数
System.out.println("新闻标题数目为:" + newsTitleList.size() + "条");
// 5、根据位置获取相应新闻标题、逐条打印每条新闻标题的名称,也就是我们常说的遍历集合对象
for (int i = 0; i < newsTitleList.size(); i++) {
NewTitle title = (NewTitle) newsTitleList.get(i);
System.out.println(i + 1 + ":" + title.getTitleName());
}

}

}

LinkedList添加和删除新闻标题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
public class NewTitle {
private int id; //ID
private String titleName; //名称
private String creater; //创建者
public NewTitle() {
}
public NewTitle(int id, String titleName, String creater) {
this.id = id;
this.titleName = titleName;
this.creater = creater;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitleName() {
return titleName;
}
public void setTitleName(String titleName) {
this.titleName = titleName;
}
public String getCreater() {
return creater;
}
public void setCreater(String creater) {
this.creater = creater;
}

}



import java.util.LinkedList;

public class NewTitleDemo {

public static void main(String[] args) {
// 具体实现步骤
// 1、创建多个各类新闻标题对象
NewTitle car = new NewTitle(1, "汽车", "管理员");
NewTitle medical = new NewTitle(2, "医学", "管理员");
// 2、创建存储各类新闻标题的集合对象
LinkedList newsTitleList = new LinkedList();
// 3、添加头条新闻标题和末尾标题
newsTitleList.addFirst(car);
newsTitleList.addLast(medical);
// 4、获取头条、以及最末条新闻标题
NewTitle first = (NewTitle) newsTitleList.getFirst();
System.out.println("头条的新闻标题为:" + first.getTitleName());
NewTitle last = (NewTitle) newsTitleList.getLast();
System.out.println("排在最后的新闻标题为:" + last.getTitleName());
// 5、删除头条和最末条新闻标题
NewTitle firstNews=(NewTitle)newsTitleList.removeFirst();
System.out.println("删除的头条新闻标题为:"+firstNews.getTitleName());
NewTitle lastNews=(NewTitle)newsTitleList.removeLast();
System.out.println("删除的末条新闻标题为:"+lastNews.getTitleName());
System.out.println("删除后剩余的新闻条数:"+newsTitleList.size());
}
}

Set

Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
Set中存放对象的引用

1
2
3
4
5
6
7
8
9
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String("JAVA");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());

遍历Set集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class NewTitleDemo {

public static void main(String[] args) {
// 1、创建多个各类新闻标题对象
NewTitle car = new NewTitle(1, "汽车", "管理员");
NewTitle test = new NewTitle(2, "高考", "管理员");
// 2、创建存储各类新闻标题的集合对象
Set newsTitleList = new HashSet();
// 3、按照顺序依次添加各类新闻标题
newsTitleList.add(car);
newsTitleList.add(test);
// 4、获取新闻标题的总数
System.out.println("新闻标题数目为:" + newsTitleList.size() + "条");
// 5、使用iterator()获取Iterator对象
Iterator iterator = newsTitleList.iterator();
// 6、使用Iterator遍历集合
while(iterator.hasNext()){
NewTitle title = (NewTitle) iterator.next();
System.out.println(title.getTitleName());
}
System.out.println("************************");
// 7、使用增强型for遍历集合
for(Object obj:newsTitleList){
NewTitle title = (NewTitle)obj;
System.out.println(title.getTitleName());
}
}

}

Map

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

常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.HashMap;
import java.util.Map;

/**
* 测试HashMap的多个方法。
*/
public class TestMap {
public static void main(String[] args) {
// 1、使用HashMap存储多组国家英文简称和中文全称的键值对
Map countries = new HashMap();
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚合众国");
// 2、显示"CN"对应国家的中文全称
String country = (String) countries.get("CN");
System.out.println("CN对应的国家是:" + country);
// 3、显示集合中元素个数
System.out.println("Map中共有"+countries.size()+"组数据");
/*4、两次判断Map中是否存在"FR"键*/
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
countries.remove("FR");
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
/* 5、分别显示键集、值集和键值对集*/
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
/* 3、清空 HashMap并判断*/
countries.clear();
if(countries.isEmpty())
System.out.println("已清空Map中数据!");
}
}

遍历Map集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


/**
* 测试通过Iterator和增强型for循环遍历Map集合
*
*/
public class Test5 {
public static void main(String[] args) {

/* 1、创建多个狗狗对象*/
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
/* 2、创建Map集合对象并把多个狗狗对象放入其中*/
Map dogMap=new HashMap();
dogMap.put(ououDog.getName(),ououDog);
dogMap.put(yayaDog.getName(),yayaDog);
dogMap.put(meimeiDog.getName(),meimeiDog);
dogMap.put(feifeiDog.getName(),feifeiDog);
/*3、通过迭代器依次输出集合中所有狗狗的信息*/
System.out.println("使用Iterator遍历,所有狗狗的昵称和品种分别是:");
Set keys=dogMap.keySet();//取出所有key的集合
Iterator it=keys.iterator();//获取Iterator对象
while(it.hasNext()){
String key=(String)it.next(); //取出key
Dog dog=(Dog)dogMap.get(key); //根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}
/*//使用foreach语句输出集合中所有狗狗的信息
for(Object key:keys){
Dog dog=(Dog)dogMap.get(key); //根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}
*/
}
}

泛型

JDK5.0使用泛型改写了集合框架中的所有接口和类。解决强制类型转换时容易出现的异常问题。

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。本质是参数化类型。

泛型集合可以约束集合内的元素类型
典型泛型集合ArrayList、HashMap<K,V>
、<K,V>表示该泛型集合中的元素类型
泛型集合中的数据不再转换为Object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82


import java.util.ArrayList;
import java.util.List;


/**
* 测试对List应用泛型。

*/
public class TestList {
public static void main(String[] args) {
/* 1、创建多个狗狗对象*/
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
/* 2、创建ArrayList集合对象并把多个狗狗对象放入其中*/
List<Dog> dogs = new ArrayList<Dog>();//标记元素类型
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置
//dogs.add("hello"); //出现编译错误,元素类型不是Dog。
/* 3、 显示第三个元素的信息*/
Dog dog3 = dogs.get(2); //无需类型强制转换
System.out.println("第三个狗狗的信息如下:");
System.out.println(dog3.getName() + "\t" + dog3.getStrain());
/*4、使用foreach语句遍历dogs对象*/
System.out.println("\n所有狗狗的信息如下:");
for(Dog dog:dogs){//无需类型强制转换
System.out.println(dog.getName() + "\t" + dog.getStrain());
}
}
}






import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


/**
* 测试对Map应用泛型。
*
*/
public class TestMap {
public static void main(String[] args) {
/* 1、创建多个狗狗对象*/
Dog ououDog = new Dog("欧欧", "雪娜瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪娜瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
/* 2、创建Map集合对象并把多个狗狗对象放入其中*/
Map<String,Dog> dogMap=new HashMap<String,Dog>();
dogMap.put(ououDog.getName(),ououDog);
dogMap.put(yayaDog.getName(),yayaDog);
dogMap.put(meimeiDog.getName(),meimeiDog);
dogMap.put(feifeiDog.getName(),feifeiDog);
/*3、通过迭代器依次输出集合中所有狗狗的信息*/
System.out.println("使用Iterator遍历,所有狗狗的昵称和品种分别是:");
Set<String> keys=dogMap.keySet();//取出所有key的集合
Iterator<String> it=keys.iterator();//获取Iterator对象
while(it.hasNext()){
String key=it.next(); //取出key
Dog dog=dogMap.get(key); //根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}
/*//使用foreach语句输出集合中所有狗狗的信息
for(String key:keys){
Dog dog=dogMap.get(key); //根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}*/
}
}


Collections算法类

Collections和Collection不同,前者是集合的操作类,后者是集合接口

Collections提供的常用静态方法
sort():排序
binarySearch():查找
max()\min():查找最大\最小值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsDemo {
public static void main(String[] args) {
//创建集合
List<String> list = new ArrayList<String>();
//增加10个不同单词
list.add("this");
list.add("is");
list.add("collection");
list.add("test");
list.add("and");
list.add("we");
list.add("can");
list.add("learn");
list.add("how");
list.add("to");

//打印输出集合中最大元素和最小元素
String strMax = (String) Collections.max(list);
String strMin = (String) Collections.min(list);
System.out.println("最大值:"+strMax);
System.out.println("最小值:"+strMin);
//按升序打印输出集合中所有元素
Collections.sort(list);
System.out.println("集合升序");
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}
System.out.println(Collections.binarySearch(list, "this"));
//按降序打印输出集合中所有元素
Collections.reverse(list);
System.out.println("集合降序");
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}

}

}

Collections类可以对集合进行排序、查找和替换操作
实现一个类的对象之间比较大小,该类要实现Comparable接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
public class Student implements Comparable{
private int number=0; //学号
private String name=""; //学生姓名
private String gender=""; //性别
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number=number;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public String getGender(){
return gender;
}
public void setGender(String gender){
this.gender=gender;
}
public int compareTo(Object obj){
Student student=(Student)obj;
if(this.number==student.number){
return 0; //如果学号相同,那么两者就是相等的
}else if(this.number>student.getNumber()){
return 1; //如果这个学生的学号大于传入学生的学号
}else{
return -1; //如果这个学生的学号小于传入学生的学号
}
}
}




import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class CollectionsDemo {
public static void main(String[] args) {
Student student1=new Student();
student1.setNumber(5);
Student student2=new Student();
student2.setNumber(2);
Student student3=new Student();
student3.setNumber(1);
Student student4=new Student();
student4.setNumber(4);
ArrayList<Student> list=new ArrayList<Student>();
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
System.out.println("-------排序前-------");
Iterator<Student> iterator=list.iterator();
while(iterator.hasNext()){
Student stu=iterator.next();
System.out.println(stu.getNumber());
}
//使用Collections的sort方法对list进行排序
System.out.println("-------排序后-------");
Collections.sort(list);
iterator=list.iterator();
while(iterator.hasNext()){
Student stu=iterator.next();
System.out.println(stu.getNumber());
}
}

}

文章目录
  1. 为什么使用集合框架
  2. List
    1. ArrayList
    2. LinkedList
    3. 例子
  3. Set
  4. Map
  5. 泛型
  6. Collections算法类
|