String类
字符串在开发中的应用特点
String类的特点
-
Java程序中所有双引号字符串,都是String这个类的对象
`String s = "字符串";
可以直接创建对象 -
字符串一旦被创建,就不可更改
String s = "abc"; s = "def"; //实际上是新的"def"对象替换了原来s所记录的对象"abc" System.out.println(s);
不可更改:是字符串内容不可更改,如果想要更改,只能使用新的对象,做替换
-
String字符串虽然不可改变,但是可以被共享 字符串常量池:当使用双印花创建字符串对象时,会检查常量池中是否存在该数据 若不存在:创建 若存在:复用 (ps:不同的JDK版本,字符串常量池所在的位置不同 JDK7版本之前:StringTable是在方法区中,JDK7版本开始:StringTable被挪到了堆内存中)
String类常见的构造方法
-
public String( )
:创建一个空白字符串,里面不含任何内容String s1 = new String( );
-
public String(char[] chs)
:根据传入的字符数组,创建字符串对象String s2 = new String( chs);
-
public String(String original)
:根据传入的字符串,来创建字符串对象
String 类用于比较的方法
-
equals方法
public boolean equals(要比较的字符串)
将此字符串与指定的对象比较(内容比较) 谁调用都可以 eg: s1.equals(s2); 完全一样结果才为ture -
equalsIgnoreCase
public boolean equalsIgnoreCase(要比较的字符串)
不考虑大小写
String 类用于遍历的方法
-
toCharArray该方法将字符串拆解为数组
char[] chars = s.toCharArray();
(ps:如果调用的方法与主方法是平级的:加static,反之都不加) (此方法效率更高) -
charAt——charAt(int 索引)
String s = "abcd"; for(int i=0;i<4;i++){ char c = s.charAt(i); //完成字符串的遍历 }
使用length方法获取长度length(是一种方法,使用时不要忘了括号) 此时循环里可写成: for(int i=0;i<s.length;i++)
String 类用于字符串截取的方法
-
substring
-
public String substring(int index):根据传入的索引开始做截取,截取到字符串的末尾 使用方法:
String s2 = s.substring(2);
-
public String substring(int bindex,int eindex):根据传入的开始和结束索引,对字符串进行截取 使用方法:
String s2 = s.substring(0,1)
; 注意事项:包含头不包含尾
注:截取出来的内容作为新的字符串返回,要找变量接收
String类用于替换的方法
-
replace public String replace(CharSequence target,CharSequence repalcement) 参数1:旧值 参数2:新值 ps:必须是原值完全匹配,才能用新值做替换
String类用于切割的方法
-
split public String[] split(String regex) (参数为规则) 例如:
String s = 192,168,1,1; String[] sArr = s.split(","); for(int i = 0;i < sArr.length;i++){ System.out.println(sArr[i]); }
制定规则时,先正常指定切割规则,若没有得到期望的结果,在规则前面加\\: "\\规则" 例如:若在上例中将逗号改为点,不能分割成功,因为"."是一个通配字符,可以代表任一字符,而在前面加上"\\."就可以解决问题
StringBuilder类
StringBuilder的作用:提高字符串操作效率
介绍
-
一个可变的字符序列
-
StringBuilder是字符串缓冲区,将其理解是容器,这个容器可以存储任意数据类型,但是只要进入这个容器全都变成字符串 ps:打印对象名的时候结果呈现的也是字符串而不是地址
StringBuilder的构造方法
-
public StringBuilder():创建一个空白的字符串缓冲区(容器),其初始容量为16个字符,超过之后容器会自动做扩容
-
public StringBuilder(String str):创建一个空白的字符串缓冲区(容器),容器在创建好之后,就会带有参数的内容
StringBuilder常用成员方法
-
append public StringBuilder append(任意类型) :添加数据,并返回对象自己
StringBuilder stb = new StringBuilder; stb.append("补药"); stb.append("上学");
链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法 stb.append("a").append("b").append("c")...;
String[] sArr = stb.toString().split(",");
-
reverse public StringBuilder reverse():将缓冲区中的内容进行反转 应用案例:判断一个字符串是否为回文字符串,对拿到的字符串进行反转,若反转后的内容与原数据相同则为回文字符串
Scanner sc = new Scanner(System.in); String s = sc.nextLine(); //将String转换为StringBuilder,以调用内部reverse方法 StringBuilder stb = new StringBuilder(s); stb.reverse(); //接下来判断反转后的内容与原数据是否相同,即用s和stb作比较 //此时要注意s和stb的类型不同,不能直接比较,可将stb转为String类型 if(s.equals(stb.toString())){ System.out.println("是对称字符串"); } else{ System.out.println("不是对称字符串"); }
-
length public int length():返回长度
-
toString public String toString():将缓冲区中的内容,以String字符串类型返回
使用场景:数据在StringBuilder中,但是要调用的方法StringBuilder没有而String有,就需要将数据转换为String再调用
->String转换为StringBuilder
String s = "abc"; StringBuilder stb = new StringBuilder(s);
->StringBuilder转换为String
StringBuilder stb = new StringBuilder(); String s = stb.toString();
-->案例:定义一个方法,把int中的数据按照指定的格式拼接成一个字符串返回 例如:数组int[] arr={1,2,3} 输出为[1,2,3]
public static String arrayToString(int[] arr){ //创建一个StringBuilder对象,以进行拼接 StringBuilder stb = new StringBuilder("["); //遍历数组,获取数组内部元素 for(int i = 0; i < arr.length - 1; i ++){ //快捷键:arr.fori //将获取到的元素拼接到字符串缓冲区 stb.append(arr[i]).append(","); } //特殊处理最后一个元素 stb.append(arr[arr.length-1]).append("]"); //将stb转为String类型 return stb.toString(); }
(ps:StringBuilder用于线程不安全(效率高),StringBuffer用于线程安全(效率低))
包装类
将基本数据类型包装为类(变成引用数据类型) int->Integer char->Character (其他类一般都直接大写首字母)
Integer类
手动装箱:调用方法手动将基本数据类型包装为类
-
public Integer(int value):通过构造方法(不推荐)
-
public static Integer valueOf(int i):通过静态方法
Intefer i1 = Integer.valueOf(num)
手动拆箱:调用方法手动将包装类拆成(转换)基本数据类型 int i = i1.intValue;
JDK5开始,出现了自动拆装箱 自动装箱:可以将基本数据类型,直接赋值给包装类的变量 自动拆箱:可以将包装类的数据,直接赋值给基本数据类型变量
-
Integer常用方法(都是被静态修饰):
-
toBinaryString:转二进制
-
toOctalString:转八进制
-
toHexString:转十六进制
-
parseInt:将数字字符串转换为数字 注意:所转换的必须是数字字符串
-
Integer i1 = 127; Integer i2 = 127; System.out.println(i1 == i2); //true Integer i3 = 129; Integer i4 = 129; System.out.println(i3 == i4); //false
自动装箱的时候,如果装箱的数据范围,是-128~127,==号比较的结果就是true,反之都是false
自动装箱的原理:自动帮我们调用了Integer.valueOf(int i) 如果装箱的数据不在-128~127之间,会创建新的对象 如果在范围内,不会创建新的对象,而是从底层的数组中取出一个提前创建好的Integer对象并返回 (ps:Integer类中,底层存在一个长度为256个大小的数组Integer[] cache) 在数组中,存储了256个Integer对象,分别是-128~127)
BigDecimal类
用于解决小数运算中,出现的不精确问题
-
创建对象
-
public BigDecimal(double val)(不推荐:无法保证小数运算的精确)
-
public BigDecimal(String val)
BigDecimal bd = new BigDecimal("0.1");
-
public static BigDecimal valueOf(double val)
BigDecimal bd = BigDecimal.valueOf(0.1);
-
-
常用方法
-
add:加法
-
subtract:减法
-
multiply:乘法
-
divide:除法
-
divide(用于除不尽) 参数:(另一个BigDecimal对象,精确几位,舍入模式):除法 四舍五入模式:RoundingMode.HALF_UP 进一模式:RoundingMode.UP 去尾模式:RoundingMode.DOWN
注意:如果使用BigDecimal运算,出现了除不尽的情况,就会出现异常
-
doubleValue:将BigDecimal对象转换为基本数据类型double型
-
异常
介绍: 指的是程序在编译或执行过程中,出现的非正常(错误)的情况(语法错误不是异常)
-
阅读异常信息:从下往上看
-
找异常错误位置
-
异常名称(Java中所有的异常都是类)
-
异常原因
-
异常的体系
Throwable->分为Error和Exception
Error:严重级别问题 常见:栈内存溢出,堆内存溢出
Exception异常类->分为RuntimeException及其子类(运行时异常)和除RuntimeException之外的所有异常(编译时异常) 编译时异常:编译阶段就出现的错误(语法错误不算),需要在运行之前给出解决方案 运行时异常:编译阶段没有错误,运行期间可能会出现的错误
异常的处理方式
Java对于异常的默认处理方式:向上抛出 处理流程: ①虚拟机会在出现异常的代码那里自动创建一个异常对象 ②异常会从方法中出现的点这里抛给调用这,调用者抛给JVM虚拟机 ③虚拟机接收到异常对象后,先在控制台直接输出异常信息数据 ④终止Java程序的运行,后续代码没有机会执行了
-
异常处理方式1 try...catch捕获异常 好处:异常对象可以被捕获,后续的代码可以继续执行 格式:
try{ 可能会出现异常的代码 //new 异常对象类() }catch(异常名称 对象名){ //类似于 类名 对象名 异常的处理方案 }catch(另一异常名称 对象名){ 异常的处理方案 }
执行流程:
-
执行try{}中的代码,看是否有异常对象产生
-
没有:catch不会捕获,后续代码继续执行 有:catch捕获异常对象,执行catch{}中的处理方案,后续代码继续执行 有多个异常可能性,编写多个catch进行处理 优化:(但是不建议,不能做精准处理)
try{ 可能会出现异常的代码 //new 异常对象类() }catch(Exception e){ //用到父类:Exception e = new 异常名称();->多态 异常的处理方案 }
注意:如果捕获多个异常,最大的异常要放到最后进行捕获
-
-
异常处理方式2 throws 抛出异常 起到声明作用 在方法名后加throws XxxException,XxxxException (throws可以声明多个异常,用逗号做分割)
-
throw:用在方法中,后面跟的是异常对象,其作用是抛出异常对象 throws用在方法名后,起到声明作用
-
抛出的异常对象如果是编译时异常,必须使用throws声明 如果是运行时异常,不需要写throws
-
选择:
正在面临的异常,是否需要暴露出来: -不需要暴露:try...catch捕获 -需要暴露:抛出异常
自定义异常
自定义编译时异常:创建一个类,继承Exception,重写构造器
自定义运行时异常:创建一个类,继承RunTimeException,重写构造器
异常的细节:
-
Throwable的常用方法: public String getMessage() 获取异常的错误原因 public void printStackTrace() 展示完整的异常错误信息(不会强制终止)
-
子类重写父类方法时,不能抛出父类没有的异常,或者比父类更大的异常
容器与泛型
List
有序集合,元素顺序是固定的,可以包含重复的元素 可以通过索引快速访问和修改元素
-
常见实现类:ArrayList、LinkedList、Vector
Set
无序集合,元素顺序不固定,具有唯一性,不允许添加重复的元素 通过迭代器访问元素
-
常见实现类:HashSet、LinkedHashSet、TreeSet
Map
可以用于存储配置信息,缓存等
无序集合(但有些实现类可以保持插入顺序),键不可以重复,但是值可以重复 以键值对的形式存储数据,每个键只能映射到一个值,但是不同的键可以映射到相同的值 通过键访问值,或者通过迭代器访问键值对
-
常见实现类:HashMap、LinkedHashMap、TreeMap