在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
。这样,就出现了str1
与str2
同时均指向abc
的情况。
二、堆内存
new
、newarray
、anewarray
和multianewarray
等指令建立
要注意:
我们在使用诸如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
指向pool
中abc
相关推荐
创建`StringBuffer`对象主要有两种方式: - **无参数构造器**:`StringBuffer s = new StringBuffer();` 这将创建一个空的`StringBuffer`对象,初始容量通常是16个字符。 - **带参数构造器**:`StringBuffer s = ...
String 对象的初始化是一种特殊的语法,Java 提供了简化的初始化方法,例如: String s = "abc"; 这与面向对象的标准语法不同,标准语法应该是: String s = new String("abc"); 但是,按照面向对象的标准语法,...
String的初始化方法有两种,即使用字面量初始化和使用构造函数初始化。下面,我们将对这两种方法进行详细的介绍。 1. 使用字面量初始化 使用字面量初始化的方法是使用String str = "abc"的形式创建一个字符串对象...
`ObjectCompareUtil`工具类提供了一种通用的方式来比较两个对象的属性,而`PriceCheckDetail`类展示了如何在实际业务中利用这样的工具。理解这些概念和技巧对于Java开发者来说至关重要,尤其是在处理数据跟踪和比较...
Java中初始化List有多种方法,本文将介绍五种常见的初始化方式。了解这些方法可以帮助开发者更好地使用Java中的List数据结构。 第一种方法:构造List后使用add方法初始化,这是最常规的做法,但使用起来不太方便。 ...
Java提供了两种主要的方式来实现对象之间的比较,即`Comparable`接口和`Comparator`接口。这两种接口使得自定义对象可以根据特定的规则进行排序。 首先,`Comparable`接口是Java的`java.lang`包中的一个基础接口,...
- 构造方法是一种特殊的方法,主要用于初始化新创建的对象。 - 构造方法的名字必须与类名相同,没有返回值类型(即使是void也不行)。 #### 2. 构造方法的使用 - 默认构造方法:如果没有显式定义任何构造方法,Java...
在Java编程语言中,成员初始化是创建对象时为类的实例变量赋予初始值的过程。本文将详细探讨Java成员初始化的两种不同情况,以及与之相关的基础知识。 首先,我们来看第一种情况:类内的变量初始化。当声明一个类的...
本篇文章将详细讲解Java中数组的三种初始化方法:静态初始化、动态初始化和默认初始化。 一、静态初始化 静态初始化是指在声明数组的同时为其分配空间并赋予初始值。这种方式允许我们在定义数组时就明确给出每个...
本文将深入探讨两种常见的对象创建方式:使用`new`关键字创建对象和直接定义对象。这两种方法虽然最终都能创建类的实例,但它们在内存分配、作用域和生命周期等方面存在显著差异。 ### 1. `new`关键字创建对象 `...
本篇将详细讲解如何在Java中初始化String类型的一维数组和二维数组。 ### 一、一维String数组的初始化 1. **静态初始化**: 在Java中,可以使用花括号{}来静态初始化一维数组。这种方式允许你在声明数组的同时...
Java编程语言中,静态块(static block)和初始化块(instance initialization block)是两种特殊的代码块,它们在程序运行的不同阶段被执行,对于类和对象的初始化有着重要作用。同时,`main`方法是Java程序的入口...
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
我们将通过两种方式来实现这个目标,分别是使用 Java 流读取 Word 内容和使用 Jacob 读取 Word 内容。 使用 Java 流读取 Word 内容 在第一个示例中,我们使用 Java 流来读取 Word 文档的内容。我们首先需要引入...
### Java中的类和对象总结 #### 一、类与对象的概念 在面向对象编程中,类(Class)和对象(Object)是两个核心概念。类是对象的抽象模板,它定义了对象的数据结构(即属性)和行为(即方法)。而对象则是类的具体...
以下是一些关于如何在Java中创建和使用对象及类的示例。 ##### 示例1:main方法和类 假设我们需要创建一个`Student`类,包含两个数据成员`id`和`name`。接下来我们创建一个`Student`类的对象,并打印出对象的值。 ...
根据不同的初始化方式,Java 提供了三种主要的数组初始化方法:动态初始化、静态初始化以及隐式初始化。 #### 二、动态初始化 动态初始化是在创建数组时由系统自动为数组中的元素赋以默认值。默认值取决于元素的...
这种方式会首先在堆中创建一个`String`对象,然后根据字符串字面量在常量池中可能创建第二个对象(如果常量池中不存在的话)。 字符串的本质是`char`数组,即`char[]`,例如: ```java String str = "laofu"; // ...
在Java开发中,JavaBean和JsonString是两种常见的数据表示形式。JavaBean是Java对象的一种规范,用于封装数据,而JsonString是一种轻量级的数据交换格式,常用于前后端交互。本篇将深入探讨JavaBean与JsonString之间...