StringBuffer和Stringbulider引发出的一系

2019-09-27  本文已影响0人  printf200

1.StringBulider和StringBuffer和String区别?

 StringBulider可变字符串 线程不安全 效率高
 StringBuffer可变字符串  线程安全  效率低
 String 不可变字符串 根据实际情况使用,在循环中不要使用,因为会产生很多没用字符串

2.String为什么不可变?

 String被final修饰过所以不可变.

3.final关键字的作用是什么?

 final修饰的变量,方法,类,在final修饰的变量必须要初始化,赋值后不能更改, 
 被final修饰的方法不能重写,被final修饰的类不能被继承
 final修饰的变量必须显示初始化,这个变量被初始化不可改变。

4.为什么说不可改变?

不可改变是指对基本类型来说值不可变,对于对象变量来说其引用不可变,就是不能在指向其他的对象
     如果final修饰的变量是对象类型,那么不可更改的指的是改变不可以再指向别的对象,但是对象的值可以改变
 *  final Operate operate = new Operate();
 *   operate.i=11;
 *   operate.i=12;
 *   System.out.println(operate.i);//输出12
 *   上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。

5.在java中有哪些使用final修饰

        例如:Math类中的double E double PI
     * 在接口中变量都是public static final修饰的

6.区别final与finally、finalize()

 * finnally是异常处理的一部分,只能用在try/catch里并附带一个语句块,表示这个语句最终一定
 * 会被执行(不管有没有抛出异常)
 * finnally不会执行的情况如下:
 *    public static int test(){
 *       int i = 1;
 *       //        if (i==1)
 *       // {
 *       //    return 0;
 *       // }
 *      System.out.println("111111111111");
 *      i = i/0;
 *      try {
 *          System.out.println("try");
 *          return i;
 *      }finally {
 *          System.out.println("finaly");
 *      }
 *   }
 *   public static void main(String[] args) {
 *       System.out.println("test"+test());
 *   }
 *  Exception in thread "main" java.lang.ArithmeticException: / by zero111111111111
    at Main.test(Main.java:53)
    at Main.main(Main.java:62)
 *   当我们去掉注释的三行语句,执行结果为:test0
 *  为什么在以上两种情况下都没有执行finally语句呢,说明什么问题?
 *  只有与finnal对应的语句块执行的情况下,finnlly语句快才会执行,以上两种情况在执行tru语句块之前
 *  已经返回或抛出异常,所以try对应的finally语句并没有执行
 *  但是在某种情况下,即使try语句执行了,finnally语句也不一定执行
 *  例如:
    public static int test(){
        int i = 1;
//        if (i==1)
//        {
//            return 0;
//        }
//        System.out.println("111111111111");
//        i = i/0;
        try {
            System.out.println("try");
            System.exit(0);
            return i;
        }finally {
            System.out.println("finaly");
        }
    }
    public static void main(String[] args) {
        System.out.println("test"+test());//输出结果:try
    }
finnally语句块还是没有执行?
因为在try语句块中执行了exit(0)语句终止Java虚拟机的运行,
在一般情况下不会调用exit(0)方法,
但是当一个线程在执行try语句块或者catch语句块时被打断或着被终止,与其相对应的finally可能不会执行。
finalize()
finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这个方法,这个方法在gc启动,该方法被回收的时候调用。
其实gc可以回收大部分的对象,凡是new出来的对象,gc都可以处理,一般情况下不会使用finalize()
特殊情况下,需要手动finalize,当对象被回收的时候释放一些资源,
比如:socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize();
使用finalize需要注意一个事,调用super.finalize();
一个对象的finalize()方法只能被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,
所以有可能调用finalize()后,该对象又不需要被回收了,
然后到了真正要被回收的时候,因为前面调用过一次,
所以不会调用finalize(),产生问题。
所以不推荐使用finalize().

7.为什么StringBulider线程不安全?为什么StringBuffer线程安全?

StringBuffer 是线程安全的用了synchronized 关键字因此是线程安全的。
上一篇 下一篇

猜你喜欢

热点阅读