Java常用类库与工具

1,借助JDK,选取几个String与StringBuffer,StringBuilder的常用API,并编写实例测试API的功能呢

 1 /**JDK中String 常用API equals 源码
 2 public boolean equals(Object anObject) {
 3         if (this == anObject) {
 4             return true;
 5         }
 6         if (anObject instanceof String) {
 7             String anotherString = (String)anObject;
 8             int n = value.length;
 9             if (n == anotherString.value.length) {
10                 char v1[] = value;
11                 char v2[] = anotherString.value;
12                 int i = 0;
13                 while (n-- != 0) {
14                     if (v1[i] != v2[i])
15                         return false;
16                     i++;
17                 }
18                 return true;
19             }
20         }
21         return false;
22     }
23 **/
24 
25 String a="123";
26 String b="123";
27 System.out.println(a.equals(b)

StringBuilder常用API

//创建StringBuilder对象
 2         StringBuilder bu = new StringBuilder();
 3         //使用append方法添加数据
 4         //注意:append方法返回的是this自身,无需接收返回值
 5         bu.append("abc");
 6         bu.append(111);
 7         bu.append(true)
 8         bu.append('中');
 9         bu.append(3.1415);
10         System.out.println(bu);// abc111true中3.1415
11 
12         //链式编程:方法返回值是一个对象,可以继续调用方法
13         bu.append("abc").append(111).append(true).append('中').append(3.1415);
14         System.out.println(bu);//abc111true中3.1415

StringBuffer常用API

1 /**
 2 1. append(参数); 向StringBuffer对象后追加任意类型的数据,返回StringBuffer。它有多个重载方法,可以追加int string char object array等
 3 **/
 4 
 5 StringBuffer buffer = new StringBuffer();
 6 
 7 buffer.append(89);
 8 
 9  
10 /**
11 2. capacity(); 返回int capacity,即缓冲区的容量大小
12 **/
13 
14 StringBuffer buffer = new StringBuffer("abc");
15 
16  
17 
18 buffer.capacity();
19 
20 //返回19;  原本16的容量加上字符串长度
21 
22  
23 
24 //3. charAt(int index); 返回缓冲区指定索引处的char字符
25 
26 StringBuffer buffer = new StringBuffer("abc");
27 
28 buffer.charAt(1);//取得b

2,请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用
共同点:
(1)内部实现基于字符数组,封装了对字符串处理的各种操作
(2)可自动检测数组越界等运行时异常

区别:
(1)String内部实现基于常量字符数组,内容不可变;StringBuffer、StringBuilder基于普通字符数组,数组大小可根据字符串的实际长度自动扩容,内容可变
(2)性能方面,对于字符串的处理,相对来说StringBuilder>StringBuffer>String
(3)StringBuffer线程安全;StringBuilder非线程安全

使用:
1.使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
2.使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
3.使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。

3,为什么不建议在for循环中使用“+”进行字符串拼接?
常用的字符串拼接方式有五种,分别是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。
用时从短到长的对比:StringBuilder < StringBuffer < concat < + < StringUtils.join
由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。
而“+”反编译后的代码,在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。
而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。
因此,经过对比发现,直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。
但是,还要强调的是:
(1)如果不是在循环体中进行字符串拼接的话,直接使用+就好了。
(2)如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。

4,什么是字符串的编码和解码?请举例说明
将unicode字符集转为本地字符集(如GB2312或GBK)的过程叫编码,反之叫解码
【例】将程序中的含有中文的字符串进行编码

import
java.io. *;
public class CharCode{
    public static void printByteArray(String msg,byte[] t){
        System.out.println(msg + "****************");
        for(int i = ;i<t.length;i++){
           System.out.println(Integer.toHexString(t[i]));
        }
     }
     public static void printCharArray(String msg,char[]c){
        System.out.println(msg + "***************");
        for(int i = 0;i<c.length;i++){
            System.out.println(Integer.toHexSring(c[i]));
        }
     }
     public static void main (String[] args){
        try{
            String str = "中文";
            System.out.println(str);
            //unicode字符集中“中文”二字的对应代码
            printCharArray("unicode:",str.toCharArray());
            //转为本地字符集GB2312对应的代码
            byte[] b = str.getBytes("GB2312");
            printByteArray("GB2312",b);
            //转为ISO8859 - 1对应的代码,因为ISO8859 - 1是英文字符集
            //没有对应的汉字代码,所以转化错误
            byte[] m = str.getBytes("ISO8859 - 1");
            printByteArray("ISO8859 - 1",m);
        }
        catch(UnsupportedEncodingException e){
            System.out.println("没有相应的字符集!");
         }
      }
   }
            

【例】设定从键盘输入相应的字符存入字节数组B中,将其解码为unicode字符

import java.io.*;
public class Decode{
   public static void printByteArray(String msg,byte[] t){
      System.out.println(msg + "****************");
      for(int i = 0;i<t.length;i++){
          System.out.println(Integer.toHexString(t[i]));
       }
     }
     public static void printCharArray(String msg,char[] c){
        System.out.println(msg + "****************");
        for(int i = 0;i<c.length;i++){
           System.out.println(Integer.toHexString(c[i]));
        }
      }
      public static void main(String[] args){
         byte b = new byte[6];
         int t = 0,pos = 0;
         String s;
         try{
           while(t!='\n'){
             t=System.in.read();   //输入内容按字节读入存放
             b[pos]=(byte)t;
             pos++;
           }
           printByteArray("本地码:",b);
              s = new String(b,"GBK")//按照GBK方式进行解码
           System.out.println(s);
           printCharArray("unicode码:",s.toCharArray());
        }
      catch(Exception e){
          System.out.println(e.getMessage());
        }
      }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值