9.3 每日一面

字节跳动国际化电商测试开发工程师面试

1.final关键字

1.final关键字的意思是最终的,不可修改的.
2.用于修饰类、方法和变量
3.final修饰的类不能被继承,它内部的所有成员方法都会被隐式指定为final方法。用private修饰的方法在任何类中都被隐式指定为final
4.用final修饰的方法不能被重写
5.当final修饰的变量称为常量。当是基本类型的变量被修饰的时候,其数值一旦被初始化以后就不能被更改。当是引用类型的变量,则在对其初始化后不能让其指向另一个对象。
6.使用目的,一是为了把方法锁定,防止继承类修改其含义,二是早期Java实现种,会将final转为内嵌调用,但若是方法过于庞大其实也没有什么性能提升(现在已经不需要使用final进行这些优化了)

2.Java如何实现多态

1.多态,顾名思义,它表示一个对象具有多种状态,他的具体表现为父类的引用指向子类实例,即对象类型需要和引用类型间具有继承(类)/实现(接口)的关系
2.多态实现的技术是动态绑定,它在执行期间去判断所引用的对象的实际类型,然后再根据实际类型调用其相应的方法
3.多态实现的机制是重载(overload)和重写(override),重载是一个类汇总定义了多个同名方法,他们有着不同的参数类型或数量,而重写是子类实现对父类方法的覆盖,他们拥有相同的方法名,返回值和参数类型,当父类引用指向子类时,真正调用的是子类重写的方法。

3.StringBuffer和StringBuilder的区别

在这顺便把String也讲了
1.从可变性:String和StringBuffer、StringBuilder(他们两个都是继承AbstractStringBuilder,它其中有一个字符数组)都是使用字符数组来保存字符串,但是String的字符数组用final做了修饰,不可变。
2.从线程安全性:StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而StringBuilder并没有对方法加锁,所以它是非线程安全的。(String不可变,也是线程安全)
3.从性能:StringBUffer因为有进行加锁,所以它的性能较之StringBuilder来的会更差。(String每次进行改变都会生成新对象,性能最差)

4.Java实现多线程的方法

创建多线程有三种方式
1.通过实现Runnable接口的方式进行多线程的创建。它重写的方法是run(),并且没有返回值,不能抛出异常。
2.通过实现Callable接口的方式实现多线程的创建。它重写的方法是call(),并且有返回值,可以抛出异常。运行后可以得到一个Future对象,通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
3.通过继承Thread类来创建多线程。通过重写Thread父类的run()方法,来创建多线程。

4.类加载机制

1.一个类的完整生命周期是:加载,连接(又分为验证,准备,解析),初始化,使用,卸载
2.加载(加载和连接阶段的部分内容是交叉进行的,可能加载阶段尚未结束,连接阶段可能就已经开始了):
    第一步:通过全类名获取定义此类的二进制字节流
    第二步:讲字节流所代表的静态存储结构转换为方法去的运行时数据结构
    第三步:在内存中生成代表该类的Class对象,作为方法区这些数据的访问入口
3.连接(加载和连接阶段的部分内容是交叉进行的,可能加载阶段尚未结束,连接阶段可能就已经开始了):
    验证:确保Class文件的字节流包含的信息符合当前虚拟机的要求
    准备:正式为类变量分配内存并设置类变量初始值(仅包括类变量,即static)
    解析:虚拟机将常量池内的符号引用替换为直接引用
4.初始化:是执行初始化方法<clinit>()方法的过程,是类加载的最后一步,这一步JVM才真正开始执行类中定义的Java程序代码(字节码),只有去主动使用类的时候,才会初始化类。

5.垃圾回收机制

1.针对HotSpot Vm,它里面的GC准确分类只有两大类:
    部分收集:
        一:新生代收集:只对新生代进行垃圾收集
        二:老年代收集:只对老年代进行GC
        三:混合收集:对整个新生代和老年代进行GC
    整堆收集:收集整个Java堆和方法区
2.在对堆进行垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象),判断对象已经无效有两个方法:一是引用计数法:它给对象添加一个引用计数器,每当有一个地方引用它,计数器+1,引用失效,计数器-1.任何时候计数器为0的对象就是失效对象,它的缺点就是很难解决对象之间的相互循环引用问题。二是可达性分析算法:通过一系列"GC Roots"的对象作为起点,从这些节点往下搜素,节点走过的路径为引用链,当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。但不可达的对象并非一定死亡,它会经历两次标记,可达性分析中不可达的对象会被第一次标记(仅标记有覆盖finalize方法或finalize方法还未被虚拟机调用的对象),他们会被放在一个队列中进行第二次标记,除非这个对象与引用链上的其他对象建立联系,否则就会被回收。
3.引用有四种:强引用>软引用>弱引用>虚引用。强引用就是我们平常最经常使用的引用,GC回收器是绝不会回收它的,即使导致OOM。软引用在内存空间足够的时候不会被GC回收,软引用可以用于实现内存敏感的高速缓存。弱引用只要GC回收器扫描到它,他就会被回收,无论内存是否充足。虚引用在任何时候都可能被回收,它必须与引用队列联合使用。
4.运行时常量池回收的是废弃的常量。
5.方法区回收的是无用的类。它满足一:该类所有实例都已被回收,二:加载该类的ClassLoader已经被回收,三:该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
6.垃圾回收的算法:
    一:标记清除算法:首先标记出所有的不需要回收的对象,在标记完成后统一回收掉所有没被标记的对象。他会导致:效率低下且标记清除后会产生大量不连续的碎片
    二:标记复制算法:它可以将内存分为大小相同的两块,每次使用其中的一块,当回收后,就将还存活的对象复制到另一块去,然后再清理空间。
    三:标记整理算法:让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存
    四:分代收集算法:当前虚拟机基本都是这个。根据不同的代选择不同的垃圾收集算法,如再新生代,每次收集都有大量对象死去,可以选择标记复制算法,而老年代存活率较高,且空间占用较大,选择标记整理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值