`
剑锋凛冽
  • 浏览: 73440 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java中String的一些细节

 
阅读更多

 

 1,String直接量Java会使用一个字符串池来保存,因此new String(java)实际上创建了两个对象:在堆内存中的String类型的对象和在栈内存中的字符串直接量对象。并且,如果字符串使用连接字符串的方式创建,如果字符串在编译时(即不包含任何变量即可确定,则将其指向字符串池中的对应对象

 2,通过字符串常量拼接的方式实现的字符串实际上只保存最后计算结果到字符串池,而不会创建中间结果的字符串池对象。即:String s=”ja”+”va”;实际上只创建了一个字符串直接量,而不是3个。

  3,对于String对象的比较,有这样的含义: ==比较的实际上是内存地址,而equals比较的才是内存地址中对应的值。并且equals底层实际上是通过字符序列的compareTo实现的。

代码如下所示:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String s1 = new String("java");// 该语句实际创建了两个对象,
		//一个是堆内存中包含值“java”的String对象,一个是栈内存中的值为“java”的String对象
		//并且s1实际指向的是堆内存中的String对象
		String s2 = "java";//只创建了一个String直接量,直接指向字符串池中已存在的String对象。
		String s3 = "java";
		System.out.println("通过==比较new对象与字符串直接量的值" + (s1 == s2));//==比较的实际是内存地址
		System.out.println("通过equals比较new对象与字符串直接量的值" + s1.equals(s2));//equals比较的才是值
		System.out.println("通过==比较字符串直接量的值" + (s2 == s3));
		System.out.println("通过equals比较new对象与字符串直接量的值" + s2.equals(s3));
        String s4="ja"+"va";//连接字符串中不包含变量,可以在编译时就确定,因此指向字符串池中的对象
        System.out.println("字符串连接(不包含变量)::通过==比较字符串直接量的值" + (s4 == s3));
		System.out.println("字符串连接(不包含变量)::通过equals比较new对象与字符串直接量的值" + s4.equals(s3));
		String temp="ja";
		String s5=temp+"va";//虽然它的值域s4相同,但指向的是堆内存中的String对象
		System.out.println("字符串连接(包含变量)::通过==比较字符串直接量的值" + (s5 == s3));
		System.out.println("字符串连接(包含变量)::通过equals比较new对象与字符串直接量的值" + s5.equals(s3));
		final String temp1="ja";
		String s6=temp1+"va";//final类型的是常量,编译时可以确定,因此指向的是栈内存中的String对象
		System.out.println("字符串连接(包含final常量)::通过==比较字符串直接量的值" + (s6 == s3));
		System.out.println("字符串连接(包含final常量)::通过equals比较new对象与字符串直接量的值" + s6.equals(s3));
		System.out.println();
		System.out.println("通过identityHashCode确定字符串直接量的存在");
		System.out.println("s1的Hashcode"+System.identityHashCode(s1));
		System.out.println("s2的Hashcode"+System.identityHashCode(s2));
		System.out.println("s3的Hashcode"+System.identityHashCode(s3));
		System.out.println("s4的Hashcode"+System.identityHashCode(s4));
		System.out.println("s5的Hashcode"+System.identityHashCode(s5));
		System.out.println("s6的Hashcode"+System.identityHashCode(s6));
	}
 

 

 

分享到:
评论

相关推荐

    java string的一些细节剖析

    首先说明这里指的是Java中String的一些细节部分,需要的朋友可以参考

    史上最全Java面试题目大集合

    整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...

    Java基础笔记,代码结构

    适合一些卖课程或者有学习过Java的人选。里面是Java一开始需要掌握的一些代码知识和常识,一些基础知识的笔记,Java代码的基本运用和代码里需要掌握的一些细节。

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 ...Java集合详解8:Java集合类细节精讲 JavaWeb

    String中三种加法的区别

    通常成为一个优秀的JAVA程序员需要较长时间的经验积累,包括从程序的tuning中,或从其他有经验的程序员口中,才知道一定功能需要怎样实现,在程序中需要避免那些问题.但这往往是比较片面的,知其然而不知其所以然.

    Java中常用的API— String、Math和System

    Java中常用的API 1. API的概念与作用 API 中文名为应用程序编程接口;是指一些预定的函数。目的是提供应用程序与开发人员基于某软件或某硬件得以访问一组例程的能力,而又无需访问源码或理解工作的细节。 大白话就是...

    Java抽象类.pdf

    抽象类是Java中的一个重要的概念,它可以用来定义一个抽象的模板,由子类去实现具体的细节。同时,抽象类也可以提高程序的可扩展性和可维护性。 Java抽象类示例 Animal类是一个抽象类,它有一个私有的name属性和一个...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    张孝祥Java就业培训教程.pdf

    内容简介 本书主要是冲着实际应用而来的,共分11章。...10.6 关于Java的一些细节 10.7 验证Applet对象在客户端如何存在 第11章 网络编程 11.1 网络编程的基础知识 11.2 Java编写UDP网络程序 11.3 Java编写TCP网络程序

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    第5-20章深入描述了java技术的内部细节,包括垃圾收集、java安全模型、java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中等6章和附录a-c完全可以作为class文件和指令含集的参考手册。本书还附带...

    Java程序员面试宝典

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    java 面试题 总结

    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。 对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上...

    JAVA基础课程讲义

    字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 ...

    Java编程思想(完整版)

    但在Java中,设计者觉得这种杂合并不象在C++里那么重要。杂合语言允许采用多种编程风格;之所以说C++是一种杂合语言,是因为它支持与C语言的向后兼容能力。由于C++是C的一个超集,所以包含的许多特性都是后者不具备...

    java面试笔试题大汇总

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    java基础.txt

    java中的类只有单继承,接口具有多继承 继承具有单根性,一个类只能有一个父类 不能继承父类的有三种情况 · 用private修饰的属性和方法 · 构造方法 · 用protected修饰的属性和方法,父类和子类不在同一包下...

    Java面试题大全(doc)

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    java试题经典考试试题

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    java程序员面试技巧

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应 该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

Global site tag (gtag.js) - Google Analytics