java中String、StringBuffer、StringBuilder

12 篇文章 0 订阅
  1. String、StringBuffer、StringBuilder区别
    答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
    而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
    StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

  2. 面试题 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
    答:如果使用少量的字符串操作,使用 (+运算符)连接字符串;
    如果频繁的对大量字符串进行操作,则使用
    1:全局变量或者需要多线程支持则使用StringBuffer;
    2:局部变量或者单线程不涉及线程安全则使有StringBuilder。

    那为什么我们很少见到StringBuilder呢?原因很简单,因为我们有时候很难确定我们创建的系统会不会是多线程的,如果考虑到以后扩展的可能性,则更难确定,所以我们更愿意使用StringBuffer,因为它是线程安全的,不用担心以后扩展。

  3. 面试题 - 请说出下面程序的输出。

    class StringEqualTest {
    
        public static void main(String[] args) {
            String s1 = "Programming";
            String s2 = new String("Programming");
            String s3 = "Program" + "ming";
            System.out.println(s1 == s2);
            System.out.println(s1 == s3);
            System.out.println(s1 == s1.intern());
        }
    }

    结果是false true true
    String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。

  4. 面试题 - 数据类型之间的转换:

    • 如何将字符串转换为基本数据类型?
    • 如何将基本数据类型转换为字符串?
      答:
    • 调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;
    • 一种方法是将基本数据类型与空字符串(”“)连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串。
  5. 如何实现字符串的反转及替换?
    答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:

        public static String reverse(String originStr) {
            if(originStr == null || originStr.length() <= 1) 
                return originStr;
            return reverse(originStr.substring(1)) + originStr.charAt(0);
        }
  6. 怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
    答:代码如下所示:

    String s1 = "你好";
    String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

    参见String的构造函数:

        /**
         * Constructs a new {@code String} by decoding the specified array of bytes
         * using the specified {@linkplain java.nio.charset.Charset charset}.  The
         * length of the new {@code String} is a function of the charset, and hence
         * may not be equal to the length of the byte array.
         *
         * <p> The behavior of this constructor when the given bytes are not valid
         * in the given charset is unspecified.  The {@link
         * java.nio.charset.CharsetDecoder} class should be used when more control
         * over the decoding process is required.
         *
         * @param  bytes
         *         The bytes to be decoded into characters
         *
         * @param  charsetName
         *         The name of a supported {@linkplain java.nio.charset.Charset
         *         charset}
         *
         * @throws  UnsupportedEncodingException
         *          If the named charset is not supported
         *
         * @since  JDK1.1
         */
        public String(byte bytes[], String charsetName)
                throws UnsupportedEncodingException {
            this(bytes, 0, bytes.length, charsetName);
        }

    以及getBytes()方法:

    /**
         * Encodes this {@code String} into a sequence of bytes using the named
         * charset, storing the result into a new byte array.
         *
         * <p> The behavior of this method when this string cannot be encoded in
         * the given charset is unspecified.  The {@link
         * java.nio.charset.CharsetEncoder} class should be used when more control
         * over the encoding process is required.
         *
         * @param  charsetName
         *         The name of a supported {@linkplain java.nio.charset.Charset
         *         charset}
         *
         * @return  The resultant byte array
         *
         * @throws  UnsupportedEncodingException
         *          If the named charset is not supported
         *
         * @since  JDK1.1
         */
        public byte[] getBytes(String charsetName)
                throws UnsupportedEncodingException {
            if (charsetName == null) throw new NullPointerException();
            return StringCoding.encode(charsetName, value, 0, value.length);
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值