Java不可变序列String和可变序列StringBuilder、StringBuffer

String

String变量是不可变的,源码里面用了final修饰。

private final char value[];
String str = "Hello";
System.out.println(Integer.toHexString(str.hashCode()));
str = "World";  //字符串一旦变化就会重写生成一个对象
System.out.println(Integer.toHexString(str.hashCode()));
//输出
42628b2
4fe2b72

StringBuilder线程不安全,但效率高,常用。

StringBuffer线程安全,但效率低。

StringBuilder sb = new StringBuilder("Hello");
System.out.println(Integer.toHexString(sb.hashCode()));
sb.append(" World");    //追加
System.out.println(sb);
System.out.println(Integer.toHexString(sb.hashCode()));
//输出
45ee12a7
Hello World
45ee12a7
public class Test {
    public static void main(String[] args) {
        String str1 = "";
        long num1 = Runtime.getRuntime().freeMemory();
        long num2 = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            str1 = str1 + i;
        }
        long num3 = Runtime.getRuntime().freeMemory();
        long num4 = System.currentTimeMillis();
        System.out.println("消耗内存:"+(num3-num1));
        System.out.println("消耗时间:"+(num4-num2));

        StringBuilder str2 = new StringBuilder("");
        long num5 = Runtime.getRuntime().freeMemory();
        long num6 = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            str2.append(i);
        }
        long num7 = Runtime.getRuntime().freeMemory();
        long num8 = System.currentTimeMillis();
        System.out.println("消耗内存:"+(num7-num3));
        System.out.println("消耗时间:"+(num8-num4));

    }
}
//输出
消耗内存:-5895808
消耗时间:149
消耗内存:0
消耗时间:0

原文地址:https://www.cnblogs.com/chiweiming/p/11305157.html

时间: 2024-08-30 12:09:54

Java不可变序列String和可变序列StringBuilder、StringBuffer的相关文章

Python中的可变、不可变对象和赋值技巧序列解包

可变对象和不可变对象 在python中一切皆对象.在Python中不存在所谓的值传递调用,一切传递都是对象的引用,也可认为是传址. python中,对象分为可变(mutable)和不可变(immutable)两种类型,元组(tuple).数值型(number).字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象. 不可变对象 见一个例子,分析不可变对象的特点 python内置id()函数,用于返回对象的唯一标识(identity).id()

java String不可变对象,但StringBuffer是可变对象

什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变. 区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑.看下面代码: [java] view plain copy Str

[转]为什么Java中的String不可变

笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int.boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在. 但是稍有研究的人就会发现,String对象是不可修改的,源代码中的String类被定义为final,即为终态,不可继承,String也不提供任何直接修改对象内部值的方法,每次使用replace.substring.trim等方法,或是使用字符串连接符+时,都是返回一个全新的String对象,整个Stri

Java设计模式之immutable(不可变)模式

immutable简介 不可变对象永远不会发生改变,其字段的值只在构造函数运行时设置一次,其后就不会再改变.例如JDK中常见的两种基本数据类型String和Integer,它们都是不可变对象.为了理解immutable与mutable的区别,可以看看下面的一段代码: package date0804.demo2; import java.awt.Point; public class ImmutableString { public static void main(String[] args)

为什么Java中的字符串是不可变的?

原文链接:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/ java字符串是不可变的.不可变类只是一个不能修改实例的类.实例创建时所有的信息都被初始化,并且信息不能被修改.不可变类有许多优点.本文总结了字符串为什么被设计成不可变的原因.这说明在记忆的角度不变性的概念,同步和数据结构. 1.字符串池的要求: 字符串池(字符串特定池)是方法区域中的一个特殊存储区域.当创建字符串时,如果字符串已经存在于池中,则将

第17章 string基本字符序列容器

/* 第17章 string基本字符序列容器 17.1 string技术原理 17.2 string应用基础 17.3 本章小结 */ // 第17章 string基本字符序列容器 // 17.1 string技术原理 -------------------------------------------------------------------------------------- // 17.2 string应用基础 ----------------------------------

string基本字符序列容器(竞赛时常用的使用方法总结)

C语言只提供了一个char类型用来处理字符,而对于字符串,只能通过字符串数组来处理,而C++STL提供了string基本字符序列容器来处理字符串,可以将其理解为字符串类,它提供了添加,删除,替换.查找和比较等丰富.简洁的方法. 下面是在编写代码是的具体应用. 1 //关于C++ STL string基本字符系列容器的学习,看别人的代码一百遍,不如自己动手写一遍. 2 #include <string> 3 #include <vector> 4 #include <iostr

Java源码分析——String的设计

Tip:笔者马上毕业了,准备开始Java的进阶学习计划.于是打算先从String类的源码分析入手,作为后面学习的案例.这篇文章寄托着今后进阶系列产出的愿望,希望能坚持下去,不忘初心,让自己保持那份对技术的热爱. 因为学习分析源码,所以借鉴了HollisChuang成神之路的大部分内容,并在此基础上对源码进行了学习,在此感谢. 问题的引入 关于String字符串,对于Java开发者而言,这无疑是一个非常熟悉的类.也正是因为经常使用,其内部代码的设计才值得被深究.所谓知其然,更得知其所以然. 举个例

java内存分配和String类型的深度解析(转)

一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析 关于String的许多令人迷惑的问题.下面是本文将要涉及到的一些问题,如果读者对这些问题都了如指掌,则可忽略此文. 1.java内存具体指哪块内存?这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小? 2.String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBu