集合框架
- 一组接口和类的集合
- 在java.util包
集合框架体系
Collection接口:
- 存储一组不唯一、无序的对象
List接口:
- 存储==不唯一(值可重复),有序(插入顺序)==的对象
Set接口:
- 存储一组唯一(值不能重复)、无序的对象
Map接口:
- 存储一组=键值=对象,提供key到value的映像(键:key 值:value)
Collection
方法名 | 说明 |
---|---|
clear() | 把集合里的所有元素清空 |
isEmpty() | 判断一个集合是否为空 |
Iterator() | 获取遍历一个集合的迭代器 |
toArray() | 把一个集合转变成一个序列 |
List
实现类:
- ArrayList:
- 长度可变的数组,连续的
- 遍历和随机访问元素的效率高
- LinkedList:
- 链表存储方式
- 插入、删除元素的效率较高
ArrayList
//新闻标题类 新闻标题 创建者
public class NewTitle {
private int id;
private String title;
private String author;
public NewTitle() {
}
public NewTitle(int id, String title, String author) {
this.id = id;
this.title = title;
this.author = author;
}
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;
}
}
import java.util.ArrayList;
//对新闻标题的存储及操作(ArrayList)
public class NewsMgr {
public static void main(String[] args) {
//创建新闻标题对象
NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
NewTitle title3 = new NewTitle(3,"北京热门景点北海","author");
NewTitle title4 = new NewTitle(4,"北京热门景点颐和园","author");
NewTitle title5 = new NewTitle(5,"北京热门景点天安门","author");
//创建集合对象,并将新闻标题加入到集合中
ArrayList list = new ArrayList();
list.add(title1);//等同于数组中的list[0] = title1;
list.add(title2);
list.add(title3);
list.add(title4);
list.add(title5);
//获取新闻标题的总数
//ArrayList的size()方法等同于数组的length属性的作用
System.out.println("新闻标题一共有"+list.size()+"条");
//逐条打印新闻标题的名称
//方法一:遍历ArrayList元素的位置(下标)
for (int i = 0; i < list.size(); i++) {
//list.get(i);//等同于list[i],但返回值是Object
NewTitle title = (NewTitle)list.get(i);//数据类型转换
System.out.println(title.getTitle()+"-"+title.getAuthor());
}
System.out.println("------------------------------------------------------------------");
//方法二:增强型for
for (Object obj:
list) {
NewTitle title = (NewTitle)obj;
System.out.println(title.getTitle());
}
}
}
方法名 | 说明 |
---|---|
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
方法名 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
import java.util.LinkedList;
//对新闻标题的存储及操作(ArrayList)
public class NewsMgr2 {
public static void main(String[] args) {
//创建新闻标题对象
NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
NewTitle title3 = new NewTitle(3,"北京热门景点北海","author");
NewTitle title4 = new NewTitle(4,"北京热门景点颐和园","author");
NewTitle title5 = new NewTitle(5,"北京热门景点天安门","author");
//创建集合对象,并将新闻标题加入到集合中
LinkedList list = new LinkedList();
list.add(title1);//等同于数组中的list[0] = title1;
list.add(title2);
list.add(title3);
list.add(title4);
//在指定位置插入特定元素
list.add(1,title5);
//插入头条新闻标题
NewTitle title6 = new NewTitle(6,"北京热门景点国家博物馆","李华");
list.addFirst(title6);//在列表首部添加
//获取新闻标题的总数
//ArrayList的size()方法等同于数组的length属性的作用
System.out.println("新闻标题一共有"+list.size()+"条");
//逐条打印新闻标题的名称
//方法一:遍历ArrayList元素的位置(下标)
for (int i = 0; i < list.size(); i++) {
//list.get(i);//等同于list[i],但返回值是Object
NewTitle title = (NewTitle)list.get(i);//返回值为Object,要强制类型转换
System.out.println(title.getTitle()+"-"+title.getAuthor());
}
System.out.println("------------------------------------------------------------------");
//方法二:增强型for
for (Object obj: list) {
NewTitle title = (NewTitle)obj;
System.out.println(title.getTitle());
}
//获取头条/末条新闻
System.out.println("------------------------------------------------------------------");
NewTitle titleFirst = (NewTitle)list.getFirst();
System.out.println("头条新闻信息:"+titleFirst.getTitle());
System.out.println("------------------------------------------------------------------");
NewTitle titleLast = (NewTitle)list.getLast();
System.out.println("末条新闻信息:"+titleLast.getTitle());
//删除头条信息
list.removeFirst();
System.out.println("删除之后的条数:"+list.size());
for (Object obj:
list) {
NewTitle title = (NewTitle)obj;
System.out.println(title.getTitle()+"-"+title.getAuthor());
}
}
}
可以用父类引用子类(List list = new LinkedList)的方法,但是只能调用父子类共有的方法,子类独有方法不能调用
Set
实现类:HashSet
因为Set接口是唯一、无序的,所以不能通过get输出。
- Set中存放对象的引用
import java.util.*;
//Set中存放了对象的引用
public class SetDemo {
public static void main(String[] args) {
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());//2
}
}
- Set接口采用对象的equals()方法比较两个对象是否相等
import java.util.*;
//Set如果对应的值一样
public class SetDemo2 {
public static void main(String[] args) {
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());//1
}
}
遍历Set集合方法:
-
(1)增强for循环
-
(2)迭代器Iterator
- 获取Iterator: Collection接口和iterator()方法
- Iterator方法
- boolean hasNext():判断是否存在另一个可访问的元素
- Object next():返回要访问的下一个元素
import java.util.*; //对新闻标题的存储及操作(ArrayList) public class NewsMgr3 { public static void main(String[] args) { //创建新闻标题对象 NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author"); NewTitle title2 = new NewTitle(2,"北京热门景点长城","author"); //创建集合对象,并将新闻标题加入到集合中 Set set = new HashSet(); //Set--Collection(add(Object)) set.add(title1); set.add(title2); //获取新闻标题的总数 System.out.println("新闻标题一共有"+set.size()+"条"); //逐条打印新闻标题的名称 System.out.println("------------------------------------------------------------------"); //方法一:增强for for (Object obj : set) { NewTitle title = (NewTitle)obj; System.out.println(title.getTitle()+"-"+title.getAuthor());//乱序 } System.out.println("------------------------------------------------------------------"); //方法二:迭代器Iterator //(1)获取迭代器对象 Iterator itor = set.iterator(); //(2)判断是否存在下一个元素 while(itor.hasNext()){ //(3)返回要访问下一个元素 NewTitle title = (NewTitle)itor.next(); System.out.println(title.getTitle()+"-"+title.getAuthor()); } } }
Map
实现类:HashMap
(key,value):key是唯一、无序的;value是可重复的
Map和Collection没有继承关系,Map不是Collection的 子接口。
对数据的操作:
- put(key,value)
- get(key)
- size():
方法名 | 说明 |
---|---|
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:
- 遍历key,通过key=>value
- 通过迭代器Iterator实现遍历
- 增强型for循环
- 遍历key-value对(数据类型为Map.Entry)
import java.util.*;
public class CountriesInfo {
public static void main(String[] args) {
//创建集合对象,并将国家信息键值对放入集合
Map countries = new HashMap();
countries.put("China","中国");
countries.put("USA","美国");
countries.put("Japan","日本");
countries.put("France","法国");
//获取集合中存储元素个数
System.out.println(countries.size());
//获取集合中特定的key和value,Object返回值类型,需要强制数据类型转换
String country = (String)countries.get("China");
System.out.println(country);
//如果找不到,返回null
String country2 = (String)countries.get("Australia");
System.out.println(country2);
//判断集合中是否存在某一国家
System.out.println("是否存在china"+countries.containsKey("China"));
//删除某个特定key对应的国家
System.out.println("是否存在USA:"+countries.containsKey("USA"));
countries.remove("USA");
System.out.println("是否存在USA:"+countries.containsKey("USA"));
System.out.println(countries.size());
//获取键的集合、值的集合,键值对的集合
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
System.out.println("---------------------------------------------------------");
//遍历Map 思路一:遍历key(Set),通过key=>value
Set keys = countries.keySet();//获取Map中的所有key
//方法一:增强型for遍历key(Set)
for (Object obj:
keys) {
String key = (String)obj;//获取Map中的每一个key
String value = (String)countries.get(key);//根据Map中的每一个key获取对应的value
System.out.println(key+"--"+value);
}
System.out.println("---------------------------------------------------------");
//方法二:迭代器Iterator遍历key(Set)
Iterator itor = keys.iterator();
while (itor.hasNext()){
String key = (String)itor.next();//获取到了Map中的每一个key
String value = (String)countries.get(key);//根据Map中的每一个key获取对应的value
System.out.println(key+"--"+value);
}
//遍历Map 思路二:获取Map中的所有键值对,然后在键值对中分别获取key和value
System.out.println("---------------------------------------------------------");
Set set = countries.entrySet();//获取Map中的键值对
//遍历键值对的集合,把每个键值对(obj)----Map.Entry(键值对的类型)拿出来
for (Object obj:set) {
Map.Entry me = (Map.Entry)obj;
String key = (String)me.getKey();//获取出来键值对中的键
String value = (String)me.getValue();//获取出来键值对中的值
System.out.println(key+"--"+value);
}
}
}
实例:
//学生类型:姓名和性别
public class Student {
private String name;
private 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;
}
}
import java.util.*;
//学生信息管理(学生英文名获取对应学生详细信息
public class StudentInfoMgr {
public static void main(String[] args) {
Student stu1 = new Student("张三","男");
Student stu2 = new Student("李华","男");
Student stu3 = new Student("王晓华","女");
Map stuMap = new HashMap();
stuMap.put("Buck",stu1);
stuMap.put("Jack",stu2);
stuMap.put("Jession",stu3);
//输出共几名学生进入了外企
System.out.println("一共有"+stuMap.size()+"名学生进入了外企");
System.out.println("------------------------ta们是----------------------");
Set set = stuMap.entrySet();
for (Object obj : set) {
Map.Entry me = (Map.Entry)obj;
String key = (String)me.getKey();
Student student = (Student)me.getValue();
System.out.println(key+"-"+student.getName()+"-"+student.getSex());
}
//实现获得特点英文名称下的学生信息
System.out.println("------------------------------------");
//String name = "Jack";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要查找到的学生英文名:");
String name = scanner.nextLine();
if (stuMap.containsKey(name)){
//在Map中找到了相应的key,则根据key获得相应的value
Student student = (Student)stuMap.get(name);
System.out.println("该学生信息如下:");
System.out.println(name+"-"+student.getName()+"-"+student.getSex());
}else {
System.out.println("对不起,没有该学员");
}
}
}
Collections算法类:
Collections类定义了一系列用于操作集合的静态方法
-
常用的静态方法:
- sort():排序(升序)
- binarySearch():查找
- max()\min():查找最大、最小值
- reverse():反转元素数组
-
import java.util.*; //Collections的常用方法 public class CollectionsUseDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("ant"); list.add("bear"); list.add("pen"); list.add("zoo"); list.add("apple"); list.add("candy"); list.add("zookeeper"); System.out.println("-------------------------"); for (String s: list) { System.out.println(s); } System.out.println("-------------------------"); //使用Collections对集合进行升序排序 Collections.sort(list); for (String s: list) { System.out.println(s); } System.out.println("-------------------------"); //查找集合中的最大、最小值 System.out.println("集合中的最大元素是:"+Collections.max(list)); System.out.println("集合中的最小元素是:"+Collections.min(list)); //查找集合中的特定元素,先排序 System.out.println(Collections.binarySearch(list,"candy")); //反转集合元素 Collections.reverse(list); for (String s: list) { System.out.println(s); } } }
-
自定义元素排序
- 实现Comparable接口
- 重写compareTo()方法
public class Student implements Comparable { private int no; private String name; private String sex; public Student() { } public Student(int no, String name, String sex) { this.no = no; this.name = name; this.sex = sex; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } 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; } //重写方法,定义学生对象的比较规则 //比较规则:学号大的往后排 //比较对象:当前学生对象(this)和Object o public int compareTo(Object o) { Student student = (Student)o; if (this.no == student.no){ return 0;//学号相同 }else if (this.no > student.no){ return 1;//当前学生学号大于比较学生学号 }else { return -1;//当前学生学号小于比较学生学号 } } }
import java.util.*; //Collections的常用方法 public class CollectionsUseDemo { public static void main(String[] args) { List<Student> list = new ArrayList<Student>(); Student stu1 = new Student(1,"张三","男"); Student stu2 = new Student(7,"李四","男"); Student stu3 = new Student(3,"王晓华","女"); Student stu4 = new Student(9,"王五","男"); list.add(stu1); list.add(stu2); list.add(stu3); list.add(stu4); System.out.println("-------------------------"); for (Student stu : list) { System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex()); } System.out.println("-------------------------"); //使用Collections对集合进行升序排序 Collections.sort(list); for (Student stu: list) { System.out.println(stu.getNo()+"-"+stu.getName()+"-"+stu.getSex()); } System.out.println("-------------------------"); } }
泛型
<>
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性
- 本质是参数化类型
- 使用泛型定义时,便不需要强制类型转换
- 泛型集合可以约束集合的元素类型,如ArrayList student,表示student集合中只允许有E元素类型。
import java.util.*;
public class NewsMgr {
public static void main(String[] args) {
NewTitle title1 = new NewTitle(1,"北京热门景点故宫","author");
NewTitle title2 = new NewTitle(2,"北京热门景点长城","author");
ArrayList<NewTitle> list = new ArrayList<NewTitle>();
list.add(title1);//等同于数组中的list[0] = title1;
list.add(title2);
//泛型约束了集合框架添加元素的安全性,错误类型元素添加,在编译时就不通过
//list.add("aaa");
//方法一:遍历ArrayList元素的位置(下标)
for (int i = 0; i < list.size(); i++) {
//list.get(i);//等同于list[i],但返回值是Object
//NewTitle title = (NewTitle)list.get(i);//数据类型转换
NewTitle title = list.get(i);//添加泛型后,返回值为NewTitle
System.out.println(title.getTitle()+"-"+title.getAuthor());
}
System.out.println("------------------------------------------------------------------");
//方法二:增强型for
/*for (Object obj: list) {
NewTitle title = (NewTitle)obj;
System.out.println(title.getTitle());
}*/
for (NewTitle title: list) {
System.out.println(title.getTitle());
}
System.out.println("------------------------------------------------------------------");
//方法三:迭代器Iterator
System.out.println("迭代器");
Iterator<NewTitle> itor = list.iterator();
while (itor.hasNext()){
NewTitle title = itor.next();
System.out.println(title.getTitle()+"-"+title.getAuthor());
}
- 泛型嵌套:<Map.Entry<key,value>>
Set<Map.Entry<String,String>> set = countries.entrySet();//获取Map中的键值对
//遍历键值对的集合,把每个键值对(obj)----Map.Entry(键值对的类型)拿出来
for (Map.Entry<String,String> me:set) {
String key = me.getKey();//获取出来键值对中的键
String value = me.getValue();//获取出来键值对中的值
System.out.println(key+"--"+value);
}