`

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源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    [java]读书笔记整理:一切都是对象

    用堆进行存储分配比用堆栈进行存储分配需要更多的时间(如果确实可以在java中向在C++中一样在栈中创建对象)。 4) 静态存储 这里的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包4

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包3

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java的六大问题你都懂了吗

     本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。  1. 类的属性,或者叫值域  2. 方法里的局部变量  3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    AIC的Java课程1-6章

     理解运用继承和组合两种重用方式定义堆栈和队列,知道两种重用方式的适用场合。  理解使用递归方法构建二叉排序树,前序、中序、后序遍历二叉树。  学习ArrayList与LinkedList类,理解封装数组和...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    jsp内置对象的用法

    config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 ...

    JAVA面试题最全集

    掌握类和对象的概念,掌握面向对象编程的本质 49.静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其...

    超级有影响力霸气的Java面试题大全文档

     Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character ...

    JAVA基础课程讲义

    对象的序列化主要有两种用途 161 序列化涉及的类和接口 162 序列化/反序列化的步骤和实例 162 综合的序列化和反序列化练习 163 JAVA.IO包相关流对象用法总结(尚学堂1002班王鑫) 165 IO中其他常用类 165 File类 165 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics