String.length方法的实现,底层部分还是用的char封装成的数组..
String类型的创建:
1). 直接赋值: String s = "1";
2). 通过构造器创建: String s = new String("s");
String的空值
1).表示引用为空: String str = "null"; 没有初始化,没有分配内存空间. 会出现空指针的错误.
2).内容为空字符串: String str = ""; 已经进行了初始化操作,分配了内存空间,但是没有内容.
判断字符串非空:
1).引用不能为空(不能为null)
2).字符内容不能为空字符串.
字符串的比较操作:
1). 使用等号. (只能比较引用的内存地址,相同ture)
2). 使用equals方法, equals的父类是Object是所有类的父类. (在Object中,和等号相同,建议子类覆盖equals方法去比较自己想比较的内容.)
String类覆盖equals方法,比较的是字符内容. 先比较内存地址值是否相同,相同为ture,不同比较类型是否都为String.换成相同的类型再将字符串一个一个进行比较.
内存分析图. 他们俩的地址值不一样, str1永远不==str2. 但是他们是equals的.
String str1 = "ABC"
1). 最多创建一个String对象,最少不创建String对象.
如果常量池已经存在了"ABC" 那么不创建直接引用. 常量池起到缓存的作用,就像Integer缓存-128-127的数一样.
String str2 = new String("ABC")
1).最多创建两个String对象,至少创建一个String对象.
new关键字.绝对会在堆空间,创建内存区域,所以至少创建一个String对象.如果常量池没有存在,还需要创建一个饮用,所以最多两个.
编译时期只是检查语法,运行时期才会调用方法.调用变量.
所以编译器不会对最后的结果进行优化处理. 编译器优化会在编译时期将常量优化成一个常量