​在上一篇中说道这篇文章会说java的动态绑定机制,由于这个知识点放在继承中讲会比较合适,说以在这篇文章中先来详细的说说String对象吧。

​只要学过Java的同学,我们都知道Java一共有8中基本类型,但是在Java中最常用的String类型却不属于这8中基本类型中。他是Java.lang包中的一个类。但是String对象在引用传递中JVM的处理却与其他对象不同。

​在正式开始来讲这个String对象的时候我们首先来简单的说明下Java中的值传递和引用传递。正如很多Java说熟知的那样,Java程序员是不需要显式的使用指针的,所以在java中所有的对象都是通过引用来传递,当然基本类型还是通过值来传递。

​但是String类型的对象在传递中却与普通对象的引用传递略有不同。现在我们就正式的来解释下这个String对象吧。

java文档中将String类对象称为不可变字符串。

​要理解上面这句话,首先要搞明白两个概念:字符串变量和字符串对象。

​字符串变量,是用来存放字符串变量引用的,他的值是可变的,可以根据需要存放不同的字符串对象引用的。

​字符串对象,其实我们可以理解为字符串常量,他是不可变的,一个字符串对象自从创建好后就存放在内存中     固定的位置,字符串对象中的字符也是不可以修改的。

并且字符串对象是共享的。

​编译器可以让字符串常量共享,我们可以这样理解,在JVM中存在一个公共的字符串存储池,我们每次新建一个字符串都会保存在 这个存储池中,但是在保存前,他会把这个字符串对象的值与池中已有的字符串对象进行对比,如果没有相同的就加进去,如果有则直接引用这个已有的。

​下面的一段代码可以帮助我们理解上面的概念。

String str1 = "hello";

String  str2 = "hello";

String str3 = "hell";

debug结果如下:

​上面的代码,我们申明了三个String变量 str1、str2、str3, str1和str2分别复制相同的字符串“hello”,debug时他们的内存id是相同的,这就说明变量str1和str2引用的是同一个内存块中的内容。str3赋值不同,所以内存id也就不同。

​但是需要我们格外注意的是,字符串对象的共享也只限制在复制或者是初始化,如果进行拼接字符串,这种共享就不存在了,JVM会为每个拼接的字符串对象都重新创建一个存储空间,所以进行大量字符串拼接的时候,我们是禁止用String对象的。

如下代码能说明该问题:

String str1 = "hello";

String str3 = str1;

String str2 = "hello ";

String world = "world";

String hw = "hello world";

String str4 = str2+world;

String str5 = str1 + " "+"world";

debug结果如下:

​上面的代码,str5是在str1的基础上拼接了“world”,但是在debug中我们可以看到str的值并没有变,而str5也并不是引用的str1的内存,而是新分配了内存。

接下来说一道我在搜房网面试时遇到的一道有关String对象的题目,来应用下上面说到的知识点:

预测下面java代码的执行结果:

​    ​public static void main(String[] args) {

String str = new String("John");

StringBuffer sbf = new StringBuffer("John1");

stringTest(str);

stringBufferTest(sbf);

System.out.println(str+"---"+sbf);

}

public static void stringTest(String str1){

str1 = str1+" test";

}

public static void stringBufferTest(StringBuffer sbf1){

sbf1.append(" test");

}

大家预测的结果是什么呢?是否和执行结果一致?

下面是执行结果:

下面我们就来详细的说明下这个执行结果的原因:

上面的变量str和sbf都是对象的引用,在调用stringTest()和stringBufferTest()的时候都是引用传递,但是为什么String对象没有拼上“ test”字符串呢?我用下面的图来说明问题。

这样大家应该有了解String对象了吧。如果大家发现我说的不对的地方希望大家能指出来。

以下是我的微信公众号,技术大牛集结号,欢迎您的关注!

给我足够的时间,我能模拟整个世界!

Java系列2 --- 你真的知道Java的String对象么?的更多相关文章

  1. java系列: 对不起,JavaFX——Java 8目前还不能救你(zz)

    JavaFX 是SUN公司在2007年JavaOne大会上首次对外公布的以Java为基础构建的富客户端平台,更让开发者印象比较深刻的则是其背后的JavaFX开发团队,仅仅在两年的时间就从1.0版本完善 ...

  2. Java内存管理-你真的理解Java中的数据类型吗(十)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最 ...

  3. [Java]如何把Soap Message装成一个String对象

    代码片段 // Create transformer TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf ...

  4. java中的string对象深入了解

    这里来对Java中的String对象做一个稍微深入的了解. Java对象实现的演进 String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以 ...

  5. Java String对象的经典问题(转)

    public class StringTest { public static void main(String[] args) { String strA = "abc"; St ...

  6. Java系列笔记(6) - 并发(上)

    目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchang ...

  7. 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)

    Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...

  8. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

  9. Java系列介绍

    Java系列目录 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述函数 Java 7新增功能 Java应用程序中System.out. ...

随机推荐

  1. 单片机驱动AT24C02存储芯片

    AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗.AT24C02有一个8字节页写缓冲器.该器件通过IIC总 ...

  2. objective-c中所谓的僵尸对象

    正常情况下向已回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写.cocoa提供了僵尸对象(Zombie Object)这个功能,简单的说:启用该调试功能后,运行时会将所有已回收的实例转 ...

  3. masm6.11的BUG?

    mov eax,[ebp + eax] ;->DS: mov eax,[eax + ebp] ;->SS: 上述2行代码生成的机器码反了,据说masm8也有此问题,但是masm9是正常的.

  4. 浮点数据有损压缩算法 附完整C代码

    在几年前的时候在做修图APP算法的时候, 曾经一度想过对3D Lut 预设数据进行压缩, 主要用于提升用户体验. 关于3d lut算法开源的资源也挺多的,就不多做科普了. 有兴趣的朋友,可以去查阅下f ...

  5. jQuery选择器面试题

    $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...

  6. Java学习不走弯路教程(7.Eclipse环境搭建)

    7.Eclipse环境搭建 在前几章,我们熟悉了DOS环境下编译和运行Java程序,对于大规模的程序编写,开发工具是必不可少的.Java的开发工具比较常用的是Eclipse.在接下来的教程中,我们将基 ...

  7. python结巴(jieba)分词

    python结巴(jieba)分词 一.特点 1.支持三种分词模式: (1)精确模式:试图将句子最精确的切开,适合文本分析. (2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解 ...

  8. Viavdo&ISE&Quartus II级联Modelsim级联仿真

    博主一直致力寻找高效的工作方式,所以一直喜欢折腾软件,从刚开始只用软件IDE自带的编辑器,到Notepad++,再到后来的Vim,从用ISE14.7自带的Isim仿真,到发现更好的Modelsim,再 ...

  9. Day5_协程函数_面向过程

    def func(count): while True: yield count count +=1 #这是一个生成器,需要利用next()来执行. func(10) #yield: #1.把函数的执 ...

  10. Angular为什么选择TypeScript?

    原文地址:https://vsavkin.com/writing-angular-2-in-typescript-1fa77c78d8e8 本文转自:http://www.chinacion.cn/a ...