`
flm_llx
  • 浏览: 62527 次
  • 性别: Icon_minigender_1
  • 来自: 应县
社区版块
存档分类
最新评论

全面理解String(JAVA复习)- -

    博客分类:
  • java
阅读更多
1.      首先String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;
但它又是一种特殊的对象,有其它对象没有的一些特性。
2.      new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
3.      String str=”kvill”;
String str=new String (“kvill”);的区别:
在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
看例1:
        String s0=”kvill”;
        String s1=”kvill”;
        String s2=”kv” + “ill”;
        System.out.println( s0==s1 );
System.out.println( s0==s2 );
        结果为:
true
true
       首先,我们要知道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。
所以我们得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
看例2:
        String s0=”kvill”;
        String s1=new String(”kvill”);
        String s2=”kv” + new String(“ill”);
        System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
        结果为:
false
false
false
       例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。

4.      String.intern():
再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了
例3:
        String s0= “kvill”;
        String s1=new String(”kvill”);
        String s2=new String(“kvill”);
        System.out.println( s0==s1 );
        System.out.println( “**********” );
       s1.intern();
        s2=s2.intern();             //把常量池中“kvill”的引用赋给s2
        System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
        结果为:
false      
**********
false       //虽然执行了s1.intern(),但它的返回值没有赋给s1
true    //说明s1.intern()返回的是常量池中”kvill”的引用
true
      
       最后我再破除一个错误的理解:
有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中
如果具有相同值的Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址
如果在表中没有相同值的字符串,则将自己的地址注册到表中“
如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的:
看例4:
        String s1=new String("kvill");
        String s2=s1.intern();
System.out.println( s1==s1.intern() );
System.out.println( s1+"  "+s2 );
System.out.println( s2==s1.intern() );
结果:
false
kvill  kvill
true
在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的
当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。
       s1==s1.intern()为false说明原来的“kvill”仍然存在;
       s2现在为常量池中“kvill”的地址,所以有s2==s1.intern()为true。
5.      关于equals()和==:
这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
6.      关于String是不可变的。
这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,
比如说:String str=”kv”+”ill”+”  “+”ans”;
就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和”  “ 生成 ”kvill  “存在内存中,最后又和生成了”kvill  ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的
分享到:
评论

相关推荐

    java 310-055 v2.29考试系统

    Java 310-055是Oracle ...总之,Java 310-055 v2.29考试系统是准备Java SE 6 Programmer认证考试的重要工具,它提供了丰富的学习资源,能够帮助考生全面理解和掌握Java编程的基础知识,为职业发展打下坚实基础。

    八皇后等java作业-bupt

    综上所述,这个压缩包提供了一个全面的学习和实践Java编程的资源库,涵盖了从基础到进阶的主题,对于理解和掌握Java编程语言具有很大的帮助。无论是初学者还是有一定经验的程序员,都可以从中受益。

    超详细的Java复习知识点2019——个人笔记.zip

    这份名为"超详细的Java复习知识点2019——个人笔记"的文档,旨在为初学者提供一个全面且深入理解Java基础知识的指南。笔记内容可能涵盖了以下几个关键领域: 1. **Java语法基础**:包括变量、数据类型、运算符、...

    java复习资料20151125

    总的来说,"Java复习资料20151125"是一个全面的Java学习资源,它可以帮助学习者从基础到进阶全面掌握Java编程,并通过大量的练习题来提升技能和应试能力。对于那些准备参加Java认证考试,或是想要在工作中提升Java...

    java课程期末复习提纲及课后答案

    在2014 Java复习提纲中,我们可以期待看到以下内容: 1. **Java语言基础**:这可能涵盖了变量、数据类型、运算符、控制结构(如if语句、for循环和while循环)、方法的定义和调用,以及基本的输入输出操作。 2. **...

    java-final-review.rar_选择题

    每个文件名称列表中的"java期末复习.doc"文档很可能包含了以上各个知识点的题目和解析,通过仔细阅读和做题,可以全面检测和提升Java编程技能。在复习时,不仅要记住答案,更要理解背后的原理,这样才能在实际编程中...

    Core_java复习用的,如有不明白,查看权威资料

    以上内容构成了对Core Java基础知识较为全面的覆盖,对于初学者来说是很好的复习材料。当然,要深入理解和掌握这些知识点,还需要结合实践进行不断的练习和探索。如果有任何不清楚的地方,建议参考权威的Java教材或...

    java复习讲义ppt12讲

    这份"java复习讲义ppt12讲"是针对大学Java课程精心编排的复习材料,旨在帮助学生巩固和深化对Java语言的理解。讲义可能包含了以下几个关键知识点: 1. **Java简介**:这部分会介绍Java的历史、发展背景、特点以及它...

    Java经典复习资料

    每个"java复习题"文档可能分别专注于以上某一或多个主题,通过解答这些题目,开发者可以全面地回顾和巩固Java知识,为实际项目开发打下坚实基础。在学习过程中,结合实例和实践是加深理解的关键。希望这份复习资料能...

    Java学习,新手入门,老手复习

    对于新手来说,这份文档将提供一个全面的起点,帮助他们建立起对Java编程的基础理解。而对于老手来说,这可能是回顾基础知识、巩固理解的好资源。通过系统地学习这些内容,读者可以逐步提升自己的编程技能,为开发更...

    java语言程序设计原书第十版(复习题,课后题答案以及源码)

    总之,《Java语言程序设计原书第十版》提供的复习题、课后题答案和源码资源为学习者提供了全面的学习路径,从基础知识到高级技术,从理论理解到实践操作,帮助他们成为熟练的Java程序员。深入研读并实践其中的内容,...

    java_exam

    总之,要通过“java_exam”,我们需要全面理解和掌握Java的基础知识,深入学习其特性和应用,并通过实践不断巩固提高。同时,熟悉Java的最新发展动态也是至关重要的,以便适应不断变化的软件开发环境。

    java期末复习题(共三份)

    Java是一种广泛使用的面向对象的编程语言...通过这三份文档的复习,学生将能够全面理解和掌握Java编程的核心概念和技术,为期末考试做好充分准备。在复习过程中,建议结合实际编程练习,加深理解,提高解决问题的能力。

    2020天津理工大学期末java复习.zip

    这份名为“2020天津理工大学期末java复习.zip”的压缩包显然包含了针对天津理工大学Java课程期末复习的资源,帮助学生准备即将到来的考试。以下是这些资源可能涵盖的关键知识点的详细解释: 1. **Java基础语法**:...

    Java基础练习题,提供给刚学JAVA复习用的

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了熟练掌握Java,不断练习和巩固基础知识至关重要。...在完成这些练习后,你将对Java有更全面的理解,并具备解决实际问题的能力。

    Java程序设计复习大纲+复习题及答案.doc

    《Java 语言程序设计》复习大纲涵盖...通过这个复习大纲,学习者可以全面回顾Java程序设计的主要内容,加强理论知识,提高编程实践能力。对于准备考试或面试的人员来说,这是一个宝贵的资源,有助于提升Java编程技能。

    《JAVA语言程序设计》期末考试复习资料.pdf

    通过上述内容,可以针对《JAVA语言程序设计》期末考试进行全面复习,重点理解Java的基础知识、面向对象的特性、异常处理机制、常用类库的使用等。注意,由于扫描文档的不准确性,部分内容可能需要结合实际的Java知识...

    java中期考试复习题

    ### Java复习题概览 - **知识点覆盖范围**:这份复习题集涵盖了Java编程语言中的多种基础及进阶主题,旨在帮助学生全面复习Java相关的概念和技术。 - **题型分析**:题目类型包括选择题、填空题等,其中选择题涉及...

Global site tag (gtag.js) - Google Analytics