SE重点复习
1 代码块的执行顺序:1 静态代码块:static修饰的代码块(并且只会在类加载时执行一次)作用:用来对类进行初始化,一般用来加载驱动(如果是继承的话,会先执行父类和子类的静态代码块,然后执行其它代码块) 2 构造代码块(也叫实例代码块) 3 构造方法代码块(也叫局部代码块):定义在方法体内的代码块,最后执行的.
2 异常的捕获会按照异常的类型进行捕获,如果没有匹配到当前类型,就会去捕获该异常的父类,finally代码块中的内容一定会执行到. 异常会沿着方法的调用栈一直传递. e.getCause() 该异常是由什么触发的.
3 通过重写hashCode可以来查找索引.
4 基本数据类型比较的都是字面量.而当Integer(引用类型)和int比较时,都会自动进行拆箱.所以不管大小,只要两者值相等,变量就相等. Integer和Integer比较时,如果都是常量赋值,在-128-127范围内时会使用缓存,是常量池的比较.如果在范围外就会new对象进行比较,这时就肯定不相等了.
5 String类(引用类型)的比较, 注意字符串常量池,String s1 = "hello"; String s2 = new String("hello");
hello 存在字符串常量池,而s2是在堆上new了一个对象,存在堆中,s1= =s2.String s1 = "hello"; String s2 = new String("hello").intern();
intern() 是对象入池操作.此时s2的hello入字符串常量池,所以s1和s2就指向同一个对象.s1==s2. String s1 = "hello"; String s2 = "hel"; String s3 = "lo"; String s4 = s2 + s3;
s4的底层实现 new StringBuilder().append().toString(). 其中toString就是new一个新的String,所以 s1!=s4.String s = new StringBuilder("计算机").append("软件").toString(); Assert.assertTrue(s.intern() == "计算机软件"); Assert.assertTrue(s.intern() == s);
一开始常量池中的是"计算机" “软件”,所以"s 计算机软件"入池时会创建一个变量指向new出来的对象,此时s.intern()==s.String s = new StringBuilder("计算机软件").toString(); Assert.assertTrue(s.intern() == "计算机软件"); Assert.assertTrue(s.intern() == s);
此时的话池里面已经有"计算机软件",所以s.intern()时直接返回常量池的引用,就和new出来在堆上的对象没有关系了, 前者为true,后者为false.String s = new StringBuilder("ja").append("va").toString(); Assert.assertTrue(s.intern() == s);
JVM在初始化时,会默认加载一些资源,这些资源包括一些字符串,如"java",此时的话就为false.String s = new StringBuilder("计算机").append("软件").toString(); Assert.assertTrue(s.intern() == s);
这里就为true.
6 String类的比较关键看有没有new一个新的对象, 以及这个对象有没有入池intern(),以及入池之前池中有没有已经加载好了的目标字符串.这些都应该分情况看.
7 JMM(Java的内存模型)(重点).每次调用一个方法都会产生一个新的栈帧,每一个方法从调用直至执行完成(就会销毁)的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程.(结合JMM内存模型那个图片来看)
8 java对象与引用.