一文带你看StringBuffer和Stringbulider引发出的一系列问题

大家好,我是200,最近比较忙,所以更新会比较慢哦~

引言

金九银十,马上秋招了,给大家出一篇面试题吧,简单粗暴,上题~

面试题

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()

finally
 * 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().

完结

本文内容就这么多了,下期有时间会对本期内容进行补充哦~拜拜👋

StringStringBufferStringBuilder都是Java中常用的字符串类,它们之间的区别主要体现在以下几个方面: 1.可变性:String是不可变的字符串,每次对String进行操作都会生成一个新的String对象;而StringBufferStringBuilder是可变的字符串,可以对其进行增删改操作,而不会生成新的对象。 2.线程安全性:String是不可变的,因此是线程安全的;而StringBuffer是线程安全的,因为它的所有公共方法都是使用synchronized关键字进行同步的;而StringBuilder是非线程安全的,因为它的所有方法都没有进行同步操作。 3.性能:对于单线程环境下的字符串操作,StringBufferStringBuilder的性能都比String好,因为它们不需要创建新的对象;而对于多线程环境下的字符串操作,由于StringBuffer是线程安全的,因此可能会影响效率,而StringBuilder是非线程安全的,因此可以获得更好的性能。 4.使用场景:由于String是不可变的,因此适合在多线程环境下使用,而StringBuffer适合在单线程环境下进行字符串操作,并且需要保证线程安全性的情况下使用;而StringBuilder适合在单线程环境下进行字符串操作,并且不需要考虑线程安全性的情况下使用。 总之,如果需要对字符串进行增删改操作,可以使用StringBufferStringBuilder;如果需要保证线程安全性,可以使用StringBuffer;如果不需要考虑线程安全性,可以使用StringBuilder。如果只需要对字符串进行读取操作,可以使用String
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值