zoukankan      html  css  js  c++  java
  • String和StringBuffer的区别

      相信大家都有用过String和StringBuffer吧,但是具体两者之间有什么区别呢?

    其实很简单,就一个区别,那就是String声明之后的值是不可修改的,而StringBuffer是可以修改的。

      这个时候应该会有反对意见了吧,因为会说String定义之后的值是可以修改的,如下 

    public class Test{

             public static void main(String args[]){

                       String str="hello ";

                       str+="world!!";

                       System.out.println(str);

             }

    }

       通过以上的代表进行编译之后,会发现出现的结果是:

     

    hello world!!

     

       很明显,这个时候String中的值就已经改变了,但这只是显示的值改变了,堆中的数值是否改变了呢?请看下图:

     

      其实String也是一个类,里面也存在着自己的构造方法,然而当我们用String str=“hello”的时候,定义的”hello”就相当于一个匿名对象,所以一开始会在栈中定义一个str对象,并在堆中开辟一个空间,存放“hello”,当我们执行到str+=“world”的时候,出现了“world”,所以堆中会开辟一个新的空间来存放“world”,而通过“+”连接成的新的字符串“hello world”也是一个匿名对象,所以也会在堆中开辟一个空间来存放,而这个时候str已经执行了“hello world”了,根据一个栈对象不能同时指向两个堆内存空间,所以str要断开与“hello”的连接,重新指向“hello world”,所以这个时候在控制台输出的时候就会输出“hello world”了。

      但是大家仔细想想,这个时候原来的“hello”的值改变了吗?明显是没有的,而只是str的地址指向改变了。而且如果“hello”和“world”没有新的引用的话,就会被垃圾回收机制回收。

      所以说,String的定义之后的值是不会改变的,而StringBuffer通过append()或者其他方法是可以改变的。

      在开发中,应该尽量避免如下的操作 

    public static void main(String args[]){

             String str="hello ";

             for(int i=0;i<100;i++){

                       str+=i;

             }

             System.out.println(str);

    }

     

      因为即使能完成自己想要的功能,但是在堆中是要断开100次连接的,这样的操作性能是很低的。

  • 相关阅读:
    SpringCloud笔记(一)服务注册与发现
    个人备忘录
    ActiveMQ 消息持久化到Mysql数据库
    染色 [组合数 容斥]
    各种图床
    NOIP2012 疫情控制
    网格计数
    找钱 [多重背包 计数]
    序列[势能线段树]
    牛客挑战赛33 B-鸽天的放鸽序列
  • 原文地址:https://www.cnblogs.com/littleQin/p/3630696.html
Copyright © 2011-2022 走看看