Collections类
泛型
如何解决强制类型转换时容易出现的异常问题呢?JDK5.0开始使用泛型改写了集合框架中的所有接口和类
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,它的本质是参数化类型。
//创建学员集合
ArrayList<Student> students = new ArrayList<Student>();
//创建学员类对象
Student student = new Student();
//创建诗类对象
Poem poem = new Poem();
//将两个对象添加到list集合中
students.add(student);
students.add(poem);
ArrayList添加泛型后的代码如下:
package cn.zhz.Test;
//对新闻标题的存储和操作
import java.util.ArrayList;
import java.util.Iterator;
import cn.zhz.Kind.NewsTitle;
//对新闻标题的存储和操作
public class NewsMgr {
public static void main(String[] args) {
// 创建新闻标题对象
NewsTitle title1 = new NewsTitle(1, "北京热门景点故宫", "author");
NewsTitle title2 = new NewsTitle(2, "北京热门景点长城", "author");
NewsTitle title3 = new NewsTitle(3, "北京热门景点北海", "author");
NewsTitle title4 = new NewsTitle(4, "北京热门景点颐和园", "author");
NewsTitle title5 = new NewsTitle(5, "北京热门景点天安门", "author");
// 创建集合对象,并且将新闻标题加入到集合中去
ArrayList<NewsTitle> list = new ArrayList<NewsTitle>();
list.add(title1);// 等同于数组中的list[0] = title1;
list.add(title2);
list.add(title3);
list.add(title4);
list.add(title5);
//泛型约束了集合框架添加元素的安全性,错误的元素添加,在编译时不通过
// list.add("aaa");
// 获取新闻标题的总数
// ArrayList的size()方法等同于数组的length属性的作用
System.out.println("新闻标题一种有" + list.size() + "条记录");
System.out.println("************************************");
// 逐条打印新闻标题的名称
// 方法一:遍历ArrayList元素的位置(下标)
for (int i = 0; i < list.size(); i++) {
NewsTitle title = list.get(i);// 等同于list[i],返回的是Object
System.out.println(title.getTitle());
}
System.out.println("************************************");
// 方法二:增强型的for循环
for (NewsTitle title : list) {
System.out.println(title.getTitle());
}
//方法三:迭代器Iterator
//获取迭代器对象
Iterator<NewsTitle> iterator = list.iterator();
//判断是否存在下一个元素
while (iterator.hasNext()){
//返回将要访问的下一个元素
NewsTitle title = iterator.next();
System.out.println(title.getTitle());
}
}
}
HashMap添加泛型后的代码如下:
package cn.zhz.Test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class CountriesInfo {
public static void main(String[] args) {
//创建集合对象,将国家的信息键值对放置到集合中
Map<String, String> 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 = countries.get("China");
System.out.println(country);
//获取集合中特定的key对应的value,如果找不到,则返回null
String country2 = countries.get("Australia");
System.out.println(country2);
//判断集合中是否存在某一个国家
System.out.println("国家列表中是否存在China\t" + countries.containsKey("China"));
System.out.println("国家列表中是否存在Australia\t" + countries.containsKey("Australia"));
//删除某个特定的key对应的键值对
System.out.println("国家列表中是否存在USA\t" + countries.containsKey("USA"));
countries.remove("USA");
System.out.println("国家列表中是否存在USA\t" + countries.containsKey("USA"));
System.out.println(countries.size());
//获取键的集合
System.out.println(countries.keySet());
//获取值的集合
System.out.println(countries.values());
//获取键值对的集合
System.out.println(countries);
//遍历Map-->思路一:遍历key(Set),通过key找到value
Set<String> keys = countries.keySet();//获取到Map中的所有的key
//方法一:增强型for遍历key的集合(Set)
for (String key : keys) {
String value = countries.get(key);//根据Map中的每一个key获取对应的value
System.out.println(key + "--" + value);
}
//方法二:迭代器Iterator遍历key的集合(Set)
Iterator<String> itor = keys.iterator();
while (itor.hasNext()) {
String key = itor.next();//获取到Map中的每一个key
String value = countries.get(key);//根据Map中的每一个key去获取对应的value
System.out.println(key + "--" + value);
}
//遍历Map 思路二:获取Map中的所有的键值对,然后在键值对中分别获取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);
}
}
}
泛型集合可以约束集合内的元素类型,泛型集合中的数据不再转换为Object类型了。
Collections的常用方法
java的集合框架将针对不同数据结构算法的实现都保存在工具类中,Collections类定义了一系列用于操作集合的静态方法
需要注意的是Collections和Collection不同,Collections是集合的操作类,Collection是集合的接口
-
Collections提供的常用的静态方法
sort()排序
binarySearch()查找
max() min() 查找最大或者是最小值
reverse()反转元素顺序
package cn.zhz.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
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");
for(String s:list){
System.out.println(s);
}
//使用Collections进行升序排列
Collections.sort(list);
for(String s:list){
System.out.println(s);
}
//查找集合元素的最大和最小值
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);
}
}
}
Collections排序
Collections类可以对集合进行排序 查找 替换的操作,实现一个类的对象之间比较大小,该类要实现Comparable接口,重写compareTo()的方法去自定义比较规则。
package cn.zhz.Kind;
//声明一个学生类:包含姓名和性别
public class Student implements Comparable {
private int no;
private String name;
private String sex;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
public Student() {
}
public Student(int no, String name, String sex) {
this.name = name;
this.sex = sex;
this.no = no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
//重写方法,定义学生对象的比较规则
//比较规则:按照学号进行比较
//比较对象,当前学生对象(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;//这种是小于
}
}
}
package cn.zhz.Test;
import cn.zhz.Kind.Student;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsUseDemo01 {
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);
for (Student student:list){
System.out.println(student.getNo()+"-"+student.getName()+"-"+student.getSex());
}
Collections.sort(list);
for (Student student:list){
System.out.println(student.getNo()+"-"+student.getName()+"-"+student.getSex());
}
}
}