能做视频的软件有哪些,宁波网站建设seo,四川省建设厅官方网站电话,襄阳seo推广关于String类的知识经常出现在面试题中#xff0c;在此先记录自己的理解。
首先明白一个事#xff0c;java存在一个常量池#xff0c;可以用来存储字符串常量。
1 创建的字符串变量在内存中的区别
两者看似都是创建了一个字符串对象#xff0c;但在内存中确是各有各的想…关于String类的知识经常出现在面试题中在此先记录自己的理解。
首先明白一个事java存在一个常量池可以用来存储字符串常量。
1 创建的字符串变量在内存中的区别
两者看似都是创建了一个字符串对象但在内存中确是各有各的想法。
String str1 “abc” 在编译期JVM会去常量池来查找是否存在“abc”如果不存在就在常量池中开辟一个空间来存储“abc”如果存在就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间来存储“abc”在常量池中的地址值。
String str2 new String(“abc”) ;在编译阶段JVM先去常量池中查找是否存在“abc”如果过不存在则在常量池中开辟一个空间存储“abc”。在运行时期通过String类的构造器在堆内存中new了一个空间然后将String池中的“abc”复制一份存放到该堆空间中在栈中开辟名字为str2的空间存放堆中new出来的这个String对象的地址值。
也就是说前者在初始化的时候可能创建了一个对象也可能一个对象也没有创建后者因为new关键字至少在内存中创建了一个对象也有可能是两个对象。
2 String类的特性
String类 是final修饰的不可以被继承。
String类的底层是基于char数组的。
3 两个方面
1性能效率
String类被设计成不可变immutable类所以它的所有对象都是不可变对象。例如
String str “hello;
str str world“
所以当上文str指向了一个String对象内容为“hello”然后对str进行“”操作str原来指向的对象并没有变而是str又指向了另外一个对象“hello world”原来的对象还在内存中。
由此也可以看出频繁的对String对象进行修改会造成很大的内存开销。此时应该用StringBuffer或StringBuilder来代替String。
而new String更加不适合因为每一次创建对象都会调用构造器在堆中产生新的对象性能低下且内存更加浪费。
2安全性
对象都是只读的所以多线程并发访问也不会有任何问题。
由于不可变用来存储数据也是极为安全的。
更多关于String类的讨论其实有很多大神已经有了很全面的总结了在网上能找到很多对String类的研究其中我找到了一篇写的很详细的文章相信以后我能完全理解上面所写的。大家有需要的也可以来看看。
Java的string类常量池及不可变性