2020Java面试题基础篇整理

2020Java面试题基础篇整理

Java和JavaScript的区别?
参考回答:

  • JavaScript和java是两家公司开发的不同的两个产品。
  • Java是Sun公司推出的面向对象的程序设计语言,适合于互联网应用产品的开发;而JavaScript是Netscape推出的一种可以嵌入web页面中运行的基于对象和事件驱动的解释性语言。
  • Java源代码在运行之前,必须经过编译;JavaScript是一种解释性编程语言,其源代码不需要经过编译,直接由浏览器解释执行。
  • Java采用强类型变量,JavaScript采用弱类型变量

请你讲讲&和&&的区别?
参考答案:

&运算符的两种用法:(1)按位与 (2)逻辑与

&号两边都会进行判断

&&运算符也叫短路与运算,当&&的左边表达式为false,右边的表达式会被直接短路掉,不会进行运算

什么是JavaBean?
参考答案:

  • 所有属性为private
  • 提供默认构造方法
  • 提供getter和setter
  • 实现serializable接口

int和Integer有什么区别?
参考答案:

int的包装类就是Integer,从Java5开始引入了自动装箱和拆箱机制,使得两者可以相互转换。

  • 原始类型:boolean、char、byte、short、int、long、float、double
  • 包装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double
class AutoUnboxingTest{
	public static void main(String [] args){
		Integer A = new Integer(1);
		Inteber B = 1;		//将3自动装箱成Integer类型
		int C = 1;
		System.out.println(a==b);		//false,两个引用没有指向同一个对象
		System.out.println(a==c);		//true,a自动拆箱成int类型在和c比较
	}
}

请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?
参考答案:

Array和ArrayList的不同点:

  • Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
  • Array大小是固定的,ArrayList的大小是可以动态变化的。

对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

请你解释什么是值传递和引用传递?
参考答案:

  • 值传递是对基本类型变量而言,传递的是该变量的一个副本,改变副本不影响原变量。
  • 引用传递一般是对于对象型变量而言,传递的是该对象地址的一个副本,并不是原对象本身。所以对引用对象进行操作会同时改变原对象。

请你解释Object若不重写hashCode()如何计算出来?
参考答案:

Object的hashCode方法是本地方法,也就是用c语言或c++实现的,该方法直接返回对象的内存地址。

请你解释为什么重写equals还有重写hashcode?
参考答案:

HashMap中,如果要比较key是否相等,要同时使用者两个函数!因为自定义类的hashCode()方法继承于Object类,hashCode码默认为内存地址,这样即便有相同含义的两个对象,比较也是不相等的。HashMap中比较key先比较的是key的hashCode(),比较其值是否相等,若相等在比较equals(),若相等则认为他们是相等的。若不重写equals方法,当判断一个对象是否为同一对象(即进行内存地址的比较),所以必定两个方法一起重写。
重载hashCode是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。
重载equals()是为了向hashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。
总结:
1.使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率
2.保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

  • equals()相等的两个对象,hashCode()一定相等
  • hashCode()不相等,equals()一定不相等
  • hashCode()相等,equals()不一定相等

请你介绍一下map的分类和常见的情况?
参考答案:

map是java.util包下的一个接口,它是java的一种数据结构,它有四种实现类:HashMap,HashTable,TreeMapp和LinkedHashMap。
Map主要用于存储键值对,根据键得到值,因此不允许键重复,但允许值重复。

  • HashMap是一个最常用的Map,它根据键的HashCode值存储数据,通过键可以获取值,遍历时,取得的数据是随机的,具有很快的访问速度;最多只允许一条记录的键为null,允许多条记录的值为null;HashMap不支持线程的同步,如果需要同步,可以用Collections的synchronizedMap方法使得HashMap具有同步的能力,或者使用ConcurrentHashMap
  • HashTable和HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为null,它支持线程同步,任何时刻下,只有一个写线程。
  • LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用iterator遍历LinkedHash时,先得到的记录肯定是插入的,也可以在构造时用带参数,按照应用次数排序。一般情况下,遍历会比HashMap慢,但当HashMap容量很大,实际数据较少时,遍历可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
  • TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用iterator遍历TreeMap时,得到的记录是排过序的。

final关键字的用法?
参考答案:

  • 修饰类,代表这个类无法被继承
  • 修饰方法,代表这个方法无法被子类重写,但可以被继承
  • 修饰变量,代表这个变量不能再更改是一个常量

synchronized关键字和lock接口?
参考答案:

synchronized是java的一个关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只能有一个线程访问。JDK1.5后,引入了自旋锁、锁粗化、轻量级锁、偏向锁来优化关键字的性能。(锁自动释放)
Lock是一个接口,而synchronized是Java中的关键字,synchronized在发生异常时,会自动释放占有的锁;而Lock在发生异常时,如果没有主动通过unLock去释放锁,则很可能造成死锁现象,因此Lock时需要在finally块中释放锁;(手动释放锁)
Lock可以中断等待锁的线程;可以知道有没有获取锁;synchronized做不到这两种操作。

volatile关键字?

参考答案:

有序性和可见性,禁止指令重排。

synchronized锁,锁的是什么?
参考答案:

synchronized修饰静态方法以及同步代码块,锁的是类,线程要想执行同步代码块,需要获得类锁。
synchronized修饰成员方法,锁的是对象。

java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
参考答案:

java中的方法重载是指发生在同一个类里面两个或者多个方法的方法名相同但是参数列表不同的情况。与此相对,方法覆盖是说子类重新定义了父类方法。
方法覆盖必须有相同的方法名,参数列表和返回类型

Query接口的list方法和iterate方法有什么区别?
参考答案:

list()方法对缓存只写不读,只能在开启缓存的前提下使用缓存;iterate()方法可以充分利用缓存,如果目标只读或者频繁的读,使用iterate可以减少性能的开销。
(N+1查询问题)

面向对象的“六原则一法则”?
参考答案:

  • 单一职责原则:一个类只做它该做的事情。
  • 开闭原则:软件实体对扩展开放,对修改关闭。
  • 依赖倒置原则:面向接口编程(尽可能使用抽象类型而不是具体类型)
  • 里氏替换原则:任何时候都可以用子类型替换掉父类型
  • 接口隔离原则:接口要小而专,绝不能大而全
  • 合成聚合复用原则:优先使用聚合或合成关系复用代码

迪米特法则:又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

重载(Overload)和重写(Override)的区别。重载 的方法能否根据返回值类型进行区分?
参考答案:

方法的重载和重写都是实现多态的方式,区别在于前者实现编译时的多态,重写实现的是运行时的多态性。重载发生在一个类中,具有相同的方法名,不同的参数列表就是重载;重写发生在子类与父类之间,要求子类与被重写方法有相同 的返回类型,重载对返回类型没有要求。

请说明一下final,finally,finalize的区别?
参考答案:

  • final是用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源。

请说明面向对象的特征有哪些方面
参考答案:

(1)抽象 抽象就是忽略一个主题中与当前目标无关的那些服务,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择了其中的一部分。
(2)继承 子类和父类之间的一种关系,子类可以从父类那里继承方法和实例变量,并且子类可以修改和增加新的方法使它更符合特殊场景的需要。
(3)封装 封装就是包过程和数据包围起来,对数据访问只能通过已定义的接口进行访问
(4)多态 多态性就是允许不同类的对象对同一消息做出响应,具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名的问题。

请说明Comparable和Comparator接口的作用以及它们的区别?
参考答案:

Comparable接口只包含一个compareTo()方法,这个方法给两个对象排序,返回负数,0,正数,表示小于,等于,大于已经存在的对象。
Comparator接口包含了compare()和equals()两个方法,compare()用来给两个输入参数排序,回负数,0,正数,表示小于,等于,大于第二参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果相同的时候,这个方法才返回true。

接口和抽象类的区别?
参考答案:

(1)接口中的方法都是抽象的。抽象类中可以包含抽象和非抽象
(2)类可以实现多个接口,但只能继承一个抽象类
(3)抽象类可以不是接口方法实现的情况下实现接口
(4)接口中的遍历默认都是final,抽象类可以包含非final的变量
(5)接口中的成员函数都是public的,抽象类可以是private、protected或者是public的
(6)接口和抽象类都是不可以被实例化的

请你谈谈如何通过反射创建对象?
参考答案:

方法一:通过类对象调用newInstance()方法,例如:String.class.newInstance()
方法二:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象,调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);

请你介绍一下类加载机制,双亲委派模型,好处是什么?
参考答案:

某个特定的类加载器街道加载类请求是,首先将加载任务委托给父类加载器,如果父类加载器加载任务成功,就返回;只要当父类加载器加载失败时,才自己去加载。

好处:优先级的层次关系;;类重名,可以正常编译,但是无法被加载运行。

请你谈谈StringBuffer和StringBuilder有什么区别?
参考答案:

StringBuffer线程安全,StringBuilder线程不安全,底层实现上,StringBuffer比StringBuilder多了个Synchronized修饰符

statc关键字是什么意思?Java是否可以覆盖(override)一个private或者是static的方法?
参考答案:

static关键字表明一个成员变量或者成员方法可以在所属类没有实例化的情况下被访问。
Java中static方法是不能被覆盖的,因为方法覆盖是运行时动态绑定的,而static方法是编译时静态绑定的。

Java集合类框架的基本接口有哪些?
参考答案:

Java集合类里面的最基本接口有:
Collection:代表一组对象,每一个对象都是它的子元素
Set:不包含重复的Collection
List:有顺序的Collection,并且可以包含重复元素
Map:可以把键映射到值的对象,键不能重复

Java线程实现/创建方式?
参考答案:

(1)继承Thread类,Thread本质就是一个Runnable接口的一个实例。启动一个线程的唯一方式就是通过Thread的start()方法,它将启动一个新的线程,并执行run()方法;
(2)实现Runnable接口,Thread thread = new Thread(你的方法);
(3)实现Callable接口,带返回值的Runnable的。重写call方法,Thread thread = new Thread(new FutureTask(你的方法)); thread.start(); new FutureTask(你的方法).get()拿到返回值
(4)使用线程池,ExecutorService es = executors.newFixedThreadPoll(3);

线程的生命周期?
参考答案:

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。

  • 新建:就是刚使用new方法,new出来的线程;
  • 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
  • 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
  • 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

sleep()和wait()的区别?
参考答案:

  • sleep()属于Thread类,wait属于Object类
  • sleep状态导致程序暂停执行指定时间,但是它的监控状态依然保持
  • sleep()不会释放锁;wait()释放锁,唤醒调用notify()或者notifyAll()

请简述一下线程的sleep()方法和yield()方法有什么区别?
参考回答:

①sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

JDK和JRE的区别是什么?
参考回答:

JRE:java运行时环境
JDK:完整的java软件开发包

请说明一下JAVA中反射的实现过程和作用分别是什么?
参考答案:

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。反射的实现主要借助一下四个类:CLASS:类的对象,CONSTRUCTOR:类的构造方法,FIELD:类的属性对象,METHOD:类中的方法对象

作用:反射机制指的是程序在运行时能够获取自身的信息。在JAVA中,只要给定类的名字,那么就可以通过反射机制获取类的所有信息。

Java 的动态就体现在反射。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。

对象创建的过程?
参考答案:

类加载检查–》分配内存–》初始化零值–》分配对象头–》执行init方法

类加载的执行过程?
参考答案:

  • 加载:根据路径找到对于的class文件然后导入
  • 检查:检查加载的class文件的正确性
  • 准备:给类中的静态变量分配内存空间
  • 解析:虚拟机将常量池中的符号引用替换成直接引用的过程
  • 初始化:对静态变量和静态代码块执行初始化工作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值