5 泛型和Collections
5.1 泛型
5.1.1 泛型定义
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性
5.1.2 泛型集合
- 泛型集合可以约束集合内的元素类型
- 典型泛型集合ArrayList、HashMap<K,V>
、<K,V>表示该泛型集合中的元素类型
泛型集合中的数据不再转换为Object
示例:
package cn.bdqn.demo03;
public class Student {
private String name;
private String gender;
public Student() {
super();
}
public Student(String name, String gender) {
super();
this.name = name;
this.gender = gender;
}
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", gender=" + gender + "]";
}
}
package cn.bdqn.demo03;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo02 {
public static void main(String[] args) {
// 准备容器:创建HashMap对象
HashMap<String,Student> hm = new HashMap<String, Student>();
// 准备数据:创建3个学生对象
Student stu1 = new Student("张三", "男");
Student stu2 = new Student("李四", "男");
Student stu3 = new Student("如花", "女");
//将学生对象存储到集合中
hm.put("Jack", stu1);
hm.put("Bob", stu2);
hm.put("lisa", stu3);
//通过英文名称,获得该学员对象的详细信息
Student student =hm.get("lisa");
System.out.println(student);
System.out.println("lisa对应的学员姓名是:"+student.getName()+",性别:"+student.getGender());
System.out.println("------------------------------");
//需求:使用3种方式,将集合中所有学员的详细信息遍历出来
Set<String> keys =hm.keySet();
for(String key :keys){
//获取值
Student stu =hm.get(key);
System.out.println(key+"对应的学员姓名是:"+stu.getName()+",性别:"+stu.getGender());
}
System.out.println("------------------------------");
Iterator<String> it =keys.iterator();
while(it.hasNext()){
//获取键
String key =it.next();
//获取值
Student stu =hm.get(key);
System.out.println(key+"对应的学员姓名是:"+stu.getName()+",性别:"+stu.getGender());
}
System.out.println("------------------------------");
Set<Map.Entry<String, Student>> keyValue = hm.entrySet();
for(Map.Entry<String,Student> me:keyValue){
//获取键
String key =me.getKey();
//获取值
Student stu=me.getValue();
System.out.println(key+"对应的学员姓名是:"+stu.getName()+",性别:"+stu.getGender());
}
}
}
5.1.3 使用泛型的好处
1.编译时,检查元素添加的类型,提高了安全性。
2.减少了类型转换的次数,提高了安全性。
3.不再提示安全警告。
5.2 Collections算法类
- Java集合框架将针对不同数据结构算法的实现都保存在工具类中
- Collections类定义了一系列用于操作集合的静态方法
5.2.1 Collections类常用方法
(1)Collections和Collection不同,前者是集合的操作类,后者是集合接口
(2)Collections提供的常用静态方法
- sort():排序
- binarySearch():查找
- max()\min():查找最大\最小值
package cn.bdqn.demo04;![在这里插入图片描述](https://img-blog.csdnimg.cn/71c90d8cb01844d28a977e26aa74653a.jpeg#pic_center)
import java.util.ArrayList;
import java.util.Collections;
public class CollectionsDemo01 {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("qwe");
al.add("abc");
al.add("rds");
al.add("asd");
al.add("kjh");
al.add("dgt");
//遍历集合
for (String string : al) {
System.out.println(string);
}
System.out.println("排序后");
//集合元素升序排序
Collections.sort(al);
for (String string : al) {
System.out.println(string);
}
//查找元素,注意。查找元素之前集合要进行升序排序,否则,不能保证查找结果的正确性
int index =Collections.binarySearch(al, "abc");
System.out.println(index);//0
int index2 =Collections.binarySearch(al, "dsajfhjsadfh");
System.out.println(index2);
System.out.println(Collections.max(al));
System.out.println(Collections.min(al));
}
}
5.2.2 Collections排序
- Collections类可以对集合进行排序、查找和替换操作
- 实现一个类的对象之间比较大小,该类要实现Comparable接口
重写compareTo()方法
package cn.bdqn.demo04;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student student) {
if(this.getAge()>student.getAge()){
return 1;
}else if(this.getAge()==student.getAge()){
return 0;
}else{
return -1;
}
}
}
package cn.bdqn.demo04;
import java.util.ArrayList;
import java.util.Collections;
public class CollectionsDemo02 {
public static void main(String[] args) {
// 准备容器:创建集合对象
ArrayList<Student> al = new ArrayList<Student>();
// 准备数据:创建Student对象
Student stu1 = new Student("张三", 22);
Student stu2 = new Student("李四", 21);
Student stu3 = new Student("王五", 25);
Student stu4 = new Student("赵六", 20);
Student stu5 = new Student("孙七", 26);
// 将对象存储到集合中
al.add(stu1);
al.add(stu2);
al.add(stu3);
al.add(stu4);
al.add(stu5);
// 遍历集合
for (Student student : al) {
System.out.println(student);
}
// 对集合进行排序
Collections.sort(al);
// 遍历集合
System.out.println("排序后:");
for (Student student : al) {
System.out.println(student);
}
}
}