今日学习String的工具类和异常
1.String常用工具类
按照下标搜索【字符|Unicode】
按照内容搜索【下标|是否存在|判断开头结尾】
字符串间【拼接|比较是否相同|比较字典大小】
转换自身【字节数组|字符数组|去掉首位空白|大写|小写|拆分|转移到常量池|字符串截取】
str.charAt(10); //查找下标10的字符 str.codePointAt(10); //查找下标10的Unicode str.indexOf(“s”); //查找文字的下标 str.indexOf(“s”,10); //查找10下标后的第一个s文字的下标 str.lastIndexOf(“s”); //查找倒数第一个s文字的下标 str.lastIndexOf(“s”,10); //查找倒数10下标前的第一个s文字的下标 str.contains(“str”); //是否包含str文字 str.isEmpty(); //是否是一个没有内容的字符串 str.startswith(“s”); //是否以s文字开始 str.endswith(“tr”); //是都以tr文字结束 str.concat(“str”); //拼接一个str字符串在文字后 str.equals(“wefwe”); //比较是否与wefwe字符串文字相同 str.equalsIgnoreCase(“STR”); //比较是否与STR字符串文字相同,忽略大小写 str.compareTo(“aaa”); //比较和aaa字符串谁的字典顺序大 str.getBytes(); //转换为字节数组 str.toCharArray(); //转换为字符数组 str.trim(); //去掉首位空白 str.toUpperCase(); //转换为大写 str.toLowerCase(); //转换为小写 str.split(“t”); //根据t字符拆分字符串成字符串数组 str.intern(); //将堆中数据转移到常量池 str.substring(10); //从第10下标开始截取字符串后半部分 str.substring(12,20); //从下标[的数据截取到新字符串中 字符串copy char[]chars; str.copyValueOf(chars); //将字符串中的数据***chars数组中 str.copyValueof(chars,5,10); //将字符串中[5,10)数据copy到chars数组中
- String类型需要注意的地方:
- 在Java底层中String是一个被封装的字符数组,即
private final char[] value;
在创建一个新的字符串时,实际上就是创建了一个新的字符数组给替换过来了。
这里有一个小题: String a1 = "abcd"; String a2 = "abcd"; String a3 = "ab"+"cd"; String a4 = "ab"; String a5 = "cd"; System.out.println(a1==a2); //true System.out.println(a1=="abcd"); //true System.out.println(a1==a3); //true System.out.println(a3=="abcd"); //true System.out.println((a4+a5)=="abcd"); //false System.out.println((a4+a5)==(a4+a5)); //false /* 原因就是String类型的值是文本字符串,存放在常量池里。 String类型里存放的是文本字符串在常量池中的地址值。 所以a1、a2指向的是同一个在常量池中的文本字符串的地址值。 a3实际上也是“abcd”,因为他是两个文本字符串链接出来的,也在常量池中 所以a1、a2、a3指向的是同一个在常量池中的文本字符串的地址值。 a4+a5实际上是两个字符数组合并成的新的字符数组,它是变量运算,不在常量池中; 在堆中开辟了运算空间,运算完成后放到了栈内存中。 所以a4+a5存的地址值是运算完在栈中的“abcd”的地址和a1、a2、a3存的地址值不一样 为什么(a4+a5)!=(a4+a5),是因为这是进行了两次运算,在栈中有两个运算完的结果; 虽然内容相同,但是地址不同,也就是说(a4+a5)!=(a4+a5) 如果给(a4+a5)使用intern方法将数据存入常量池,那么它和a1、a2、a3的地址值相同 */
- 在使用equals方法比较时要注意:中文在Java底层是两个字节,它比较的是字符串指向的地址后的内容,而不是地址值
- String类型在Java底层中有一个哈希码,默认是0;哈希码(hash):是一种数据压缩技术。一个数据智能对应一个hash值,一个hash值对应多个数据,目的是讲无限个数据。打乱顺序。并且尽量均匀分布在有限的空间中,也称特征码。
- null和“”(空字符串)的区别:String=null;说的是String类型中没有地址,String=“”;说的是String类型中有地址,但是它指向的地方没有数据。
- str.length();说的是调用了String类型的length方法,来计算字符串的长度;它跟数组中的length不一样,数组中的length是数组中的属性,统计数组的长度。
- String不适合做大批量字符串拼串操作,尽量在计算结束后将数据转移到常量池,即使用String类型中的intern方法。
2.异常
- java Throwable类是Java语言中所有错误或异常的超类
Throwable有两个分支:Error错误,Exception异常
Exception 是程序业务逻辑上的问题,可以从代码编写角度上避免的。
Error是允许环境上的问题,程序员无法从java层面上解决,需要运维方面解决 - Exception异常
异常分为运行时异常和非运行时异常两类,但不是代码级别的分类,是功能上的分类。
例如:
数组下标越界异常就是运行时异常,
如果访问文件时,文件无法访问,无法读写就是非运行时异常。 - 异常产生原因解析:
- 异常的机制:
异常的机制分为捕获,抛出两种。而抛出还分为声明抛出,和手动抛出。
抛出就是让程序自己处理异常,这样会终止程序,也就是说程序没有处理异常的能力,抛出后就停止执行,返回到出现异常的地方;捕获是处理异常,出现的异常该怎样处理异常,处理完异常后继续执行下面的程序。
- 异常的机制:
捕获的格式是
try{
可能出现错误的原项目代码
}catch(想要捕获的异常类型 异常变量名{
如果捕获到catch中声明的异常,如何处理
}finally{
这段可能出现异常的代码,执行完毕后,无论是否成功都要执行的代码
}public void useadd(){ try{ add(); }catch(Exception1,Exception2,Exception3){ } //useadd方法调用了add方法,在使用add方法时要对add声明的可能发生的异常处理 //继续抛出 public void useadd2()throws Exception1,Exception2,Exception3{ add(); //useadd2方法调用了add方法,但是useadd2自身没有解决可能出现的问题,而是继续抛出, 让调用useadd2的调用者选择如何处理。 }
抛出的格式:
- 声明抛出:方法可能出现的异常用throws声明出来,在执行add方法时如果出现了异常,就停止add方法的执行,回到add方法的调用处。在add方法的调用处要事先做好异常处理。异常处理仍然可以选择是捕获还是抛出。
public class Demo{ public void add()throws Exception1,Exception2,Exception3{
- 手动抛出
public class Demo{ public void add(int a,int b){ if(b==0)throw new Exception(); System.out.print1n(a/b); public void **method(** a,*** b){ if(判断a是否不符合业务逻辑)throw new DIY_Exception(); if(判断b是否不符合业务逻辑)throw new DIY_Exception(); }
- 声明抛出:方法可能出现的异常用throws声明出来,在执行add方法时如果出现了异常,就停止add方法的执行,回到add方法的调用处。在add方法的调用处要事先做好异常处理。异常处理仍然可以选择是捕获还是抛出。
throws 关键字在方法上声明该方法要拋出的异常,然后在方法内部通过 throw 拋出异常对象。
- throws 关键字和 throw 关键字在使用上的几点区别如下:
- throws 用来声明一个方法可能抛出的所有异常信息,throw 则是指拋出的一个具体的异常类型。
- 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
- throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
- 自定义异常就是继承了exception的类,主要和throw配合做到业务逻辑的约束
自定义一个类,继承异常exception。 就有了异常的特性,称为自定义异常public class Myexception extends Exception{ }
- 异常链:如果一个代码可能产生多种异常,那么要从小到大捕获多种异常格式是
try{ }catch(最小异常a){ }catch(较小异常b){ }catch… }finally{}