java集合框架(二)
1、LinkedSet
特点:唯一 Hashcode() equal()
链式存储结构
package com.qf.pro2103.day17;
import java.util.*;
public class Demo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> sets=new LinkedHashSet<String>();
//链表存储结构:通过链表来记录的添加顺序
sets.add("xxx");
sets.add("zzz");
sets.add("xxx");
for(String set:sets) {
System.out.println(set);
}
}
}
2、Sortedset接口的实现类TreeSet
大话设计模式
大话数据结构
数据结构—数组 数(二叉树 平衡二叉树 B+数 红黑树)队列(先进先出) 堆栈(先进后出)
【结论】:HashSet不能排序,TreeSet在类实现了Comparable类后自动排序
package com.qf.pro2103.day17;
public class Student implements Comparable<Student> {
public Student() {
super();
}
public Student(String stuNo, String stuName, int age) {
super();
this.stuNo = stuNo;
this.stuName = stuName;
this.age = age;
}
@Override
public String toString() {
return "Student [stuNo=" + stuNo + ", stuName=" + stuName + ", age=" + age + "]";
}
private String stuNo;
private String stuName;
private int age;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return this.age-o.age;
}
}
TreeSet<Student> stus=new TreeSet<Student>();
Student s1=new Student("qf001","zzz",25);
Student s2=new Student("qf002","lll",20);
Student s3=new Student("qf003","hahaha",18);
Student s4=new Student("qf004","ccc",19);
stus.add(s1);
stus.add(s2);
stus.add(s3);
stus.add(s4);
for(Student stu:stus){
System.out.println(stu);
}
3、Map接口实现类HashMap 重点
HahMap底层是哈希表:数组+单链表(如果单链表长度超过8,转为红黑树)
存储形式:key键-value值对象
通过对key来确定在哈希表的存储位置,key相同,value发生覆盖
package com.qf.pro2103.day17;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.qf.pro2103.day16.Student;
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, Student> map = new HashMap<String,Student>();
Student s1=new Student("qf001","zzz",25);
Student s2=new Student("qf002","lll",20);
Student s3=new Student("qf003","hahaha",18);
Student s4=new Student("qf004","ccc",19);
Student s5=new Student("qf003","范世龙",19);
//添加到集合
map.put("aaa", s1);
map.put(s2.getStuNo(), s2);
map.put(s3.getStuNo(), s3);
map.put(s4.getStuNo(), s4);
//如果key重复会发生value的覆盖
map.put(s5.getStuNo(), s5);
map.put("bbb", s2);
//通过key来获取对应value
Student stu=map.get("qf003");
System.out.println(stu);
//map集合如何遍历
//方式1:先获取所有key值,然后遍历key值集合,通过key获取value
// 获取所有key
Set<String> keys= map.keySet();
//然后遍历key所在集合
for(String k : keys){
Student s=map.get(k);
System.out.println("key:"+k+",value:"+s);
}
System.out.println("---------------------------------");
//方式2:先获取所有Key,然后通过迭代器遍历key 通过key获取value
Iterator<String> it=keys.iterator();
while(it.hasNext()){
String k=it.next();
Student s=map.get(k);
System.out.println("key:"+k+",value:"+s);
}
System.out.println("---------------------------------");
System.out.println(map.get("aaa"));
//方式3:key-value一起获取, entry=key+value
Set<Entry<String,Student>> set= map.entrySet();
for(Entry<String, Student> et:set){
System.out.println("key="+et.getKey()+"----value="+et.getValue());
}
System.out.println("---------------------------------");
//获取所有的value
Collection<Student> list= map.values();
for(Student s:list){
System.out.println(s);
}
}
}
HashTable:哈希表存储结构 线程安全,效率低,不允许null值作为key和value
HashMap:哈希表存储结构 非线程安全 效率高,允许null作为value
3、异常
程序运行中的非正常情况,导正程序无法继续运行
对异常进行处理,保障程序继续运行
异常的父类:Throwable
异常的分类:
- 错误Error:软件(JVM)软件或硬件出现的错误,程序的逻辑 无法手动处理
- 异常Exception:程序在运行过程中产生的问题
- 运行时异常RunTimeException:在程序运行中产生的,程序员可以处理也可以不处理
- 受查异常CheckedException:必须进行异常处理,否则程序无法编译运行
常见的异常:
ArithmeticException:算术异常
NullPointerException:空指针异常 对象没有被new 就访问其成员
IndexOutOfBoundsException:数组或集合越界
对异常处理的方式:
方式一:捕获
try{
//可能会发生的异常
}catch(异常类型 对象名){
//catch捕获try中产生的和catch种类型相同的或是其子类的异常
//提示异常信息给用户后面的程序继续运行
}
//-------------------------
【说明】在catch中不要直接使用Exception进行捕获,不能明确具体的异常原因,建议使用多路捕获
【注意】再多路catch捕获异常时,异常类型一定要子类在前,父类在后
try{
//
}filally{
//无论有无异常,无论异常是否被捕获到,都能被执行的语句块
}
方式二:抛出异常**
package com.qf.pro2103.day17;
public class Test {
// throws 抛出异常,把方法体内差生的异常抛给方法的调用者
public int com(int num1,int num2) throws ArithmeticException{
int result=num1/num2;
return result;
}
}
4、自定义异常
当不符合自定义的业务时,可以手动创建异常对象,然后抛出这个异常
package com.qf.pro2103.day17;
public class PriceException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public PriceException(){
}
public PriceException(String meg){
super(meg);
}
}
package com.qf.pro2103.day17;
public class Test {
// throws 抛出异常,把方法体内差生的异常抛给方法的调用者
public int com(int num1,int num2) throws ArithmeticException{
int result=num1/num2;
return result;
}
public void pay(int money)throws PriceException{
if(money<0){
//手动创建异常对象
throw new PriceException("你输入的金额数不正确!");
}else{
System.out.println("付款成功!付款金额为:"+money);
}
}
}
package com.qf.pro2103.day17;
public class Demo12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test=new Test();
try {
test.pay(-10);
} catch (PriceException e) {
// TODO Auto-generated catch block
System.out.println("发生异常,异常原因为:"+e.getMessage());
//打印方法调用过程产生的所有异常
//e.printStackTrace();
}
}
}
总结:
异常处理方式有两种:
1、捕获异常:try-catch
2、抛出异常:throw-throws
throw,用在方法内部,作用是抛出一个异常 throw new PriceException(“你输入的金额数不正确!”);
throws,用在方法的)的后面,作用是限定抛出的异常类型
public int com(int num1,int num2) throws ArithmeticException
自定义异常:
1、新建自定义异常类,继承Exception或某个异常子类
2、重载构造方法,在有参构造方法中,通过参数传递异常信息
多路捕获异常:catch的顺序
异常Exception:getMessage(); 返回字符串:异常信息
printStackTrace() 打印方法调用过程中,异常的传递
finally:无论有无异常,无论能够捕获到,都能被执行的代码