@@ -254,16 +254,23 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
254
254
** 1 String 对象的两种创建方式:**
255
255
256
256
``` java
257
- String str1 = " abcd" ;
258
- String str2 = new String (" abcd" );
259
- System . out. println(str1== str2);// false
257
+ String str1 = " abcd" ;// 先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后str1指向字符串常量池中的对象,如果有,则直接将str1指向"abcd"";
258
+ String str2 = new String (" abcd" );// 堆中创建一个新的对象
259
+ String str3 = new String (" abcd" );// 堆中创建一个新的对象
260
+ System . out. println(str1== str2);// false
261
+ System . out. println(str2== str3);// false
260
262
```
261
263
262
- 这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。
263
- ![ ] ( https://user-gold-cdn.xitu.io/2018/8/22/16561e59a59c0873?w=698&h=355&f=png&s=10449 )
264
- 记住:只要使用new方法,便需要创建新的对象。
264
+ 这两种不同的创建方法是有差别的。
265
265
266
+ - 第一种方式是在常量池中拿对象;
267
+ - 第二种方式是直接在堆内存空间创建一个新的对象。
266
268
269
+ 记住一点:** 只要使用new方法,便需要创建新的对象。**
270
+
271
+ 再给大家一个图应该更容易理解,图片来源:< https://www.journaldev.com/797/what-is-java-string-pool > :
272
+
273
+ ![ String-Pool-Java] ( https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3String-Pool-Java1-450x249.png )
267
274
268
275
** 2 String 类型的常量池比较特殊。它的主要使用方法有两种:**
269
276
@@ -293,9 +300,9 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
293
300
![ ] ( https://user-gold-cdn.xitu.io/2018/8/22/16561e59a4d13f92?w=593&h=603&f=png&s=22265 )
294
301
295
302
尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
296
- ### String s1 = new String("abc");这句话创建了几个对象 ?
303
+ ### String s1 = new String("abc");这句话创建了几个字符串对象 ?
297
304
298
- ** 创建了两个对象 。**
305
+ ** 将创建1或2个字符串。如果池中已存在字符串文字“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串对象 。**
299
306
300
307
** 验证:**
301
308
@@ -313,10 +320,6 @@ false
313
320
true
314
321
```
315
322
316
- ** 解释:**
317
-
318
- 先有字符串"abc"放入常量池,然后 new 了一份字符串"abc"放入Java堆(字符串常量"abc"在编译期就已经确定放入常量池,而 Java 堆上的"abc"是在运行期初始化阶段才确定),然后 Java 栈的 str1 指向Java堆上的"abc"。
319
-
320
323
### 8种基本类型的包装类和常量池
321
324
322
325
- ** Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;这5种包装类默认创建了数值[ -128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。**
0 commit comments