1.收获
今天是不一样的昨天,以前总是以为自己的解决办法是最适合自己的,但是我今天发先我错了,也许把别人的优秀方法借鉴过来,然后转化为自己的方法,肯定是比以前自己的方法好,不仅解决了以前自己没有解决的问题,而且还还应用各个方面。这也许是我今天最大的收获。我要把这种方法养成一种习惯深入到各个方面,也许这样才使自己成长。今天也看见了自己与别人的差距在哪,不是你不够努力,而是你努力的方向不对,朝着错误的方向前进,只会离目标越来越远,所以要找到正确的方向加上好的方法,不要忘了还有努力!加油!
2.技术
(1)java泛型的定义和应用
(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
(4)异常处理的方法
3.技术的实际应用和实践
(1)java泛型的定义和应用
什么是泛型:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。
为什么要用泛型:
不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。
怎末应用泛型:
A.泛型的分类
泛型可分为泛型类,泛型方法,泛型数组
B.泛型的定义与应用
首先我们需要定义一个泛型类,在这个类中与以往的类有不同之处,在类名后面有了<T>,并且在他的属性中,也是被T 修饰,并不确定他的类型,这就是泛型。在泛型类里面在定义这个类的构造方法。(注意:下面的T(Type)可以被换成E)
class GenericTest<T>{
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<String> g2=new GenericTest<>("VVTFVBG","VVTFVBG");
GenericTest<Integer> g1=new GenericTest<>(1,1);
上面的泛型解决不同类型的对象的创建。
在说二三条之前我们来里以下set,map,list之间的关系
(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<String> 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());
实现效果:
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<Person> people=new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
//方法二
TreeSet<Person> people=new TreeSet<>((Person p1,Person p2) -> p1.compareTo(p2));
实现效果:
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
HashMap集合
方法的具体使用
HashMap<String,Integer> 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"));
}
效果:
在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<Map.Entry<String,Integer>> 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);
效果:
在HashSet,TreeSet,HashMap,TreeMap集合的特殊要求
(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){
}
}
在这代码中 int c=b/a;出现了异常,后面的语句: System.out.println("hello");没有执行,那麽我们只需要将a的值部位0就可以了
现在将 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());
}
效果: