1,实例化String对象
有两种方式,我们直接看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
com.java1234.chap03.sec08;
public
class
Demo1 {
public
static
void
main(String[] args) {
// 实例化String的方式一
String name1=
"张三"
;
System.out.println(
"name1="
+name1);
// 实例化String的方式二
String name2=
new
String(
"李四"
);
System.out.println(
"name2="
+name2);
}
}
|
运行输出:
name1=张三
name2=李四
2,“==”VS“equals方法”
“==” 比较的是引用(是否指向同一个内存块) “equals”比较的是具体内容
我们上下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package
com.java1234.chap03.sec08;
public
class
Demo2 {
public
static
void
main(String[] args) {
String name1=
"张三"
;
// 直接赋值方式
String name2=
new
String(
"张三"
);
// new方式
String name3=name2;
// 传递引用
// ==比较的是引用
System.out.println(
"name1==name2:"
+(name1==name2));
System.out.println(
"name1==name3:"
+(name1==name3));
System.out.println(
"name2==name3:"
+(name2==name3));
// equals比较的是具体内容
System.out.println(
"name1.equals(name2):"
+(name1.equals(name2)));
System.out.println(
"name1.equals(name3:"
+(name1.equals(name3)));
System.out.println(
"name2.equals(name3):"
+(name2.equals(name3)));
}
}
|
运行输出:
name1==name2:false
name1==name3:false
name2==name3:true
name1.equals(name2):true
name1.equals(name3:true
name2.equals(name3):true
我们给下内存示意图:
3,String两种实例化方式的区别
直接赋值方式,创建的对象存放到字符串对象池里,假如存在的,就不会再创建;
new对象方式,每次都创建一个新的对象;
我们上一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package
com.java1234.chap03.sec08;
public
class
Demo3 {
public
static
void
main(String[] args) {
String name1=
"张三"
;
String name2=
"张三"
;
String name3=
new
String(
"张三"
);
String name4=
new
String(
"张三"
);
System.out.println(
"name1==name2:"
+(name1==name2));
System.out.println(
"name1==name3:"
+(name1==name3));
System.out.println(
"name3==name4:"
+(name3==name4));
}
}
|
运行输出:
name1==name2:true
name1==name3:false
name3==name4:false
我们给下内存示意图:
4,字符串的内容不可变性
字符串的特性:不能改变字符串的内容;
要想改变,只能通过指向一个新的内存地址;
我们给下代码:
1
2
3
4
5
6
7
8
9
10
|
package
com.java1234.chap03.sec08;
public
class
Demo4 {
public
static
void
main(String[] args) {
String name=
"张"
;
name+=
"三"
;
System.out.println(name);
}
}
|
这里我们修改了name,本质的话name指向了一个新的内存区域,我们给下内存示意图: