java泛型和map_Java语言的学习与实践10 (Java泛型,Set集合,Map集合,异常处理)...

1.收获

今天是不一样的昨天,以前总是以为自己的解决办法是最适合自己的,但是我今天发先我错了,也许把别人的优秀方法借鉴过来,然后转化为自己的方法,肯定是比以前自己的方法好,不仅解决了以前自己没有解决的问题,而且还还应用各个方面。这也许是我今天最大的收获。我要把这种方法养成一种习惯深入到各个方面,也许这样才使自己成长。今天也看见了自己与别人的差距在哪,不是你不够努力,而是你努力的方向不对,朝着错误的方向前进,只会离目标越来越远,所以要找到正确的方向加上好的方法,不要忘了还有努力!加油!

2.技术

(1)java泛型的定义和应用

(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet

(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap

(4)异常处理的方法

3.技术的实际应用和实践

(1)java泛型的定义和应用

什么是泛型:

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。

为什么要用泛型:

不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。

怎末应用泛型:

A.泛型的分类

泛型可分为泛型类,泛型方法,泛型数组

B.泛型的定义与应用

首先我们需要定义一个泛型类,在这个类中与以往的类有不同之处,在类名后面有了,并且在他的属性中,也是被T 修饰,并不确定他的类型,这就是泛型。在泛型类里面在定义这个类的构造方法。(注意:下面的T(Type)可以被换成E)

class GenericTest{

int age;

T a1;

T a2;

public GenericTest( T a2,T a1){

this.a1=a1;

this.a2=a2;

System.out.println(a1.equals(a2));

}

}

然后我们在主函数创建这个类的具体对象

GenericTest g2=new GenericTest<>("VVTFVBG","VVTFVBG");

GenericTest g1=new GenericTest<>(1,1);

949772440bed

image.png

上面的泛型解决不同类型的对象的创建。

在说二三条之前我们来里以下set,map,list之间的关系

949772440bed

image.png

(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet

Set类继承Collection接口,HashSet继承Set类,而TreeSetS是实现类SortedSet接口,SortedSet 接口使继承Set类。

Set集合

1.集合里面的对象是不能重复的 如果重复就加不进去

-----内部使用的是HashMap - Map来实现 键值对 键key不能重复

------------如何是实现HashMap里面的key不相同

--------- -------- 计算这个key对应对象的hash值

------------- ----整数:在对象的地址的基础上按照一定的算法计算出来的一个整数 这个整数就是hash值,如果两个对象相同 那麽计算出来的hash值相同

2.集合是无序的 添加的顺序和存储的顺序无关

----使用了默认的排序

HashSet集合

定义

HashSet names=new HashSet<>();

names.add("jack");

names.add("merry");

names.add("abc");

names.removeIf(element ->{return element.compareTo("c")>0;});

System.out.println(names);

System.out.println(names.hashCode());

实现效果:

949772440bed

image.png

949772440bed

image.png

TreeSet集合

在这个集合中能够实现对这集合中的对象进行排序

首先我们先创建一个person类,然后创建多个person的多个具体的对象,然后将这些对象放到TreeSet集合中。

class Person implements Comparable{

String name;

int age;

public Person(String name, int age){

this.name=name;

this.age=age;

}

}

Person p1=new Person("jack",20);

Person p2=new Person("merry",10);

Person p3=new Person("tom",20);

people.add(p1);

people.add(p2);

people.add(p3);

在进行排序的过程中,会进行对象的比较,而equals 比较的是对象内部的内, 使用的两个对象在类中必须实现Comparable接口的compareTo方法在compareTo里面实现具体该如何比较,想要打印出对象的信息进必须要实现ToString方法

class Person implements Comparable{

String name;

int age;

public Person(String name, int age){

this.name=name;

this.age=age;

}

@Override

public String toString() {

return "Person{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

@Override

public int compareTo(Object o) {

//1. 判断o对象是不是peron的一个对象

if(o instanceof Person){

Person o1=(Person)o;

//自己规定比较的策略

if(this.age!=o1.age){

return this.age-o1.age;

}else{

//年龄相同情况下

return this.name.compareTo(o1.name);

}

}else{

return -1;

}

}

}

对集合中的对象排序的两种方法

//比较:方法一

TreeSet people=new TreeSet<>(new Comparator() {

@Override

public int compare(Person person, Person t1) {

return person.compareTo(t1);

}

});

//方法二

TreeSet people=new TreeSet<>((Person p1,Person p2) -> p1.compareTo(p2));

实现效果:

949772440bed

image.png

(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap

HashMap集合

949772440bed

image.png

方法的具体使用

HashMap score=new HashMap<>();

//添加对象 添加键值对

score.put("CHINA",100);

score.put("CHI",95);

score.put("C",86);

//更改某个键值对对应的值

score.put("C",85);

//获取键值对的个数

System.out.println(score.size());

//获取所有的key

System.out.println(score.keySet());

//获取所有的值

System.out.println(score.values());

//获取Entry:key-value

System.out.println( score.entrySet());

//获取一个键Key对应的值

System.out.println(score.get("CHINA"));

}

效果:

949772440bed

image.png

在HashMap集合中我们怎样来遍历键值对,下面有两种方法

//1.通过遍历key来得到每一个Key对应的值

for(String key:score.keySet()){

//通过key得到值

int s=score.get(key);

System.out.println("key:"+key+" value:"+s);

}

//2.通过Entryset 得到Entry对象的集合

//一个Entry管理一个键值对 getkey getvalue

Set> entrys = score.entrySet();

for(Map.Entry entry:entrys){

//得到Entry对应的keyf

String key=(String)entry.getKey();

//获取Entry的值

Integer value =(Integer)entry.getValue();

System.out.println("key:"+key+" value:"+value);

}

System.out.println(score);

效果:

949772440bed

image.png

在HashSet,TreeSet,HashMap,TreeMap集合的特殊要求

949772440bed

image.png

(4)异常处理的方法

什么是异常,什么是错误:

异常是指使程序出现停止编译的现象,经过修改,程序正常运行,而错误是使程序出现崩溃的现象。程序异常和错误没有明显的分界线。

出现异常怎末办:

我们可以根据系统的提示将异常抛出,利用系统的方法。但是我们也可以自己写异常的方法,利用自己的方法将异常抛出

处理异常的模板

try{

执行代码

可能会出现异常

一旦出现异常 系统自动会为我们创建一个异常对象 并抛出

}catch( NullPointException e){

如果需要自己处理异常 局catch

}catch(IOException e){

如果有多个异常 可以使用多个catch来捕获

如果有多个异常 catch的顺序是从小到大

}catch(Exception e){

}finally{

//不管有没有异常finally都会被执行

处理资源回收 不会处理网络连接 数据库连接 I/O流

}

注意:

如果异常出现 后面的代码不会执行

try代码块 不要抓太多代码

例子:

nt a=0;

int b=20;

FileReader fr=null;

try{

int c=b/a;

System.out.println("hello");

fr=new FileReader("");

}catch (ArithmeticException e){

System.out.println(e.getMessage());

} catch (FileNotFoundException e) {

e.printStackTrace();

}finally {

try{

fr.close();

}catch (IOException e){

}

}

949772440bed

image.png

在这代码中 int c=b/a;出现了异常,后面的语句: System.out.println("hello");没有执行,那麽我们只需要将a的值部位0就可以了

949772440bed

image.png

现在将 System.out.println("hello");执行了,但是在后面的程序中出现了异常,所以我们利用了系统的方法将他抛出。

try(){

}catch{

}这种抛出异常方法

圆括号里面只能添加可以关闭的对象

实现了Closeble接口的对象

如果出项异常 系统就会自动关闭这个资源。

try(FileReader fr1=new FileReader("ddd")){

//使用对象

}catch(IOException e){

e.printStackTrace();

}

利用自己写的抛出异常的方法来抛出程序的异常

首先我们需要根据系统中的抛出异常的方法来写出抛出异常的类

class PXDException extends Exception{

//1.提供一个无参构造方法

public PXDException(){

}

//2.提供一个有参构造方法 参数是一个字符串

public PXDException(String des){

super(des);

}

}

然后再创建一个类,来抛出这个异常的具体信息,以提示用户进行修改

class TException {

public static void test3()throws PXDException{

StackTraceElement[] stackTrace=Thread.currentThread().getStackTrace();

StackTraceElement e=stackTrace[2];

String detail=e.getClassName()+"->"+e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();

//....

throw new PXDException("自己的异常类:无所作为 "+detail);

}

}

然后在实际的运行过程中进行调用方法来抛出

try {

TException.test3();

} catch (PXDException e) {

System.out.println(e.getMessage());

}

效果:

949772440bed

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值