- 浏览: 435128 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (214)
- android (12)
- mina (5)
- JVM (3)
- Maven (4)
- memcached (3)
- 程序人生 (9)
- hibernate (6)
- mysql (7)
- socket (4)
- php (7)
- 游戏 (8)
- spring (6)
- java基础 (25)
- linux (6)
- sqlserver (3)
- cocos2d-x (24)
- c++ (4)
- webservice (3)
- protobuf (4)
- visio工具 (1)
- ibatis (2)
- 多线程 (2)
- 分布式 (0)
- C# (1)
- struts2 (5)
- seo (1)
- photoshop (1)
- tiles (1)
- jsp (5)
- 前端 (1)
- intellij (6)
- ibatis springmvc (1)
- oracle (3)
- android studio (4)
- spring-boot (2)
- 微信小程序 (2)
- jquery mobile (1)
- vue (3)
- git (1)
最新评论
-
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
An internal error occurred during: "Updating Maven Project". Unsupported I问题解决备忘 -
emilchan:
谢谢,刚好用上
bugfree 站点有端口号 上传图片不显示 -
seeYourEye:
3q 解决了
An internal error occurred during: "Updating Maven Project". Unsupported I问题解决备忘 -
gqlu:
0.9.1版本 太低了点吧。。。
cocos2d-x中保存用户游戏数据CCUserDefault -
宋建勇:
缺少代码啊
key.isAcceptable()时怎么处理的 ...
Java异步socket
这段时间有不少关于String的帖子,也有很多很好的解释。我在这里就算是搜集一下,并简单地分析一下原因。一是我不熟悉JVM的底层规范,二是我觉得别人分析的很好,但是不能拘泥于这样分析,分析的目的是为了让我们明白其中的道理。
下面我列出参考的帖子,也方便大家去查看:
《深入研究java对String字符串对象的创建以及管理》;
还是靠程序来说话:
- public class VerifyString {
- public static void main(String args[]){
- String str1 = "I am a String";
- String str2 = "I am a String";
- String str3 = new String("I am a String");
- String str5 = "I am a ";
- String str6 = "String";
- String str7 = str5 + str6;
- String str8 = "I am a " + "String";
- String str9 = str3.intern();
- String str10 = str7.intern();
- if(str1 == str2)
- System.out.println("str1 and str2 are the same String.");
- else
- System.out.println("str1 and str2 are the different Strings.");
- if(str1 == str3)
- System.out.println("str1 and str3 are the same String.");
- else
- System.out.println("str1 and str3 are the different Strings.");
- if(str1 == str7)
- System.out.println("str1 and str7 are the same String.");
- else
- System.out.println("str1 and str7 are the different Strings.");
- if(str1 == str8)
- System.out.println("str1 and str8 are the same String.");
- else
- System.out.println("str1 and str8 are the different Strings.");
- if(str1 == str9)
- System.out.println("str1 and str9 are the same String.");
- else
- System.out.println("str1 and str9 are the different Strings.");
- if(str1 == str10)
- System.out.println("str1 and str10 are the same String.");
- else
- System.out.println("str1 and str10 are the different Strings.");
- }
- }
运行的结果是:
- str1 and str2 are the same String.
- str1 and str3 are the different Strings.
- str1 and str7 are the different Strings.
- str1 and str8 are the same String.
- str1 and str9 are the same String.
- str1 and str10 are the same String.
解释以上的输出结果,首先要理解一个叫String Pool的概念,虽然JVM没有明确提出这个概念,但是细想一下,别的语言String基本都是作为基本类型来处理的,而在Java中直接就是一个对象,然而奇怪的是对象能像基本类型那样直接赋常量。这就能看出Java设计者的那种取舍吧,毕竟作为对象来处理的话,效率没有基本类型那样高。我们不需要更多的理解,直接记住String str1 = "I am a String";是把"I am a String"扔到了字符串池中,然后把引用抛给str1,以后再有相同值的String变量也是这种赋值语句的,那么还是存在字符串池中,有就直接返回引用,没有就创建一个新的。所以说着语句就创建了一个String对象。再看下一个String str3 = new String("I am a String");这个创建了几个对象?两个!不要怀疑!一个是在new String("I am a String")创建在heap中的,另一个是str3也在heap中,它们所指向的字符数组是相同的,位于内存区的常量池中。关于这一点,请看大企鹅的这篇blog:《 还是 String》。接下来看str7和str8,明明两个的值是一样的,为什么结果不一样呢?这就牵扯到Java编译器对于不同str8的优化了。因为str7右边的是两个变量,而不是直接的两个值,编译器就无法在编译期间知道str8的值,相反,str8对于编译器来说直接就是str8 = "I am a String"了,这样的两种不同的情况,就有不同的结果了。再看str3和str7都和返回否定的,而为什么str9和str10返回的是一致的呢?因为intern()方法是把执行该方法的引用拖到了字符串池中,当然了如果字符串池中有的话,就直接返回引用了。
总结一下就是:
1. 区分好String str1 = "I am a String"和String str3 = new String("I am a String")创建对象的数目和地方。
2. 了解String str1 = "I am a " + "String"是编译期间确定值的。
3. 了解intern()方法。
发表评论
-
Java通过mysql-connector-java-8.0.11连接MySQL Server 8.0遇到的几个问题
2019-01-04 21:27 1840这次新安装了一个MySQL数据库,然后navicat连接数据 ... -
MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
2018-01-13 19:44 2137MySQL第二天早上第一次连接超时报错,解 ... -
用户登录安全:使用 Salt + Hash 来为密码加密
2017-09-21 13:43 2263我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个 ... -
java对cookie的读写操作
2014-12-16 13:59 685Java中如何读写cookie Java代码 ... -
CGLib动态代理原理及实现
2014-12-12 16:53 758JDK实现动态代理需要实 ... -
java动态代理(JDK和cglib)
2014-12-12 16:08 661JAVA的动态代理 代理模式 代理模式是常用的java设计模 ... -
使用 jfreechart 生成 曲线、柱状图、饼状图、分布图 展示到JSP
2014-09-11 15:05 1442虽然现在JS做报表和图 ... -
http请求后直接下载数据
2014-07-31 17:10 969@RequestMapping("/public ... -
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:com
2014-07-28 20:28 2264not a JRE问题在使用pom.xml配置默认Goa ... -
ConcurrentModificationException异常解决办法
2014-07-27 18:59 793java.util.ConcurrentModificati ... -
java 加载properties 文件的多种方法
2014-07-02 11:41 641这里介绍两种技术:利 ... -
java 内存查看命令 jmap
2014-07-01 14:11 2266内存监控的方法: 1. jmap -heap pid ... -
java高级程序员常见面试知识
2014-06-26 10:20 8551、java 内存模型,GC 工作原理 2、java c ... -
10分钟教会你Apache Shiro
2014-06-05 14:22 885前言 欢迎来到Apache Shi ... -
java Swing 播放背景音乐
2014-02-22 19:38 5396import java.io.FileNotFoundEx ... -
Cannot return from outside a function or method
2014-02-10 21:03 889最近发现myeclipse10中有几处bug ... -
代码生成工具
2013-12-13 13:46 7701、http://code.google.com/p/mrd ... -
Java Date 和 Calendar
2013-10-12 14:02 763Java 语言的Date(日期),Calendar(日历), ... -
Eclipse启动时发生An internal error occurred during: "Initializing Java Tooling".错误的解决
2013-10-09 19:14 1235Eclipse启动时发生An internal erro ... -
Javolution 类库特性简述 -- 转载
2013-08-05 14:23 1864Javolution 实时目标是简单的:使你的应用程序更快 ...
相关推荐
总之,"java自制string类例程"是一个很好的实践项目,可以帮助初学者巩固对Java字符串概念的理解,提高编程技能,并对面向对象编程的核心原则有更深入的认识。在实际编程中,虽然我们通常使用内置的String类,但这种...
GEE(Google Earth Engine)是谷歌推出的一个云计算平台,主要用于处理和分析地球科学...通过本节的学习,我们应该已经了解了这两种数据类型在GEE中的基本用法和构建函数,并对GEE命令语言的基本语法有了初步的认识。
通过学习这个实例,不仅可以提升编程技能,还能增进对中国传统文化的认识。同时,这种结合文化背景的编程实践也体现了编程不仅仅是逻辑和算法,更是一种表达和传播文化的手段。 在提供的压缩包“练习-唐诗三百首”...
物理学的发展历程中充满了统一事件,即不同现象被认识到是相互关联的,并通过调整理论来反映这种认识。其中最显著的例子之一发生在19世纪,当迈克尔·法拉第发现变化的磁场能够产生电场后,詹姆斯·克拉克·麦克斯韦...
在IT行业中,字符串(String)是数据处理中非常基础且重要的元素。无论是编程语言如Java、C#、Python,还是各种数据库、网络通信,都...对于源码的阅读和理解,有助于提升对字符串操作的深入认识,同时也能锻炼编程技巧。
这类库的存在表明了开发者对于JavaScript原生String方法不足之处的共识。 ### 3. 需要的String扩展函数类型 作者建议通过参考其他编程语言和JavaScript库来决定应该包含哪些String扩展函数。比如C#和Java等语言,...
很好的c++字符串参考手册,我就是通过它认识c++的强大的,并且学起来很有进
在C++编程中,实现String类是一个常见的练习题,旨在考查程序员对类的构造、析构以及赋值等行为的理解程度。...通过对String类的实现,可以加深对类的封装性、数据隐藏、资源管理等面向对象基本概念的认识。
通过这个函数的使用说明和示例,我们可以了解到PHP处理XML数据的灵活性和便利性,同时也认识到了在处理XML数据时需要注意的一些细节。simplexml_load_string函数是一个强大的工具,可以帮助开发者在应用程序中轻松地...
这是近期练习过的JavaSE基础源代码,含义注释及说明,适合复习Java基础使用,欢迎有需要的朋友下载交流学习。另外,热门专栏“Python从入门到人工智能”持续更新中,欢迎大家订阅学习和交流。
总结来说,理解`string`的不可变性和其内部实现机制对于编写高效且内存友好的C#代码至关重要。在处理字符串时,避免装箱操作和使用`StringBuilder`进行拼接可以显著提高性能并减少内存使用。此外,对`string`的这些...
这对于代码的可读性和维护性来说是非常重要的。 其次,Vbsedit提供了参数提示和自动完成关键字功能。当用户在编写代码时,编辑器会根据上下文智能提示可能的函数参数和关键字,极大地加快了编码速度,减少了手动...
Modbus通讯协议学习 - 认识篇 Modbus通讯协议是应用于电子控制器上的一种通用语言,通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的...
public Student(String name, int age, String gender, String studentId, String major) { super(name, age, gender); this.studentId = studentId; this.major = major; } } ``` 多态是面向对象的另一大特性...
无论是Object类的基本方法,还是String类的特性,都需要开发者在实践中不断加深认识,以便在编程时能够做出更优的选择。通过这样的知识梳理,可以系统地掌握Java在Android开发中的应用,为后续学习更复杂的Android...
### XML解析深度认识 #### 一、XML简介与解析方式 **XML (eXtensible Markup Language)** 是一种用于标记数据的语言,它被设计用来传输和存储数据。XML 的主要特性包括灵活性、可扩展性和易读性。XML 文件通常包含...
### 认识C#中的委托和事件 #### 引言 在.NET Framework中,委托与事件是极其重要的概念,尤其对于那些希望深入了解面向对象编程语言C#的人来说更是如此。尽管这些概念初看起来可能有些难以理解,但是一旦掌握了其...
例如,`String s1 = new String("Hello"); String s2 = new String("Hello"); s1 == s2`将返回`false`,因为它们指向内存中的不同对象,尽管它们的值相同。 **equals() 方法**: - `equals()`方法是为了解决`==`在...