Java String类疑虑:

  • 拼接

String是java的经常使用类之中的一个,本质是字符数组char[]。String类是final类,不可被继承。

关于String的创建,能够通过new来创建对象,也能够直接赋值。可是这两种创建方式的实现机制是不同的。提到对象的创建。我们就会想到堆、栈,这里另一个string pool的概念,JVM维护一个String池,池中的string对象不可反复。string池不属于堆栈。而是一个常量池。

一、创建

创建一个String对象,主要有两种方式:

String str1 = new String("abc"); //在string池中创建abc对象,在堆中创建abc对象,栈中的str1指向该对象
String str2 = "abc";//在string池中查找abc对象,已存在,直接将栈中的str2指向该对象

细致看两行凝视,运行完第一行代码后,内存如图:

运行完第二行代码,内存如图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1c29uZzA2MDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

可通过内存比較来验证:

先自己思考一下结果再往下继续啦!

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1 ==str3);
System.out.println(str1 == "abc");
System.out.println(str3 =="abc");
System.out.println(str1 == str3.intern());
System.out.println(str3 == str3.intern());

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1c29uZzA2MDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

解析:

==比較的是内存地址,

str1==str2。// 都指向string池中的对象,所以返回true

str1==str3;//str1指向string池中的对象,str3指向堆中对象,所以,返回false

str1==“abc”; //都指向string池中的对象,所以返回true

str3==”abc“;//str3指向堆内存对象,还有一个是string池中的对象,所以,返回false

str1==str3.intern(); //都指向string池中的对象。返回true

str3==str3.intern()。//str3指向堆内存对象。str3.intern()指向string池中的对象。所以。返回false

intern()方法是返回字符串对象的规范化表示形式。也就是说当调用intern()时。假设string池中已经包括一个等于(equals)此string对象的字符串。则返回池中的字符串。

二、拼接

先来思考一下运行结果:

<span style="white-space:pre">	</span>String hello = "hello";
String hel = "hel";
String lo = "lo";
System.out.println(hello == "hel"+"lo");
System.out.println(hello == "hel"+"looo");
System.out.println(hello== "hel" + lo);

执行结果:

解析:

  • 假设+连接的都是常量时,先推断string池中有没有hello,假设存在。直接返回其地址。不再又一次创建。
  • 假设+连接的有对象类型时,则直接在堆中生成一个新对象。

关于String拼接的继续思考:

因为String类是final的,也就是对象一旦创建,就不能改变其内在状态了,可是,拼接操作是要改变String的内部状态的,在这样的矛盾下,要维护string的非可变性。仅仅好在拼接完毕后再创建一个新的String对象,也就是说,每运行一次拼接操作,都会产生新对象的产生。当大量指向拼接操作时,就会导致大量对象的创建,这样。就产生了性能问题。

为了解决问题,jkd为string类提供了一个可变的配套类StringBuffer。因为StringBuffer是可更改,但是,当剪接改变了内部数据结构,但不创建一个新的对象。故,有一个非常大的性能提升。

版权声明:本文博主原创文章,博客,未经同意不得转载。

String类疑虑的更多相关文章

  1. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  2. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  3. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  4. String类的功能

    String类              标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...

  5. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

    Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...

  8. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  9. String类常用方法

    1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...

随机推荐

  1. H2O是开源基于大数据的机器学习库包

    H2O是开源基于大数据的机器学习库包 H2O能够让Hadoop做数学,H2O是基于大数据的 统计分析 机器学习和数学库包,让用户基于核心的数学积木搭建应用块代码,采取类似R语言 Excel或JSON等 ...

  2. POJ--3268--Silver Cow Party【SPFA+邻接表】

    题意:一些牛要去某一点參加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少须要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其它各个点的最短路径.从牛的家中走到聚会地点,能够把 ...

  3. 不知道的JavaScript

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章  初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目吸 ...

  4. [置顶] 一步一步学android之事件篇——下拉列表事件

    上一篇RadioGroup比较简单,所以再学习个spinner的OnItemSelectedListener事件,前面说过spinner的主要功能就是提供列表显示的选择,比如我们在选择城市的时候就会用 ...

  5. umlの实现图

    在uml中大部分模型描写叙述了逻辑和设计方面的信息: 用例图知道期望 类图能够知道问题域的词汇(类.对象) 状态图.交互图和活动图能够知道类图中的词汇是怎样写作完毕行为的(逻辑结构) 实现图是用来描写 ...

  6. Android Studio 入门(转)

    本文适用于从Eclipse转AndroidStudio的开发者 最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少 ...

  7. hdu3804(树链剖分)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804 题意:给定一棵n个结点的树及边权,回答m个询问(x,y)满足以下条件的边权: 1)该边在结点1~ ...

  8. 共享库方案解决WAS中JAR包冲突

    实现步骤: 1.        准备共享库JAR包 commons-httpclient-3.1.jar httpclient-4.3.3.jar httpcore-4.3.2.jar httpmim ...

  9. Linux智能小开关rfkill

    Linux智能小开关rfkill Rfkill,当中rf是Radio frequency(射频).主要作用是一个专门管理开关的子系统,举例说明Android手机的通知栏能够方便地开关Airplane/ ...

  10. duilib底层机制剖析:窗口类与窗口句柄的关联

    转载请说明原出处.谢谢~~ 看到群里朋友有人讨论WTL中的thunk技术,让我联想到了duilib的类似技术. 这些技术都是为了解决c++封装的窗口类与窗口句柄的关联问题. 这里是三篇关于thunk技 ...