面试题:String,StringBuffer,StringBuilder

String:

字符串,Java程序中的所有字符串字面量,如"abc",都被实现为该类的实例。不可变,线程安全, 在创建之后不能更改。

StringBuffer:

字符串缓冲区,线程安全,可变字符序列,类似于String,但是可修改. 从JDK
5发行版开始,这个类已经得到了一个等价的类的补充,这个类(StringBuilder)是为单个线程设计的。

StringBuilder

一个可变的字符序列。该类提供一个与StringBuffer兼容的API,但不保证同步,不安全。

使用特点:

String:是不可变数据;大部分需要连接操作时将产生新的字符串,而不是修改原有字符串,所以使用大量字符串操作,应该使用StringBulider.

StringBuffer:对于单任务的字符串操作通常应该优先使用 StringBuilder类,因为它支持StringBuffer所有相同的操作,但速度更快,因为它不执行同步。

StringBuffer可以作为多线程应用的考虑,是线程安全的,也正因为考虑线程安全问题,会比StringBuilder稍微慢一些.

在String类中,主要是对字符串进行比较,和提取。如(equals(), substring(),indexof()等等)。String,重写equals(),重写hashCode()

在StringBuffer中,主要操作append和insert方法,它们被重载以接受任何类型的数据。 每个都有效将给定的数据转换为字符串,然后将该字符串的符附加或插入到字符串缓冲区中。 append方法总是在缓冲区的末尾添加这些字符; insert方法在指定的点处添加字符。StringBuffer 类没有定义equals方法 !

StringBuilder:主要方法和StringBuffer一样,但是由于线程不安全,所以适用于单线程下在字符缓冲区进行大量操作的情况。

代码示例:

public static void optString() {


    //String字符串的主要操作方法

    String s1 = "helloworld";
    String s2 = "helloworld";
    boolean b1 = (s1.equals(s2));// 比较两个字符串内容是否相等
    System.out.println("s1是否等于s2?  " + b1);
    String s3 = "abcdefghijk";
    String s4 = s3.substring(3, 7);                 // 得到s3的第4个字符到第8个字符之间的子串
    String s5 = s3.replace("fgh", "QQ");            // 将s3中的子串"fgh"替换成"QQ"
    String s6 = s3.toUpperCase();                // 将s3中的所有字符换成大写字母
    char c = s3.charAt(6);              // 得到s3第6个位置的字符
    int pos = s3.indexOf('h');           // s3中"hij"出现的位置
    System.out.println("s3的第4个字符到第8个字符之间的子串= " + s4);
    System.out.println("s3中的子串\"fgh\"替换成\"QQ\"= " + s5);
    System.out.println("s3的所有字符换成大写字母= " + s6);
    System.out.println("s3的第7个字符= " + c);
    System.out.println("s3中\"hij\"出现的位置= " + pos);
    String s11 = "123";
    int n = Integer.parseInt(s11);              // 得到s11对应的整数
    String s12 = "123.06";
    float f = Float.parseFloat(s12);        // 得到s12对应的小数
    int m = 2012;
    String s13 = String.valueOf(m);            // 将m转换为字符串
    String s14 = s13 + 136;         //  将年份和数字136拼接成学号
    System.out.println("s11对应的整数= " + n);
    System.out.println("s12对应的整数= " + f);
    System.out.println("小明的学号是:" + s14);

    String s15 = "abc";
    int preHashCode = s15.hashCode();//创建String对象时的哈希码
    System.out.println("String链接之前的hashCode值:" + preHashCode);
    s15 = s15 + "ee";
    System.out.println(s15);
    int nowHashCode = s15.hashCode();//String连接之后时的哈希码
    System.out.println("String链接之前的hashCode值:" + nowHashCode);

    System.out.println("hashCode是否一致:\t" + (preHashCode == nowHashCode));//false,因为String是不可变的,因此是连接操作实际上是产生新的字符串


    //StringBuffer的主要操作,
    StringBuffer sbf = new StringBuffer("hello ");   // 创建一个StringBuffer对象sbf
    preHashCode = sbf.hashCode();//StringBuffer对象的哈希码
    System.out.println("修改StringBuffuer之前的hashCode值:" + preHashCode);
    // 在sbf的第7个位置插入"beautiful "
    sbf.insert(6, "beautiful  ");
    // 向sbf中追加"may!"
    sbf.append("may");
    System.out.println(sbf);

    nowHashCode = sbf.hashCode();//StringBuffer对象的哈希码
    System.out.println("修改StringBuffuer之后的hashCode值:" + nowHashCode);
    System.out.println("hashCode是否一致:\t" + (preHashCode == nowHashCode));//true,因为StringBuffer是可变的,因此是对同一个对象进行操作


}

运行结果:
String

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值