包装类 -> String
Integer i = 100;
// 方式1
String s = i + "";
// 方式2
String s = i.toString();
// 方式3
String s = String.valueOf(i);
-----------------------
String -> 包装类
String s = "12345";
// 方式1
Integer i = Integer.parseInt(s);
// 方式2
Integer i = new Integer(s);
Integer i = 1; // -128到127返回的是数组里的值,对象是同一个。
只要有基本类型,比较的就是值的大小。
String细节
String实现了Serializable,可以串行化,意味着可以网络传输;
实现了Comparable,说明String对象可以比较;
字符串常量对象是用双引号括起的字符序列。
字符使用unicode编码,一个字符占两个字节
String类是final类,不能被继承。
String中有属性private final char value[];用于存放字符串内容,赋值之后不可以修改。不可以修改的是value的地址,但是单个字符内容可以变化。
两种创建String对象的区别
String s ="hsp";// 先从常量池查看是否有hsp的数据空间。若有,直接指向;没有,则重新创建,然后指向。s最终指向的是常量池的空间地址。String s =newString("hsp");// 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。若常量池中没有hsp,重新创建,若有,直接通过value指向。最终指向的是堆中的空间地址。
b.intern()//返回的是常量池的地址
String a = “hello” + “abc”;//编译器优化,创建了一个对象,相当于String a = “helloabc”😭字符串常量相加,看的是池)
String c = a + b;解读(变量相加,是在堆中)
String a ="hello";//创建a对象String b ="abc";// 创建b对象// 1. 先创建 StringBuilder sb = new StringBuilder();// 2. 执行 sb.append("hello")// 3. 执行 sb.append("abc")// 4. String c = sb.toString()// c 指向堆中的对象 value[] -> 常量池中的"helloabc"String c = a + b;