Java | 面试笔记整理

JVM

数据结构与算法

基础

基本数据类型(4类8种)

byte、short、int、long float、double Boolean char

==equals()的区别
  • 比较基本数据类型时==比较的是它的值,equals()不能比较基本数据类型。
  • 比较引用类型时,==比较的是对象的引用即引用的地址值,equals()在Object类中没有重写时,作用和==相同,JDK中的类中基本都重写了Object的equals()方法,重写后比较的是对象的值。
finalfinally的区别
  • final修饰类时该类不能被继承,修饰方法时该方法不能被重写,修饰常量时该常量不能被修改,修饰变量时该变量的引用不能被修改,引用的值可以被修改。
  • finally用于异常处理中的try/catch语句中,不管一段代码是否发生“异常”,finally中的代码一定会被执行。
一个.java文件中是否可以包含多个类
  • 可以。但是只能包含一个public类。
&和&&的区别
  • &和&&都可以作为逻辑 的运算符。
  • &还可以作为位运算符。
  • && 有短路功能,如果它前面的表达式为false则不计算第二个。
switch()的参数
  • 只能是int型和枚举型,能自动转为int的也是可以的(byte、short)。
throw和throws的区别
  • throw用在方法里面,明确地抛出一个“异常”
  • throws用在方法上,声明异常类型,抛出各种可能的“异常”,。
Exception和RunTimeException的区别
  • RunTimeException是Exception的子类,RunTimeException异常不需要捕捉和声明,而Exception异常必须进行捕捉和声明。
跳出多层循环
  • 在循环外定义一个标记,在break后加上该标记,即可跳出到指定标记位置。
访问修饰符作用域
作用域当前类同一package包子孙类其他package包
public
protected×
friendly××
private×××
Overload 和 Override 的区别
  • Overload:重载,使得一个类中可以有多个同名方法,同名方法的参数列表不同(类型,个数)。
  • Override:重写,方法的覆盖重写,子类可以与父类有名称完全相同的方法(参数列表也完全相同),子类创建的对象使用子类重写后的方法,与父类方法无关。
构造方法的作用
  • 完成对象初始化
StringBuffer 与 StringBuilder 的区别
  • StringBuffer:速度慢,线程安全。
  • StringBuilder:速度块,线程不安全。
  • 底层实现上,StringBuffer是比StringBuilder多了Synchronized修饰符。
String类为什么不可变
  • String类被声明为final类,且String内部的value字节数组也是final的,所以String类不能被继承,且不可变。
面向对象的理解
  • 首先面向对象是一种处理问题的思想,它不仅限于程序开发中,但在程序开发中被应用的最为广泛。
  • Java中的面向对象:封装、继承、多态。多态:允许不同类的对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的方式。(发送消息就是函数调用)
Java多继承
  • Java 不支持多继承,支支持单继承。但接口可以多继承。
抽象类和接口的区别
  • 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
  • 类可以实现很多个接口,但是只能继承一个抽象类
  • 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
  • 抽象类可以在不提供接口方法实现的情况下实现接口。
  • Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
  • Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
  • 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
static关键字
  • static变量是属于类的,在所有的实例中的值是一样的。当类被jvm载入的时候,会对static进行初始化。如果不用实例来访问非static的变量,编译器会报错,因为这些变量没有被创建,还没和任何实例联系上。
如何保证线程安全
  • 确保合理的时间调度,避免共享资源的存取。
  • 在并行任务设计上可以通过适当的策略,保证任务于任务之间不存在共享资源
  • 设计一个规则来包真正一个客户的计算工作和数据的访问只会被一个线程或一一天机器完成,而不是分配给多个线程去完成。
同步和异步
  • 如果系统中存在临界资源,例如正在写的数据有可能被另一个线程读到,或者正在读的而数据已经被另一个线程写过了,那么这些数据就必须进行同步存取。当应用程序在对象的调用上用了一个需要花费很长时间来执行的方法,并且不需要让程序等待方法的返回时就应当使用异步编程,同城使用异步更有效率。
  • 事实上:同步可以看作阻塞式操作,而异步就是非阻塞式操作。
String s 和 new String()的区别
  • String s = “abc”;
    通过这种方式创建时,jvm会现在字符串常量池中查询“abc”是否存在,若存在,直接将地址返回,若不存在,则先在字符串常量池中创建“abc”,然后返回地址。
  • String s = new String(“abc”);
    通过这种方式创建时,jvm先在字符串常量池中查找“abc”对象是否存在,若存在,则在堆中直接创建“abc”对象,并将堆中对象的地址值赋值给s引用,若不存在,则在堆和常量池中同时创建“abc”对象,并将堆中的对象地址值赋值给s引用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值