Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配的图文介绍
Java中的String类是一个很常用,但最不注意其细节的类,因此大多数面试会那这个类做文章。比如String str = new String("hello");开辟了几个内存空间,String和StringBuffer的区别等等。下面就做一个我的理解:
String是一个被final修饰的类,它是不能被继承的。StringBuffer也是被final修饰的类。
一、JVM内存划分
在java中主要存在4块内存,这些内存空间分别为:栈内存空间、堆内存空间、全局数据区、全局代码区
1、栈内存空间:保存所有的对象名称(保所了所引用的堆内存空间的地址)
2、堆内存空间:保存每一个对象的具体内容
3、全局数据区:保存static类型的数据属性(全局数据)
4、全局代码区:保存所有的方法定义
在JVM中,堆内存是内存空间存放的是对象实例化的内容(程序的数据),栈内存存放的是对象的名称,其内容是指向对应堆的地址。
也可以这么说:所有的对象名称保存在栈内存中,对象具体的内容则保持在堆内存中,引用类型数据必须使用new关键字来在堆内存中开辟空间。
二 、Sring的内存分配
String有一个特殊之处:构造String对象时可以使用new构造也可以使用"hello"直接构造。中两种方法推荐使用第二种。
1、String a = "hello";
2、 String a= new String("hello");
解释如下:
1:在栈内存中定义了一个a对象引用,指向堆内存的值“hello”内存地址。最终开辟了一个内存空间
2:在栈内存重定义了一个a对象引用,先指向堆内存值为“hello”内存地址,然后又指向new之后堆内存为“hello”的地址。最终开辟了两个空间,第一个空间没有对象引用,会被JVM垃圾回收。
图示如下:
理解上面的就不难理解下面这些代码:
package andy.string.test; /** * @author Zhang,Tianyou * version:2014-11-25 下午4:15:14 * * */ public class TestString { public static void main(String[] args){ String a = "hello"; String b = "hello"; String c = new String("hello"); String d = new String(); d = "hello"; String e = c; System.out.println("a==b ? " + (a== b)); System.out.println("a==c ? " + (c== b)); System.out.println("a==d ? " + (a== d)); System.out.println("a==e ? " + (a== e)); System.out.println("c==d ? " + (c== d)); System.out.println("c==e ? " + (c== e)); } }
其中只有a==b==d 、 c=e。
解释:
1、String每new一次堆内存都不想等,而d在new分配完新地址之后,又放弃new之后的地址,指向a对应的内存地址,所以他们是相同的。
2、“hello”赋值这种直接赋值方式指向的堆内存空间是一样的。String在Java中使用了共享设计,在Java形成一个对象池,这个对象池可以保存多个对象,如果新实例化的对象已经在对象池中存在,就不在重复定义,直接从对象池中取出使用。所 以
对于已存在的内容时,会将对象指向已经实例的空间地址。
3、e直接指向C的内存空间。
4、所以在使用String时,建议使用直接赋值方式,减小内存空间,提高性能。
三、String、StringBuffer和StringBuilder的区别
1、 String、StringBuffer、StringBuilder都是被final修饰的,是不能够被继承改写的。
2、 String在实例化之后,其内存空间的内容大小是不能够被修改的;而StringBuffer是一个线程安全的可变字符序列,在实例化之后可以动态的修改堆内存中的内容,所以内存长度和大小是可变的;StringBuilder实例化之后内存大小长度也是可变的,不
同之处在于StringBuilder不是线程同步,因此操作起来必然比StringBuffer更加高效。
这是会有人想:
String str = "hello";
str += "andy";
str的值不是也改变了吗?
其实上述代码在内存中已经开辟了3个空间,分别是:”hello“, ”andy“, ”helloandy“,他们的堆内存大小是固定的,最终str指向了”helloandy“的堆地址。如下图所示:
而StringBuffer使用时,只会开辟一块内存空间,可以使用append添加delete等操作内容。
String 每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer/StringBuilder 类则结果就不一样了,每次结果都会对 StringBuffer/StringBuilder 对象本身进行操作,而不是生成 新的对象,再改变对象引用。
因而在对一个字符串循环赋值时,最好使用StringBuffer(线程安全)或StringBuilder,这样可以节约内存,提高性能,切记。
以上就是Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配的图文介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Tukar jenis data asas kepada rentetan menggunakan fungsi String.valueOf() Java Dalam pembangunan Java, apabila kita perlu menukar jenis data asas kepada rentetan, kaedah biasa ialah menggunakan fungsi valueOf() kelas String. Fungsi ini boleh menerima parameter jenis data asas dan mengembalikan perwakilan rentetan yang sepadan. Dalam artikel ini, kami akan meneroka cara menggunakan fungsi String.valueOf() untuk penukaran jenis data asas dan menyediakan beberapa contoh kod untuk

Kaedah menukar tatasusunan char kepada rentetan: Ia boleh dicapai dengan penugasan Gunakan sintaks {char a[]=" abc d\0efg ";string s=a;} untuk membenarkan tatasusunan char terus memberikan nilai kepada rentetan, dan laksanakan. kod untuk melengkapkan penukaran.

Kaedah untuk mengosongkan stringbuilder ialah: 1. Gunakan kaedah setLength(0) untuk mengosongkan objek StringBuilder 2. Gunakan kaedah delete(0, length) untuk mengosongkan objek StringBuilder 3. Gunakan replace(0, length, "; ") kaedah untuk mengosongkan objek StringBuilder; 4. , Gunakan StringBuilder() baharu untuk mencipta semula objek StringBuilder baharu.

Gunakan kaedah delete() kelas StringBuilder dalam Java untuk memadam sebahagian daripada kandungan dalam rentetan Kelas String ialah kelas pemprosesan rentetan yang biasa digunakan di Java. Ia mempunyai banyak kaedah yang biasa digunakan untuk operasi rentetan. Walau bagaimanapun, dalam beberapa kes, kita perlu kerap mengubah suai rentetan, dan ketidakbolehubah kelas String akan membawa kepada penciptaan objek rentetan baharu yang kerap, sekali gus menjejaskan prestasi. Untuk menyelesaikan masalah ini, Java menyediakan kelas StringBuilder, yang

Kaedah append() kelas StringBuilder menerima nilai String dan menambahkannya pada objek semasa. Tukar nilai rentetan kepada objek StringBuilder - Dapatkan nilai rentetan. Tambah menggunakan kaedah append() untuk mendapatkan rentetan ke StringBuilder. Contoh Dalam program Java berikut, kami menukar tatasusunan rentetan menjadi objek StringBuilder tunggal. Demonstrasi masa nyata publicclassStringToStringBuilder{ publicstaticvoidmain(Stringargs[]){&a

Gantikan aksara (rentetan) dalam rentetan menggunakan fungsi String.replace() Java Dalam Java, rentetan ialah objek tidak boleh ubah, yang bermaksud apabila objek rentetan dicipta, nilainya tidak boleh diubah suai. Walau bagaimanapun, anda mungkin menghadapi situasi di mana anda perlu menggantikan aksara atau rentetan tertentu dalam rentetan. Pada masa ini, kita boleh menggunakan kaedah replace() dalam kelas String Java untuk melaksanakan penggantian rentetan. Kaedah replace() kelas String mempunyai dua jenis:

Tafsiran dokumentasi Java: Pengenalan terperinci kepada kaedah substring() kelas StringBuilder Pengenalan: Dalam pengaturcaraan Java, pemprosesan rentetan adalah salah satu operasi yang paling biasa. Java menyediakan satu siri kelas dan kaedah untuk pemprosesan rentetan, antaranya kelas StringBuilder ialah pilihan yang biasa digunakan untuk operasi rentetan yang kerap. Dalam kelas StringBuilder, kaedah substring() ialah kaedah yang sangat berguna untuk memintas substring rentetan. Artikel ini akan

Salam semua, hari ini saya akan berkongsi dengan anda pengetahuan asas Java: String. Tidak perlu diperkatakan kepentingan kelas String, ia boleh dikatakan sebagai kelas yang paling banyak digunakan dalam pembangunan back-end kami, jadi adalah perlu untuk membincangkannya.
