各自努力,最高处见!加油!
一、String类的理解和创建对象
- String对象用于保存字符串。
- 字符串常量对象是用双引号阔气的字符序列。例如“你好”、“12.97”、“boy”
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母或汉字)占两个字节。
- String类常用的构造器:
String s1=new String();
String s2=new String(String original);
String s3=new String(char[] a);
String s4=new String(char[] a,int startIndex,int count);
- String 类实现了接口Serializable :表面String可以串行化(可以在网络传输)
- String 类实现了接口Comparable :String对象可以比较大小
- String 是final类,不能被其他类继承
- String 有属性private final char value[ ];用于存放字符串内容
- String的底层还是一个字符数组。一定要注意value是一个final类型,不可以修改地址 (value不能指向新的地址),但是数组中的内容可以修改。
二、两种创建String对象的区别
方式一:直接赋值:String s="hsp";
先从常量池查看是否有“hsp”数据空间,如果有,直接指向;如果没有则直接创建,然后指向。s最终指向的是常量池的空间地址。
方式二:调用构造器String s2=new String("hsp");
先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有“hsp”,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
练习题一
String a="hsp";
String b=new String("hsp");
System.out.println(a.equals(b));
System.out.println(a==b);
System.out.println(a==b.intern());
System.out.println(b==b.intern());
知识点: 当调用intern()方法时,如果池已经包含了一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回String对象的引用。 人话:池中有这个变量就返回它的地址(对象),没有就新建一个。
练习题二
Person p1=new Person();
p1.name="hspedu";
Person p2=new Person();
p2.name="hspedu";
System.out.println(p1.name.equals(p2.name));
System.out.println(p1.name==p2.name);
System.out.println(p1.name=="hspedu");
String s1=new String("bcde");
String s2=new String("bcde");
System.out.println(s1==s2);
面试题
题一:
String a="hello"+"abc";
解读:编译器优化==>String a=“helloabc”;
题二:
String a="hello";
String b="abc";
String c=a+b;
解读: 第一步:StringBuilder sb=new StringBuilder(); 第二步:sb.append(a); 第三步:sb.append(b);
题三:
String s1="hspedu";
String s2="java";
String s5="hspedujava";
String s6=(s1+s2).intern();
System.out.println(s5==s6);
System.out.println(s5.equals(s6));
题四: 【易错题】
public class Test1 {
String str=new String("hsp");
final char[] ch={'j','a','v','a'};
public void change(String str,char ch[]){
str="java";
ch[0]='h';
}
public static void main(String[] args){
Test1 ex=new Test1();
ex.change(ex.str,ex.ch);
System.out.println(ex.str+"and");
System.out.println(ex.ch);
}
}
内存图解:
|