Day08-异常机制、包装类、String-StringBuffer-StringBuilder比较
异常机制
异常处理5个关键字:try、catch、finally、throw、throws
-
注意点
-
假设要捕获多个异常,异常类型从小到大
-
try监控区域,catch(想要捕获的异常类型!)捕获异常
-
finally处理善后工作,可以不要finally
-
throw 主动抛出异常
-
throws在方法上捕获异常
-
包装类
包装类(Integer)-->String
Integer i=100;
String str1=i+"";
String str2=i.toString();
String str3=String.valueOf(i);
String-->包装类
String str4="12345";
Integer i2=Integer.parseInt(str4); //使用到自动装箱
Integer i3=new Integer(str4); //构造器
String、StringBuffer、StringBuilder
-
String
-
String实现了Serializable,说明了String可以串行化:数据可以在网络传输
-
String实现了Comparable接口,说明String对象可以比较
-
对象用于保存字符串,也就是一组字符序列
-
“jack”字符串常量,双引号括起的字符序列
-
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
-
String类有很多构造器,构造器的重载
-
String是final类,不能被继承
-
String有属性 private final char value[];用于存放字符串内容
-
value是一个final类型,不可以修改(value不能指向新的的地址,但是单个字符的内容可修改 )
-
扩展:
String b=new String("abc");
b==b.intern();//false
b.intern()指向的是常量池的地址,b指向的是开辟的堆的地址
String c1=”ab“+“cd”;//常量相加,指向的是常量池
String c1=a+b;//变量相加,是在堆中
-
StringBuffer
-
StringBuffer实现了Serializable,可以串行化:数据可以在网络传输
-
StringBuffer的直接父类是AbstractStringBuilder
-
在父类中 AbstractStringBuilder有属性char[] value, 不是final
-
该value数组存放字符串内容,因此存放在堆中的
-
StringBuffer是一个final类,不能被继承
-
因为StringBuffer字符内容是存在char[] value,所以在变化(增加/删除)不用每次都更换地址(即不是每次都创建新对象),所以效率高于String
String----》StringBuffer
String str="Hello tom";
//返回值才是StringBuffer对像,对str本身没有影响
StringBuffer stringBuffer=new StringBuffer(str);
StringBuffer stringBuffer1=new StringBuffer();
stringBuffer1 = stringBuffer1.append(str);
StringBuffer---》String
StringBuffer stringBuffer3=new StringBuffer("Hello");
String s = stringBuffer3.toString();
String s1=new String(stringBuffer3);
StringBuffer练习
从控制台输入数据,并对小数点前的数字每隔3位用逗号分隔,例如:输入123456.89后,则分隔后的结果为1,234,567.89
package 包装类;
import javax.lang.model.util.ElementScanner6;
import javax.xml.transform.Result;
import java.util.Scanner;
public class StringBufferTest {
public static void main(String[] args) throws Exception{
Scanner scanner = new Scanner(System.in);
StringBuffer stringBuffer = new StringBuffer(scanner.next());
//方法1
// if (stringBuffer.lastlastlastIndexOf(".") % 3 == 0) {
// int count = stringBuffer.lastlastIndexOf(".") / 3;
// for (int i = 0; i < count - 1; i++) {
// stringBuffer = stringBuffer.insert(stringBuffer.lastlastIndexOf(".") - (i + 1) * 3 - i, ',');
// }
// }
// else {
// if (stringBuffer.lastlastIndexOf(".") > 3) {
// int count = stringBuffer.lastlastIndexOf(".") / 3;
// for (int i = 0; i < count; i++) {
// stringBuffer = stringBuffer.insert(stringBuffer.lastlastIndexOf(".") - (i + 1) * 3 - i, ',');
// }
// } else if (stringBuffer.lastlastIndexOf(".") == -1) {
// int count = stringBuffer.length() / 3;
// for (int i = 0; i < count - 1; i++) {
// stringBuffer = stringBuffer.insert(stringBuffer.length() - (i + 1) * 3 - i, ',');
// }
// }
//
// }
//
//方法2
// try {
// if (Double.parseDouble(stringBuffer.toString()) >= 0) {
// if (stringBuffer.lastIndexOf(".") == -1) {
// int count = stringBuffer.length() / 3;
// for (int i = 0; i < count - 1; i++) {
// stringBuffer = stringBuffer.insert(stringBuffer.length() - 4 * i - 3, ',');
// }
// } else {
// int count = stringBuffer.lastIndexOf(".") / 3;
// if (stringBuffer.lastIndexOf(".") % 3 == 0) {
// count = count - 1;
// }
// for (int i = 0; i < count; i++) {
// stringBuffer = stringBuffer.insert(stringBuffer.lastIndexOf(".") - 4 * i - 3, ',');
// }
// }
// result = stringBuffer;
// System.out.println("手机\t价格");
// System.out.println("苹果\t" + result);
// }
// else {
// System.out.println("价格数不允许小于0");
// }
// } catch (NumberFormatException e) {
// System.out.println("价格输入不合法");
// //throw new RuntimeException(e);
//
// }
//方法3
for (int i=stringBuffer.lastIndexOf(".")-3;i>0;i-=3){
int strLength=stringBuffer.length();
//System.out.println(stringBuffer);
stringBuffer.insert(i,",");
}
System.out.println(stringBuffer);
}
}
方法1,2写法过于繁琐,建议使用方法3
注意:for(初始化表达式;条件表达式;更新表达式)再循环开始前,初始化表达式会被执行一次,因此这里的方法3,i的初始值不会跟着每次插入了“,”而跟着变化
-
stringBuilder
-
不是线程安全
-
用在字符串缓冲区被单个线程使用的时候,如果可能,优先使用该类
-
比stringBuffer要快
-
主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据
-
stringBuilder实现了Serializable,可以串行化:数据可以在网络传输
-
stringBuilder是final类,说明不能被继承
-
stringBuilder对象字符序列仍然是存放在其父类AbstractStringBuilder 的char[] value中,字符序列存放在堆中
-
stringBuilder的方法没有做互斥的处理,没有做互斥的处理,即没有synchronized关键字,在单线程的情况下使用stringBuilder
string、stringBuffer、stringBuilder比较
效率:stringBuilder>stringBuffer>string