内部类的使用场合:
- 由于内部类提供了更好的封装特性,并且可以很方便的访问外部类的属性 。所以,在 只为外部类提供服务 的情况下可以优先考虑使用内部类 。
- 使用内部类间接实现多继承:每个内部类都能独立地继承一个类或者实现某些接口,所以无论外部类是否已经继承了某个类或者实现了某些接口,对于内部类没有任何影响 。
字符串常量拼接时的优化在遇到 字符串常量 之间的拼接时,编译器会做出优化,即在 编译期间 就会完成字符串的拼接 。
String s1 = "hello" + " world";String s2 = "hello world";System.out.println(s1 == s2);// trueString s3 = "hello";String s4 = " world";//编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化String s5 = s3 + s4;System.out.println(s2 == s5);//false
String Pool字符串常量池( String Pool )保存着所有 字符串字面量 ,这些字面量在 编译时期 就确定 。使用String的 intern() 方法在 运行过程 中将字符串添加到常量池中 。当一个字符串调用 intern() 方法时,若 String Pool 中已存在字符串和该字符串值相等(通过 equals() 方法判断),则返回String Pool 中字符串的引用;否则,就在S P 中添加一个新字符串并返回其引用 。
String s1 = new String("aaa");String s2 = new String("aaa");sout(s1 == s2); // falseString s3 = s1.intern();String s4 = s2.intern();sout(s3 == s4);// true
若以字面量形式创建字符串,会自动将字符串放入String Pool 。String s5 = "bbb";String s6 = "bbb";sout(s5 == s6);// true
OutOfMemoryError
StringBuffer、StringBuilderStringBuffer和StringBuilder 非常类似,均代表 可变的字符序列 (无final修饰的 char value[] ) 。这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样 。区别:
- StringBuffer JDK1.0版本提供的类, 线程安全,做线程同步检查( synchronized ) ,效率较低 。
- StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高 。建议采用该类 。
- 自动装箱:基本类型的数据处于需要对象的环境中时, 会自动转为“对象” 。
- Integer i = 100; // 相当于 Integer i = Integer.valueOf(100);
- 自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用 intValue()、doubleValue() 等转型方法
- Integer i = 100; int j = i; // 自动拆箱 // 相当于 int j = i.intValue();
缓存原理:
- 若数据在 -128~127 区间,则在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象放在 cache 数组中
- 每当自动装箱过程发生时 (或者手动调用 valueOf() 时),就会 先判断数据是否在该区间 ,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象 。
- 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE 。
- 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常 。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止 。
文章插图