String类疑虑
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类疑虑的更多相关文章
- 标准库String类
下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...
- 自己实现简单的string类
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...
- C++ string类的实现
c++中string类的实现 今天面试被考到了, 全给忘记了!!! //string类的实现 #include <iostream> #include <string.h> ...
- String类的功能
String类 标红的为较少出现的 1.判断功能 boolean equals(Object obj) :比较字符串内容是否相同,区分大小写 boolean equalsIg ...
- java基础复习:final,static,以及String类
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- 05_整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明
Question: 整理String类的Length().charAt(). getChars().replace(). toUpperCase(). toLowerCase().trim().toC ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- String类常用方法
1.String类的特点,字符串一旦被初始化就不会被改变. 2.String对象定义的两种方式 ①String s = "affdf";这种定义方式是在字符串常量池中创建一个Str ...
随机推荐
- android用于打开各种文件的intent
import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.n ...
- Routing 服务
WCF Routing 服务 WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发, ...
- IE, FireFox, Opera 浏览器支持CSS实现Alpha透明的方法 兼容问题
一:要解决的问题时:在ie6-ie11下兼容下面透明上传文件button的效果. 实现方式通过滤镜实现. 二:效果图例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- 30第二建筑Github Page
从我原来博客的前端传输.链接:http://www.hacke2.cn/create-github-page/ 假设中国每一个程序猿都写博客,那么中国IT届的春天就来了 有同学问我的站点是怎么创建的, ...
- A Game of Thrones(7) -Arya
Arya’s stitches were crooked again. She frowned down at them with dismay and glanced over to where h ...
- 福利 城市名的python list
["上海","北京","北京市","朝阳","朝阳区","海淀","元 ...
- ServiceProvider实现
ServiceProvider实现揭秘 [总体设计 ] 本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们 ...
- Java重写方法与初始化的隐患(转)
原文出处: Shawon 虽然文章标题是Java, 但几乎所有面向对象设计的语言都遵守这个初始化流程, 感谢廖祜秋liaohuqiu_秋百万指出, 之前忘记提这个了. 前言 drakeet写了个和Re ...
- Java文件压缩分割(待)
http://blog.csdn.net/ycg01/article/details/1366648
- 【PLSQL】package包的使用
************************************************************************ ****原文:blog.csdn.net/clar ...