zoukankan      html  css  js  c++  java
  • Java String对象的问题 String s="a"+"b"+"c"+"d"

    1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的)
    2,StringBuilder sb = new StringBuilder();
    String a = "a";
    String b = "b";
    String c = "c";
    String d = "d";
    String s = a+b+c+d;  这句话创建了几个对象
    StringBuilder sb = new StringBuilder();
    sb.append("a").append("b").append("c").append("d");这句话创建了几个对象
    
    -------------------------------------------------------------------------------------------
    答案是  7   3    0
    
    第一题:“a”“b”“c”“d” “ab”“abc”“abcd”
    第二题: “ab”“abc”“abcd”
    第三题:因为a”“b”“c”“d”在串池中已经存在,不会创建对象,并且StringBuilder添加字符串的时候跟String
    是不一样的,StringBuilder是不会创建对象的(所以说我们在增加字符串长度的时候尽量用StringBuilder,这样会少创建对象,节省资源,提高效率)
    所以是0个对象
    第一题中如果无(假设之前串池是空的)这句,结果则为一个对象
    
    在JVM中有一个字符串池,它用来保存很多可以被共享的String对象,这样如果我们在使用同样字面字符串时,它就使用字符串池中同字面的字符串。常量池是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。由于常量字符串是在编译的时候就也被确定的,因"a"、"b"、"c"和"d"都是常量,因此变量s1的值在编译时就可以确定。这行代码编译后的与String s1="abcd";是一样的。

    下面说说用+连接字符串时的情况

    public class TestString {  
        private static String str = "abc";  
        public static void main(String[] args) {  
            String str1 = "a";  
            String str2 = "bc";  
            String combo = str1 + str2;  
            System.out.println(str == combo);  
            System.out.println(str == combo.intern());  
        }  
    }
    

    这个例子用来说明用+连接字符串时,实际上是在堆内容创建对象,那么combo指向的是堆内存存储”abc”字符串的空间首地址,显然str==combo是错误的,而str==combo.intern()是正确的,在String池中也存在”abc”,那就直接返回了,而str也是指向String池中的”abc”对象的。此例说明任何重新修改String都是重新分配内存空间,这就使得String对象之间互不干扰。也就是String中的内容一旦生成不可改变,直至生成新的对象

    同时问题也来了,使用+连接字符串每次都生成新的对象,而且是在堆内存上进行,而堆内存速度比较慢(相对而言),那么再大量连接字符串时直接+是不可取的,当然需要一种效率高的方法。Java提供的StringBuffer和StringBuilder就是解决这个问题的。区别是前者是线程安全的而后者是非线程安全的,StringBuilder在JDK1.5之后才有。不保证安全的StringBuilder有比StringBuffer更高的效率

    自JDK1.5之后,Java虚拟机执行字符串的+操作时,内部实现也是StringBuilder,之前采用StringBuffer实现。

    总结:引用在栈而对象在堆

  • 相关阅读:
    openstack计算节点nova
    openstack控制节点nova
    openstack镜像服务glance
    openstack验证服务keystone
    openstack基础环境
    关于mysql中like查询是否通过索引的测试
    并发编程的优缺点
    mybatis中namespace配置方式
    开通技术博客的第一天
    ajax的使用
  • 原文地址:https://www.cnblogs.com/zgz345/p/6640826.html
Copyright © 2011-2022 走看看