Day08-异常机制、包装类、String-StringBuffer-StringBuilder比较

发布时间 2023-06-16 19:56:13作者: 文姬公主

异常机制

异常处理5个关键字try、catch、finally、throw、throws

  • 注意点

    1. 假设要捕获多个异常,异常类型从小到大

    2. try监控区域,catch(想要捕获的异常类型!)捕获异常

    3. finally处理善后工作,可以不要finally

    4. throw 主动抛出异常

    5. 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

  1. 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;//变量相加,是在堆中  
  1. 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的初始值不会跟着每次插入了“,”而跟着变化

  1. stringBuilder

  • 不是线程安全

  • 用在字符串缓冲区被单个线程使用的时候,如果可能,优先使用该类

  • 比stringBuffer要快

  • 主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据

  • stringBuilder实现了Serializable,可以串行化:数据可以在网络传输

  • stringBuilder是final类,说明不能被继承

  • stringBuilder对象字符序列仍然是存放在其父类AbstractStringBuilder 的char[] value中,字符序列存放在堆中

  • stringBuilder的方法没有做互斥的处理,没有做互斥的处理,即没有synchronized关键字,在单线程的情况下使用stringBuilder

string、stringBuffer、stringBuilder比较

效率:stringBuilder>stringBuffer>string