Java千百问_06数据结构(022)_String在内存中如何存放

点击进入_更多_Java千百问

1、String在内存中如何存放

了解String是什么看这里:String是什么

String是一个特殊的包装类数据。

可以用两种的形式来创建:

String str = new String( "abc" );
String str = "abc" ;

了解java如何管理内存看这里:jvm是如何管理内存的

了解java堆和栈的区别看这里:java堆和栈有什么区别

第一种是用new()来新建对象的,它会在存放于堆中,每调用一次就会创建一个新的对象。

第二种是先在栈中创建一个对String类的对象引用变量str,然后查找堆内String池中有没有存放”abc”,如果没有,则将”abc”存放进String池,并令str指 向”abc”,如果已经有”abc” 则直接令str指向”abc”。

2、String的equals方法如何使用

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==(可以理解为比较逻辑地址,实际是比较对象号),下面用例子说明上面的理论。

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

可以看出str1和str2是指向同一个对象的。

String str1 = new String ( "abc" );
String str2 = new String ( "abc" );
System.out.println(str1==str2); // false
  • 对于第二种方式(String str1 =”abc”)创建多个”abc”字符串,在内存中其实只存在一个对象而已。这种方式节省内存空间,同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据String池中数据的实际情况来决定是否有必要创建新对象。
  • 而对于第一种方式,String str = new String(“abc”),则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

另一个要注意的地方:我们在使用诸如String str = “abc”;的格式定义类时,总是想当然地认为,创建了String类的对象str。这里担心陷阱:对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。

由于String类的immutable(不可变)性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer/StringBuilder类,以提高程序效率。

StringBuffer/StringBuilder的区别看这里:StringBuffer/StringBuilder有什么区别

时间: 2024-10-12 04:06:59

Java千百问_06数据结构(022)_String在内存中如何存放的相关文章

Java千百问_06数据结构(023)_基本数据类型在内存中如何存放

点击进入_更多_Java千百问 1.基本数据类型在内存中如何存放 了解基本数据类型看这里:java有哪8种基本数据类型 对于java中的8种基本数据类型,可以通过如下方式赋值给变量赋值. int a = 3; float b = 4.0f; a = a + 2; 8中基本数据是将具体值直接存放在栈中,在发生变更时,将具体值替换为新的值.具体如下: 了解java如何管理内存看这里:jvm是如何管理内存的 了解java堆和栈的区别看这里:java堆和栈有什么区别 对于基本数据类型,并没有基本数据池的

Java千百问_06数据结构(022)_StringBuffer/StringBuilder有什么区别

点击进入_更多_Java千百问 1.StringBuilder是什么 StringBuilder是非线程安全的可变字符串类. java.lang.StringBuilder这个可变的字符序列类是5.0新增的.继承于AbstractStringBuilder(大部分方法都在该类实现),并不是线程安全的,当多个线程同时修改一个对象时很可能会冲突. 了解String是什么看这里:String是什么 部分AbstractStringBuilder.StringBuilder源码: abstract cl

Java千百问_06数据结构(020)_String是什么

点击进入_更多_Java千百问 1.String是什么 java.lang.String类表示字符串常亮,所谓字符串,就是一组字符组成的字符集合.它有以下几个特点: String是不可变的对象 每次对String进行改变的时候,其实都等同于生成了一个新的String对象,然后将指针指向新的String对象(若不使用new构造,实际是从堆中的String池查找是否已经再存该字符串,若有则直接指向:若没有则先将该字符串放入String池,然后在指向). 所以经常改变内容的字符串最好不要用String

Java千百问_06数据结构(007)_String属于基本数据类型吗

点击进入_更多_Java千百问 1.String属于基本数据类型吗 首先要明确的是,在Java中,String不是基本数据类型,它继承于Object,是一个jdk提供的字符串类. 了解基本数据类型看这里:java有哪8种基本数据类型2 但是,String和其他对象相比,jdk做了很多特殊的处理.体现在如下几个方面: String可以通过new构造对象,也可以直接赋值.例如: String str = new String( "abc" );//第一种 String str = &quo

Java千百问_06数据结构(014)_java数组如何存储在内存中

点击进入_更多_Java千百问 1.数组的内存空间是何时分配的 java中的数组是用来存储同一种数据类型的数据结构,一旦初始化完成,即所占的空间就已固定下来,初始化的过程就是分配对应内存空间的过程.即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变. 了解什么是数组看这里:java中的数组是什么 当仅定义一个数组变量(int[] numbers)时,该变量还未指向任何有效的内存,因此不能指定数组的长度,只有对数组进行初始化(为数组元素分配内存空间)后才可以使用. 数组初始化分为静

Java千百问_06数据结构(013)_数组如何传递

点击进入_更多_Java千百问 1.数组如何传递 在java中,我们可以将数组作为参数传递给方法,方式同传递基本类型参数一致. 了解什么是数组看这里:java中的数组是什么 了解循环数组便利看这里:如何遍历数组 例子: public static void printArray(int[] array) { for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } } 可以通过传递数组

Java千百问_06数据结构(008)_null属于哪种数据类型

点击进入_更多_Java千百问 1.null属于哪种数据类型 首先,在java中,null本身不是对象,也不是Objcet的实例.那么他属于哪种数据类型呢? 了解数据类型看这里:java中数据类型是什么 java基本数据类型看这里:[java有哪8种基本数据类型3 具体看下面这个例子: if (null instanceof java.lang.Object) { System.out.println("null属于java.lang.Object类型"); } else { Syst

Java千百问_06数据结构(016)_引用类型数组在内存中如何储存

点击进入_更多_Java千百问 1.存放基本类型数组在内存中如何储存 java的数组中可以存放引用类型. 存放引用类型的内存分布相比存放基本类型相对复杂.来看一段存储基本类型的程序: 了解什么是数组看这里:java中的数组是什么 了解数组在内存中的储存看这里:java数组如何存储在内存中 public class TestPrimitiveArray { public static void main(String[] args) { //1.定义数组 int[] numbers; //2.分配

Java千百问_06数据结构(017)_什么是二维数组

点击进入_更多_Java千百问 1.二维数组如何定义 Java语言中,多维数组被看作数组的数组. 了解一维数组看这里:java中的数组是什么 定义方式和一维数组类似,如下: type arrayName[ ][ ]: type [ ][ ]arrayName; 2.二维数组如何初始化 二维数组初始化和一维数组一样,分为静态初始化和动态初始化 静态初始化 Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同.初始化方式如下: int intAr