`
ynp
  • 浏览: 428723 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

再一次理解String

阅读更多
偶然看到了篇关于String的文章,发现以前学的都忘了 ,所以写篇文章加深印象,可能有不对的地方,敬请指正.
public class StringTest {   
	public static void main(String[] args){    
		String s1 = "hello";   
		String s2 = new String("hello");   
		String s3 = new String("hello");   
		testString(s1,s2,s3); 
		//此时内存 情况见图一
		s2 = s2.intern();   
		//此时内存 情况见图二
		System.out.println("after s2.intern");   
		testString(s1,s2,s3);    
		  
	}   
	private static void testString(String s1,String s2,String s3){   
		System.out.println("s1 = s2 is "+(s1==s2));   
		System.out.println("s2 = s3 is "+(s2==s3));   
		System.out.println("s1.equals(s2) is "+s1.equals(s2));   
		System.out.println("s2.equals(s3) is "+s2.equals(s3));   
	}   
} 

输出结果为 
s1 = s2 is false 
s2 = s3 is false 
s1.equals(s2) is true 
s2.equals(s3) is true 
after s2.intern 
s1 = s2 is true 
s2 = s3 is false 
s1.equals(s2) is true 
s2.equals(s3) is true 


知识点一 String对象创建过程:
       语句一:String s1 = "hello";  
       语句二:String s2 = new String("hello");
       语句三:String s3 = new String("hello");
       语句一是创建前首先在Spring pool中查找hello对象,有则引用,没有现在String pool中创建,再引用此对象;
       语句二是在堆中创建hello对象,所以System.out.println("s2 = s3 is "+(s2==s3))//结果为false;
    此时内存见图一;
知识点二 intern()方法的作用:
        语句三:s2 = s2.intern();
       当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
    此时内存见图二;
  • 大小: 31.6 KB
分享到:
评论

相关推荐

    Java初学者都必须理解的六大问题

    也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。  上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造...

    Java的六大问题你都懂了吗

    instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。对于第二种变量,必须明确地进行...

    jpivot学习总结.doc

    menuLabel 否 String 是 如果多次定义 clickable ,那么它将通过一个右键来进行显示,这里的值就是右键菜单的名称。 sessionParam 否 String 是 参数名称,它将会被回写到 ...

    抽象工厂模式(Abstract Factory Pattern)

    在初始化的时候会用到一次具体工厂类名,我们根据.NET特有的反射机制又可以把这个在客户端唯一的具体的非抽象类放到一个应用程序配置文件中,防止它变化。 这就符合了设计模式中的“开放--封闭”原则,依赖倒转原则...

    (java se 代码)Bank Account Management System 银行账户管理子系统

    将下一个可用的id存放在文件中,每创建一个新对象的时候都会读取这个文件,获得新对象的id,并且修改文件中的id,使其加1后,再保存到文件中。 2、 修改Bank类中各个业务方法 分析: 要将账户信息全部保存到文件中,...

    最新JAVA编程题全集_50题及答案

    写一个单例模式(遇到两次) public class Test { private Test(){} private static Test test; public static Test getInstance() { if(test==null) { test = new Test(); } return test; }} 5. //统计...

    java-servlet-api.doc

    Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。 javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。 Servlet的解析和载入 Servlet引擎解析并...

    java课程设计九宫格数独.doc

    当然还是不能忘了游戏规则,由于1- 9的数字在每一行、每一列、每一个九宫格都要出现且只能出现一次,所以: 如果某行中已经有了某一数字,则该行中的其他位置不可能再出现这一数字 如果某列中已经有了某一数字,则该...

    最新超市收银程序--(java课程设计-).doc

    专业班级 学 号 姓 名 指导教师 2011年6月 "1 设计时间 " "2011.6.6-2011.06.10 " "2 设计目的 " "《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该" "课程后进行的一次较全面的综合...

    超市收银程序--(JAVA课程设计-2011).doc

    设计题目 超市收银程序 专业班级 学 号 姓 名 "1 设计时间 " "2011.6.6-2011.06.10 " "2 设计目的 " "《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该" "课程后进行的一次较全面的...

    二十三种设计模式【PDF版】

    翻译: 很多程序员在读完这本书,宣布自己相当于经历了一次"主显节"(纪念那稣降生和受洗的双重节日),如果你从来没有读 过这本书,你会在你的程序教育生涯里存在一个严重裂沟,所以你应该立即挽救弥补! 可以这么说:GoF ...

    达内 coreJava 习题答案

    // 每次 a 的下一项都等于前一项*10,再加上刚输入时的 a ;注意,这时的 a 已经变化了。 } System.out.println("sum="+sum); } } 8、求 2/1+3/2+5/3+8/5+13/8.....前20项之和? class Sum{ public static ...

    黑马入学试题及答案

    * 余数就是二进制数的最低位,接着再用得到的商作为被除数去除以2, * 这次得到的余数就是次低位,如此循环,直到被除数为0为止。 * 其实,只要明白了打印出一个十进制数的每一位的方式 * (不断...

    手机T9拼音输入法模仿器

    独立完成项目-----T9输入法模拟器 ... 加的时候等于说一次就加一个拼音组合的汉字 怎么样 思路还算可以吧 呵呵 字库未加完 我这里带上字库 自己加进去吧 呵呵这样应该可以交差了 在校学生: 小枪

    java面试题

    就是说只需要创建一次,以后再程序中就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时...

    net学习笔记及其他代码应用

    委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    先到网上下载一个MDAC(要是2.7以上的版本才行),然后安装,安装以后或许会重新启动一次。 然后再下载一个.NET FRAMEWORK SDK,安装以后会在控制面板里面的管理工具里面多两个东西,这个不用理睬他,我们要使用的...

    C#数据结构

    一 个String表示一个恒定不变的字符序列集合,所有的字符序 列集合构成String的取值范围。我们可以对String进行求长度、复制、连接两个 字符串等操作。 数据类型可分为两类:一类是非结构的原子类型,如C#语言中的...

    基于记录应用程序设计

    如果学生的答案与提供的答案不符,则告知学生结果并提供另一次机会回答问题。 四.数据的表示 为使该应用程序拥有较好的可移植性,关于某门课程的所有信息必须存入一个数据文件中,而不是直接将它们写入程序。程序...

Global site tag (gtag.js) - Google Analytics