知识点第五次整理

目录

内容31、String s = new String("xyz");创建了几个StringObject?是否可以继承String类?32、String和StringBuffer的区别33、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";34、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?35、final, finally, finalize的区别。

内容

31、String s = new String("xyz");创建了几个StringObject?是否可以继承String类?

两个。第一个对象是字符串常量"xyz" 第二个对象是new String()的时候产生的,在堆中分配内存给这个对象,只不过这个对象的内容是指向字符串常量"xyz" 另外还有一个引用s,指向第二个对象。这是一个变量,在栈中分配内存。

变形①:String s = "xyz"创建了几个String对象?
首先看常量池里有没有"xyz",如果有直接引用,如果没有则创建再引用,这里"xyz"本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s持有。ok,这条语句就创建了2个String对象。

变形②:String str = “aaa” + new String(“bbb”)创建了几个String对象?
四个, "aa"一个对象 new Sring()一个对象 "bbb"一个对象 “aa” + new String(“bbb”);一个对象

32、String和StringBuffer的区别

String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

33、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

javac 编译可以对
字符串常量直接相加的表达式进行优化, 不必要等到运行期去进行加法运算处理, 而是在编
译时去掉其中的加号, 直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后, 相当于直接定义了一个”abcd”的字符串,
所以, 上面的代码应该只创建了一个 String 对象。

34、try {}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

会在return中间执行!
try 中的 return 语句调用的函数先于 finally 中调用的函数执行,也就是说 return 语句先执行,finally 语句后执行,但 return 并不是让函数马上返回,而是 return 语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行 finally 语句后才真正开始返回!但此时会出现两种情况:

①、如果finally中也有return,则会直接返回并终止程序,函数栈中的return不会被完成!;

②、如果finally中没有return,则在执行完finally中的代码之后,会将函数栈中的try中的return的内容返回并终止程序;

public static String tryTest(){
        try {
            System.err.println("try");
            return "try return ";
        }catch (Exception e){
            System.err.println("catch");
            e.printStackTrace();
        }finally {
           System.err.println("finally");
           return "finally";
        }
        //return "return";
    }

    public static void main(String[] args{
        //try
        //finally
        //try return
        // 将finally中的return去掉,打印结果如上
       System.err.print(tryTest());
        // try
        //finally
        //finally
        // 将finally中的return去掉,打印结果如上
    }

35、final, finally, finalize的区别。

  • final可以用于修饰变量,方法,类,被修饰的变量的值不能被改变,被修饰的方法不能被重写,被修饰的类不能被继承,它和abstract是反义词
  • finally通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常运行还是发生异常,这里的代码只要JVM不关闭都会执行,可以将释放外部资源的代码写在finally块中
  • finalize:Object类的方法,Java中允许使用finalize()方法在垃圾回收器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾回收器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作
posted @ 2019-11-25 20:46  孤竹夜雨  阅读(126)  评论(0)    收藏  举报