java第八章作业

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

class test{
    public static void main(String[] args){
        String s1 = new String("hello");
        StringBuffer s2 = new StringBuffer("good");
        StringBuilder s3 = new StringBuilder("world");
        System.out.println(s1.concat(" judy!"));
        System.out.println(s1.replace('l', 'm'));
        System.out.println(s1);//s1没有改变
        String[] s4 = new String[2];
        s4=s1.split("e");
        System.out.println(s4[1]);
        System.out.println(s2.replace(1, 3, "a"));
        System.out.println(s2.reverse());
        System.out.println(s2);//s2被改变了
        System.out.println(s2.insert(2, "233"));
        s2=s2.append(s1);
        System.out.println(s2.length());
    }

}
class test{
    public static void main(String[] args){
        int m = 1;
        String s = "a";
        long startTime1 = System.currentTimeMillis();
        for(int i=0; i<100000;i++){ 
            s = s + m ;  //效率低下,需新建一万个对象
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("程序运行时间:"+ (endTime1-startTime1)+"ms");
        int n = 1;
        StringBuffer st = new StringBuffer("a"); //效率较高,只需新建一个对象
        long startTime2 = System.currentTimeMillis();
        for(int i=0; i<100000;i++){ 
            st.append(n);
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println("程序运行时间:"+ (endTime2-startTime2)+"ms");
        int q = 1;
        StringBuilder sd = new StringBuilder("a"); //效率较高,只需新建一个对象
        long startTime3 = System.currentTimeMillis();
        for(int i=0; i<100000;i++){ 
            sd.append(q);
        }
        long endTime3 = System.currentTimeMillis();
        System.out.println("程序运行时间:"+ (endTime3-startTime3)+"ms");
    }
}

程序运行结果

2. 请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?

  • String对象是不可变的,在String类中每一个看起来会修改String对象内容的方法,实质都是创建了一个全新的String对象。
  • StringBuffer对象的值是可变的,对字符串的增加、插入、修改、删除等操作比String高效,不需多次创建新的对象。
  • StringBuilder,其与StringBuffer的API兼容,性能比StringBuffer更高,但不是线程安全的。
  • 在运行速度方面,从上一题的程序运行结果可以看出String的处理速度比StringBuffer和StringBuilder慢得多。
  • 在安全性方面,string被设计成不可变是更加安全的,尤其是作为参数传递时,且String哈希码具有唯一性,可以缓存。而StringBuffer和StringBuilder相比,StringBuffer具有线程安全性。

3. 为什么不建议在for循环中使用“+”进行字符串拼接?

从第1题的代码示例中可以看出,当for循环次数很多时,由于String是不可变对象,每次对其进行字符串拼接都需要创建一个新的对象,非常消耗内存空间,且创建对象耗时较多,因此程序运行会需要更长时间。
可以首先将String对象转换成StringBuffer对象,在循环中使用StringBuffer对象的append方法,这样只需要创建一个对象,消耗更少,最后只需要将StringBuffer对象转换成String对象输出。

4. 什么是字符串的编码与解码?请举例说明。

编码:将Unicode字符集转换为本地字符集(GB2312或GBK)的过程。

import java.io.*;
public class test { 
    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])); 
        }//Integer.toHexString将十进制转成十六进制输出
    }
    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){
        try{
            String str = "你好";
            System.out.println(str);
            printCharArray("unicode:",str.toCharArray()); //unicode字符集中对"你好"二字的对应十六进制代码,toCharArray将字符串转换为字符数组
            byte[] b =str.getBytes("GB2312"); //编码:转为本地字符集GBK2312对应的十六进制代码
            printByteArray("GB2312",b);
        }
        catch(UnsupportedEncodingException e){
        System.out.println("没有相应的字符集!"); 
        } 
    } 
}
    
    
      
    

解码:将本地字符集转换为Unicode字符集的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值