初识Java-7
String类
String类提供了很多构造方法,主要有:
//方法一
String s1="hello";
System.out.println(s1);
//方法二
String s2=new String("hello");
System.out.println(s2);
//方法三
char[] array=new char[]{'h','e','l','l','o'};String s3=new String(array);
System.out.println(s3);
s1存放的是堆区的地址,在这个区域存放的是字符串的地址以及其他信息
通过s1==s2是比较s1和s2的地址,s1.equals(s2)是比较s1和s2的内容
大小比较
s1.comoareTo(s2);s1>s2返回正数,相等返回0,小于返回负数。先比较对应字符,对应字符相等比较长度
s1.compareToIgnoreCase(s2);忽略大小写进行比较
字符串查找
String类提供的常用查找操作

通过下标进行访问
        String s1="hello";System.out.println(s1);char tmp=s1.charAt(0);System.out.println(tmp);//h查找字符串出现的位置
        String s1="hello";int tmp1=s1.indexOf('h');//0int tmp2=s1.indexOf('l',2);//2int tmp3=s1.indexOf("lo");//3int tmp4=s1.indexOf("li",3);//-1查不到返回负数
如果要从后往前查找就可以使用lastIndexOf()
转化
其他类型转换为字符串
valueOf是静态方法,所以用类名去调用
 String s2=String.valueOf(2.13);字符串转换为其他类型
int i2=Integer.parseInt("1234");大小写转换
所有的转换都是新生成一个字符串
        String s3="aBc";//大写转换System.out.println(s3.toUpperCase());//ABC//小写转换System.out.println(s3.toLowerCase());//abc字符串转数组
       String s5=new String("hello");char[] ch=s5.toCharArray();反过来也可以用数组来生成字符串
格式化
String date=String.format("%d-%d-%d",2025,10,29);字符串替换
由于字符串是不可变对象,替换是生成一个字符串
        String s1="abababoc";String s2=s1.replace('a','d');//dbdbdbocString s3=s1.replaceFirst("ab","o");//oababocString s4=s1.replaceAll("ab","o");//oooocString s5=s1.replace("ab","o");//ooooc字符串拆分
可以将完整的字符串按照指定分隔符划分为若干子字符串

        String s1="How are you";String[] array1=s1.split(" ");//How//are//youString[] array2=s1.split(" ",2);//How//are you有些字符串拆分需要加上转义
        String s1="196.168.1.0";String[] array1=s1.split("\\.");字符 | * + . 都需要转义字符,在前面加上"\\"
如果是按照 \ 拆分,就要写成"\\\\"
如果需要按照多个字符拆分的话,字符之间可以使用 | 作为连字符
        String s1="name=en&age=18";String[] array1=s1.split("=|&");字符串的截取

索引从0开始,部分截取为左闭右开
去除字符串的空格

字符串的不可变性
String是一种不可变对象,字符串的内容是不可改变的。字符串不可被修改
1.
String类在设计时是不可改变的,String类在描述中已经说明了

2.

String类被final修饰,表示不可被继承
value 被final修饰,表示value自身的值不能改变,不能引用其他字符数组,但是其引用空间中的内容可以修改
字符串修改
StringBuilder和StringBuffer

String和StringBuilder区别在于String的内容无法修改,而StringBuilder的内容可以修改,频繁修改字符串的情况考虑StringBuilder
String StringBuffer和StringBuilder的区别
1.String的内容不可修改,StringBuffer和StringBuilder的内容可以修改
2.StringBuffer和StringBuilder的大部分内容是相似的
3.StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用未同步处理,属于线程不安全操作
异常
概念
在Java中,将程序执行过程中发生的不正常行为称为异常,不包括语法错误
分类(Throwable派生出的两个子类)

Exception又分为
1.编译时异常,异常后程序员可以通过代码进行处理,使程序进行执行
2.运行时异常,指的是JVM无法解决的严重问题,比如JVM内部错误,资源耗尽等等
异常处理
防御式编程
1.LBYL:在操作之前就做了充分的检查
boolean ret = false;
ret = 登陆游戏();
if (!ret) {处理登陆游戏错误;return;
}
ret = 开始匹配();
if (!ret) {处理匹配错误;return;
}EAFP:出错再进行修改
try{//可能出现的异常
}catch(){//可能捕获的异常
}finally{
}在Java中异常处理主要是throw,try,catch,finally,throws五个关键字
异常的抛出
public static void textExceptions(int a){if(a==0){throw new ArithmeticException("a==0");}}public static void main(String[] args){textExceptions(0);}
注意:
1.throw必须写在方法的内部,并且抛出的对象必须是Exception或者Exception的子类对象
2.如果抛出的是RunTimeException或者RunTimeException的子类,则可以不用处理,直接交给JVM处理
3.如果抛出的是编译时异常,用户必须处理,否则无法执行
4.异常一旦抛出,其后的代码就不会执行
异常的捕获
异常的处理方式主要有两种,异常声明throws以及try-catch捕获处理
异常声明throws
处在异常声明参数列表之后,当方法中出现编译时异常,用户不想处理该异常,就可以借助throws将异常抛给方法的调用者来使用。当前的方法不处理异常,提醒调用方法的人处理异常,调用的人不想处理也可以接着抛出
throws必须在方法的参数列表之后,声明的异常必须是Exception或者Exception的子类
出现多个异常可直接声明父类,或者用逗号隔开多个异常
try-catch捕获并处理
语法格式:
try{// 将可能出现异常的代码放在这里
}catch(要捕获的异常类型  e){/* 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或    者是try中抛出异常的基类时,就会被捕获到对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码*/
}[catch(异常类型 e){// 对异常进行处理
}finally{// 此处代码一定会被执行到
}]
// 后序代码
// 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行
// 如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行//注意://1. []中表示可选项,可以添加,也可以不用添加// 2. try中的代码可能会抛出异常,也可能不会
打印错误信息
e.printStackTrace();注意:
try内抛出异常位置之后的代码将不能执行,异常是按照类型来捕获的,若可能抛出多个异常就需要写多个catch,子类在前父类在后
finally
有些特定的代码,不论程序是否发生异常,都需要执行,比如对资源的回收。但是异常会引发程序的跳转,造成有些语句执行不到,finally就是用来解决这个问题的
注意:即使前面的代码return 返回了,也会执行finally代码,并且如果finally也有return的话,那么会返回finally中返回的值,也就是说返回值被finally中返回的值修改了
异常处理流程
关于调用栈:
方法之间是存在相互调用的关系的,这种调用关系我们可以用“调用栈”来描述。在JVM中有一块内存空间称为“虚拟机栈”专门存贮方法之间的调用关系。当代码中出现异常的时候,我们可以使用e.printStackTrace();的方式参看异常代码的调用栈
处理流程:

自定义异常类
public class UserNameException extends Exception{public UserNameException() {}public UserNameException(String message) {super(message);}
}自定义异常通常会继承Exception(受查异常)或者RuntimeException(非受查异常)
