Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题

1、String 、StringBuffer、StringBuilder的执行效率

StringBuilder > StringBuffer > String

当然这个是相对的,不一定在所有情况下都是这样 如:

String a = ‘a‘ + ‘b’ + ‘c‘ 的效率比 StringBuffer buffer = new StringBuffer().append(‘a‘).append(’b‘).append(’c‘)要高

因此这三个类各有利弊,要根据自己的需要来决定用哪个

当字符串较少或者改动比较少的情况下 建议使用String

当字符串较多或者改动量比较大的情况下,建议使用StringBuilder,如果考虑使用线程,则用StringBuffer

1. 下面这段代码的输出结果是什么?

String a = "hello2";   String b = "hello" + 2;   System.out.println((a == b));

输出的结果是:true  "hello" + 2在编译的时候会隐式转换为"hello2" 因此a变量和b变量指向同一个对象

2.下面这段代码的输出结果是什么?

String a = "hello2";    String b = "hello";       String c = b + 2;       System.out.println((a == c));

输出的结果是:false  由于有引号的存在,所以编译的时候 不会把它当成一个常量

3.下面这段代码的输出结果是什么?

String a = "hello2";     final String b = "hello";       String c = b + 2;       System.out.println((a == c));

输出的结果是:true   final修饰的变量在编译的时候会将变量直接替换成真实的值  获取【下载地址】  springmvc+mybatis+spring 整合

4.下面这段代码输出结果为:

public class Main {
    public static void main(String[] args) {
        String a = "hello2";
        final String b = getHello();
        String c = b + 2;
        System.out.println((a == c));
    }
     
    public static String getHello() {
        return "hello";
    }
}

输出的结果是:false  虽然该变量是被final修饰 但是它是通过方法来赋值的 而在编译的时候 并不知道方法会返回什么值

5.下面这段代码的输出结果是什么?

public class Main {
    public static void main(String[] args) {
        String a = "hello";
        String b =  new String("hello");
        String c =  new String("hello");
        String d = b.intern();
         
        System.out.println(a==b);
        System.out.println(b==c);
        System.out.println(b==d);
        System.out.println(a==d);
    }
}

输出的结果是:

false

false

false

true

这里涉及到String.intern方法的使用,intern方法会先在运行时常量池中查找是否有相同的字符串,如果有则返回指向该地址的引用,因此a和d指向的是同一个对象

6.String str = new String("abc")创建了多少个对象?

这个问题在很多书籍上都有说到比如《Java程序员面试宝典》,包括很多国内大公司笔试面试题都会遇到,大部分网上流传的以及一些面试书籍上都说是2个对象,这种说法是片面的。

很显然,new只调用了一次,也就是说只创建了一个对象。

这里有一个混淆的地方,就是该代码在加载和执行的时候的区别 加载的是 确实只new一个对象 在执行的时候 又创建了一个String对象

面试官在问这个问题的是  最好是问清楚下"是这段代码在执行的时候创建了多少个对象还是单纯的这段话涉及到了多少对象"

当然 如果是笔试的话 还是按照网上的来 2个对象 一个abc 一个通过new 创建并初始化的对象 内容是abc

时间: 2024-10-15 07:21:31

Java中String、StringBuffer、StringBuilder的区别及面试经常出现的问题的相关文章

java中String与StringBuilder的区别

本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和

java中String&StringBuffer&StringBuilder

1. String,字符串常量 StringBuffer,字符串变量(线程安全) StringBuilder,字符串变量(非线程安全) 2.String and StringBuffer String和StringBuffe的主要区别在于String是不可变对象,每次对String进行改变的时候其实 等于生成了一个新的String对象,因此经常改变内容的字符串不要使用String类型,因为每次形成新的对象都会对系统的性能产生影响,特别当内存中的无引用的对象多了之后,JVM的GC就会开始工作,那速

java中string , StringBuffer , StringBuilder 区别

1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这样的值,虚拟机则会另外在方法区中划分出一块内存空间存储字符串常量,然后把这块地址赋给String变量. 因此,String类的内容声明后不可被改变,改变的只是其内存地址的指向. 2.StringBuffer StringBuffer是使用缓冲区存储字符串对象的,对象的内容可以改变.并且是线程安全的.

Java中String, StringBuffer, StringBuilder

String: 1,是字符串常量,一旦创建就不能修改.对于已经存在了的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 2,String也是final类,不能被继承. 3,而且String是对象而不是基本类型. 4,string重写了equals方法和hashCode()方法. StingBuffer: 1,是字符串可变对象,可以对字符串进行操作,修改字符串原有值时不会新建一个对象. 2,执行效率较慢,但是线程安全 3,StringBuffer没有覆盖equals方法和ha

Java杂谈之StringBuffer----兼带String,StringBuffer,StringBuilder的区别

在Java中,用到最多的当属String类型的数据了 而这一点就要涉及String , StringBuffer , StringBuilder这三大类 下面主要来比较一下String和StringBuffer的区别,因为StringBuffer和StringBuilder 太相似,所以就不拿来比较了. 提及一下,StringBuffer和StringBuilder的区别 从安全性来说,StringBuffer更安全,StringBuffer主打线程安全 从执行效率来说,StringBuilde

探秘Java中String、StringBuilder以及StringBuffer

探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于

java String,StringBuffer,StringBuilder的区别

StringBuilder.StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...).只是StringBuffer会在方法上加synchronized关键字,进行同步. 最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer ? 这句话并不理解. 1 String String:字符串常量,字符串长度不可变.Java中String是immutable(不可变)的. String类的包

JAVA中String和StringBuilder类的特点及使用

转自:https://www.imooc.com/code/2202 仅做个人学习记录之用,侵删! 什么是 Java 中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对象的方法: Java 中字符串的不变性 String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同.如下所示: 运行结果: 结合上面的代码,关于字符串小

String,StringBuffer,StringBuilder的区别

StringBuffer和StringBuider的区别 StringBuffer是jdk1.0版本的,是线程安全的,效率低 StringBuilder是jdk1.5的,是线程不安全的,效率高 String和StringBuffer,StringBuilder的区别 String是一个不可变的字符序列 StringBuffer,StringBuilder是可变的字符序列

java中String、StringBuilder、StringBuffer三者的区别

在Java项目开发中,字符串是最长使用的数据类型,而有关字符串的String.StringBuilder.StringBuffer三者又常常让人分不清楚什么时候该使用哪个. 特此整理一下. String字符串常量 大家都知道String是一个不可变的类,任何对String的改变都会引发新的String对象的生成:因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,