`

Java中两种String对象创建和初始化方式比较

    博客分类:
  • java
 
阅读更多

在Java中,初始化String分为两种:
1. String s1 = "11";
2. String s2 = new String("11")
区别:
方法1中,先在内存中查找有没有"11"这个字符串对象存在,如果存在就把s1指向这个字符串对象;
方法2中,不论内存中是否已经存在"11"这个字符串对象,都会新建一个对象。

 

前者会在栈中创建一个对象引用变量str,然后查看栈中是否存在“11”,如果没有,则将“11”存放进栈,并令引用变量str指向它;如果已经有“11”,则直接令str指向它;后者是java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象。这样充分利用了栈的数据共享优点,当然也可能是一个陷阱,对象很有可能没有创建,只不过指向一个先前已经创建的对象;而new()方法则能保证每次都创建一个新的对象。
      下述代码展示了二者的不同:



public   class  Main  {

    

    
public   static   void  main(String[] args)  {
        String strA 
=   " abc " ;
        String strB 
=   " abc " ;
        String strAA 
=   new  String( " abc " );
        String strBB 
=   new  String( " abc " );
        System.out.println(strA 
==  strB);
        System.out.println(strAA 
==  strBB);
    }

}
输出结果:
true
false

 

总结:
1.
String str1 = "string";
String str2 = "string";

if (str1==str2)  return true;

else if (str1.equals(str2)) return true;
else return false;
2.
String str3 = new String("string") ;
String str4 = new String("string") ;
if (str1==str2) return false;

else if (str1.equals(str2)) return true;

else return false;

 

 

 

 

 

ava堆与栈 java String分配内存空间(详解)

栈内存

堆内存

基础类型,对象引用( 堆内存地址

new 创建的对象和数组,

存取速度快

相对于栈内存较慢

数据大小声明周期必须确定

分配的内存由java 虚拟机自动垃圾回收器管理。动态分配内存大小

共享特性

栈中如果有字符串,则直接引用

如果没有,开辟新的空间存入值

new 一次在堆内存中生成一个新的对象。

创建之后值可以改变

String 类声明后则不可改变    

一、栈内存

基础类型 int, short, long, byte, float, double, boolean, char 和对象引用

 

栈的共享特性

String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true

1 、编译器先处理String str1 = "abc" ;它会在栈中创建一个变量为str1 的引用,然后查找栈中是否有abc 这个值,如果没找到,就将abc 存放进来,然后将str1 指向abc

2    接着处理String str2 = "abc"; 在创建完b 的引用变量后,因为在栈中已经有abc 这个值,便将str2 直接指向abc 。这样,就出现了str1str2 同时均指向abc 的情况。

二、堆内存

new newarrayanewarraymultianewarray 等指令建立

   要注意: 我们在使用诸如String str = "abc" ;的格式定义类时,总是想当然地认为,创建了String 类的对象str 。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new() 方法才能保证每次都创建一个新的对象。 由于String 类的immutable 性质,当String 变量需要经常变换其值时,应该考虑使用StringBuffer 类,以提高程序效率。

三、  ==   内存地址比对

String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true    str1
str2 同时指向 栈内存 中同一个内存空间

String str3 = "abc";
String str4 = new String("abc") ;

System.out.println(str3 == str4);    //flase str3 值在栈内存中,str4 值在堆内存中

 

String hello = "hello" ;

String hel = "hel" ;

String lo = "lo" ;

System.out.println(hello == "hel" + "lo") ; //true

// 两个常量相加,先检测栈内存中是否有hello 如有有,指向已有的栈中的hello 空间

System.out.println(hello == "hel" + lo) ;   //flase

System.out.println(hello == hel + lo) ;     //flase

 //lo 是在常量池中,不检查栈内存,在堆中产生一个新的hello

 

  四、  equals  值进行比对

 public boolean equals (Object anObject)

将此字符串与指定的对象比较。当且仅当该参数不为 null ,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true

 String str5 = "abc";
String str6 = new String("abc") ;

System.out.println(str5.equals(str6));    //true   str5 的值str6 的值比对

  五、  intern    栈中值的内存地址

 

Public String intern()

当调用 intern 方法时

1 、如果池已经包含一个等于此 String 对象的字符串(用equals(Object) 方法确定),则返回池中的字符串。

2 、将此 String 对象添加到池中,并返回此 String 对象的引用。

 

String s7 = new String("abc") ;

String s8 = "abc" ;

 

System.out.println(s7 == s7.intern()) ;//flase

System.out.println(s8 == s7.intern() );//true

 

1. 检查栈内存中有没有abc 对象如果有

2. s7 指向poolabc

分享到:
评论
1 楼 风驰电掣ljp 2011-10-12  
顶!

相关推荐

    Java中StringBuffer对象的初始化.pdf

    创建`StringBuffer`对象主要有两种方式: - **无参数构造器**:`StringBuffer s = new StringBuffer();` 这将创建一个空的`StringBuffer`对象,初始容量通常是16个字符。 - **带参数构造器**:`StringBuffer s = ...

    java String 使用详解

    String 对象的初始化是一种特殊的语法,Java 提供了简化的初始化方法,例如: String s = "abc"; 这与面向对象的标准语法不同,标准语法应该是: String s = new String("abc"); 但是,按照面向对象的标准语法,...

    String的两种初始化方法讲解

    String的初始化方法有两种,即使用字面量初始化和使用构造函数初始化。下面,我们将对这两种方法进行详细的介绍。 1. 使用字面量初始化 使用字面量初始化的方法是使用String str = "abc"的形式创建一个字符串对象...

    Java对象属性数据比较,返回变化数据

    `ObjectCompareUtil`工具类提供了一种通用的方式来比较两个对象的属性,而`PriceCheckDetail`类展示了如何在实际业务中利用这样的工具。理解这些概念和技巧对于Java开发者来说至关重要,尤其是在处理数据跟踪和比较...

    Java中初始化List的5种方法示例

    Java中初始化List有多种方法,本文将介绍五种常见的初始化方式。了解这些方法可以帮助开发者更好地使用Java中的List数据结构。 第一种方法:构造List后使用add方法初始化,这是最常规的做法,但使用起来不太方便。 ...

    Java对象的比较方式.doc

    Java提供了两种主要的方式来实现对象之间的比较,即`Comparable`接口和`Comparator`接口。这两种接口使得自定义对象可以根据特定的规则进行排序。 首先,`Comparable`接口是Java的`java.lang`包中的一个基础接口,...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    - 构造方法是一种特殊的方法,主要用于初始化新创建的对象。 - 构造方法的名字必须与类名相同,没有返回值类型(即使是void也不行)。 #### 2. 构造方法的使用 - 默认构造方法:如果没有显式定义任何构造方法,Java...

    Java 成员初始化要注意的两种不同的情况

    在Java编程语言中,成员初始化是创建对象时为类的实例变量赋予初始值的过程。本文将详细探讨Java成员初始化的两种不同情况,以及与之相关的基础知识。 首先,我们来看第一种情况:类内的变量初始化。当声明一个类的...

    大数据必学Java基础(二十五):数组的三种初始化方式

    本篇文章将详细讲解Java中数组的三种初始化方法:静态初始化、动态初始化和默认初始化。 一、静态初始化 静态初始化是指在声明数组的同时为其分配空间并赋予初始值。这种方式允许我们在定义数组时就明确给出每个...

    用new创建对象和直接定义的区别

    本文将深入探讨两种常见的对象创建方式:使用`new`关键字创建对象和直接定义对象。这两种方法虽然最终都能创建类的实例,但它们在内存分配、作用域和生命周期等方面存在显著差异。 ### 1. `new`关键字创建对象 `...

    java代码-JAVA中String数组初始化,一维数组和二维数组初始化

    本篇将详细讲解如何在Java中初始化String类型的一维数组和二维数组。 ### 一、一维String数组的初始化 1. **静态初始化**: 在Java中,可以使用花括号{}来静态初始化一维数组。这种方式允许你在声明数组的同时...

    Java中的静态块初始化块及main方法.doc

    Java编程语言中,静态块(static block)和初始化块(instance initialization block)是两种特殊的代码块,它们在程序运行的不同阶段被执行,对于类和对象的初始化有着重要作用。同时,`main`方法是Java程序的入口...

    在Java中创建线程有两种方法

    Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...

    JAVA 对word 内容的提取返回String

    我们将通过两种方式来实现这个目标,分别是使用 Java 流读取 Word 内容和使用 Jacob 读取 Word 内容。 使用 Java 流读取 Word 内容 在第一个示例中,我们使用 Java 流来读取 Word 文档的内容。我们首先需要引入...

    Java中的类和对象总结

    ### Java中的类和对象总结 #### 一、类与对象的概念 在面向对象编程中,类(Class)和对象(Object)是两个核心概念。类是对象的抽象模板,它定义了对象的数据结构(即属性)和行为(即方法)。而对象则是类的具体...

    Java对象和类 最详细说明

    以下是一些关于如何在Java中创建和使用对象及类的示例。 ##### 示例1:main方法和类 假设我们需要创建一个`Student`类,包含两个数据成员`id`和`name`。接下来我们创建一个`Student`类的对象,并打印出对象的值。 ...

    java数组初始化详解修正版.doc

    根据不同的初始化方式,Java 提供了三种主要的数组初始化方法:动态初始化、静态初始化以及隐式初始化。 #### 二、动态初始化 动态初始化是在创建数组时由系统自动为数组中的元素赋以默认值。默认值取决于元素的...

    Java基础之字符串及String

    这种方式会首先在堆中创建一个`String`对象,然后根据字符串字面量在常量池中可能创建第二个对象(如果常量池中不存在的话)。 字符串的本质是`char`数组,即`char[]`,例如: ```java String str = "laofu"; // ...

    JavaBean与JsonString的相互转换

    在Java开发中,JavaBean和JsonString是两种常见的数据表示形式。JavaBean是Java对象的一种规范,用于封装数据,而JsonString是一种轻量级的数据交换格式,常用于前后端交互。本篇将深入探讨JavaBean与JsonString之间...

Global site tag (gtag.js) - Google Analytics