String类的两种赋值方式
1.直接赋值
2.new对象赋值
注:1.9新增的,在new 对象创建 时可以传入byte[]数组来创建String对象。
byte [] bb = {23,56}
String ss = new String(bb);
*
*
String类比较是否相等的方法
- ①通过画图得知 == 比较是比较栈内存中的值
而基本数据类型 在栈内存中存储的就是本身的值 所以基本数据类型比较就用== * 引用数据类型在栈内存中存储的是地址值
所以==比较引用数据类型 就相当于比较两个对象的地址值 而只要是new出来的对象 地址值必然不相等 * 所以比较地址值无意义
- ②我们应该比较引用数据类型 堆内存中的真正内容
所以 字符串比较 堆内存中的具体值
需要调用equasl方法,这是因为String类重写了equals方法,用于比较string对象的具体值。
- intern()方法,返回字符串对象的常量字符串形式
String 两种赋值方式的区别:
- 如果是new对象赋值 那么直接开辟空间 毫不犹豫!!!
- 同为直接赋值(字面量)涉及到 共享设计模式 系统默认处理
- 第一个赋值的会开辟控件
- !!!!!!(重点)随后每一个直接赋值的 如果有跟这个值相等 则直接指向同一块
- 用==比较的是字符串的地址,equals比较的是字符串的值。
System.out.println(s1==s2);
//String字符串比较堆内存中的值
boolean
f=s1.equals(s2);
一道题彻底明白String的比较
String str1 = "1";
String str2 = "2";
String str3 = new String("1");
final String str4 = "2";
final String str5 = new String("2");
String str6 = "12";
String str7 = "1"+"2";
String str8 = str1+"2";
String str9 = str1+str2;
String str10 = str3+str4;
String str11= "1"+str4;
String str12= "1"+str5;
String str13= (str1+str2).intern();
System.out.println("1----"+(str1==str3));//f
System.out.println("1----"+(str2==str4));//t
System.out.println("1----"+(str4==str5));//f
System.out.println("1----"+(str6==str7));//t
System.out.println("1----"+(str6==str8));//f
System.out.println("1----"+(str6==str9));//f
System.out.println("1----"+(str6==str10));//f
System.out.println("1----"+(str6==str11));//t
System.out.println("1----"+(str6==str12));f
System.out.println("1----"+(str6==str13));//t
结果图:
字符串到底创建了几个对象!!!详解
例子一
(例1)String a=new String(“b”+”c”); b一个 c一个 b+c一个 a一个 总共四个
例子二
(例2)Java中New出的对象则始终被JVM存放在堆中,创建的字串常量则始终被JVM存放在数据段区常量池中。 所以,String str
= new String(“a”) + new String(“b”) 在堆中创建了三个字符串对象(a字符串对象,b字符串对象,ab字符串对象),在堆中的常量池中创建了2个字符串对象(a字符串对象,b字符串对象),一共创建了5个对象。