1.内部类
一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
内部类的作用:
1. 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
2. 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性。
内部类的使用场合:
由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性。所以,通常内部类在只为所在外部类提供服务的情况下优先使用。
2.String (string a = "t")会创建一个对象 然后再对象中的a去指向方法区中常量的a
public class Test {
public static void main(String[] args) {
char []c ={'a','b','c','d'};
String str = new String("abcd");
String str2 = new String("abcd");
System.out.println(str.equals(str2));//true
System.out.println(str2==str);//false
String str3 ="def";
String str4 ="def";
System.out.println(str3.equals(str4));//true
System.out.println(str3==str4);//true
}
}
字符内存分析图:
.可能会问的面试题
//总共1001个对象
String b = "abc";//(""首先这里会创建一个)
for (int i = 0; i < 1000; i++) {
b = b + i;
}
//总共1002个对象
String a = new String("abc");//这里会创建2个对象(""首先这里会创建一个; new()也会创建一个对象)
for (int i = 0; i < 1000; i++) {
a = a + i;
}
.StringBuilder与StringBuffer
一.StringBuilder可变字符串,线程不太安全,但效率高,推荐使用。
StringBuffer可变字符串,线程安全,但效率低,不推荐使用。
String是不可变字符串,根据实时情况使用,在循环当中不要使用,因为会产生好的没用的字符串。
二. String,StringBuilder要学会查看api的良好习惯,通过api学会使用常见的方法,自己利用案例来理解每个方法的具体含义。这样你会更深刻理解每个方法的使用。
三. 如果看不懂api可以到我们官网去看三百集的第56与57集,理解一下字符串的扩容原理。方便理解后面容器的内容。
面试题的回答
StringBuilder与StringBuffer的区别,StringBuilder与String的区别。
1)StringBuilder效率高,线程不安全,StringBuffer效率低,线程安全。
2)String是不可变字符串,StringBuilder是可变字符串。为什么有这样的差异,可以深入源码去解析,比如String类内的 priver final char value[] 等方法的原因。
3)如果是简单的声明一个字符串没有后续过多的操作,使用String,StringBuilder均可,若后续对字符穿做频繁的添加,删除操作,或者是在循环当中动态的改变字符穿的长度应该用StringBuilder。使用String会产生多余的字符串,占用内存空间。