面试题
1.重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
重载:方法名一样,返回类型,形参个数,类型不样的方法,不一定必须是继承关系,同一个类中都可以,比如 构造方法重载
重写:方法名,返回类型,参数都一样的方法。
2.抽象类和接口的关系
抽象类:用abstract修饰的类是抽象类,抽象类里的方法(抽象方法)必须被重写,抽象类不能实例化对象,抽象类可以被继承。
相同点:
-.都不能创建对像
-.都可以定义抽象方法,并且在子类中重写
不同点:
-. 关键字不同abstract interface
-. 抽象方法中既可以有抽象的方法也可以有普通的方法
-. 接口中所有的方法都是抽象方法
-. 抽象类的方法可以任意权限,接口中方法只能是public
-. 抽象类只能单继承,接口可以多实现
接口:用interface修饰为接口,接口里的方法为抽象方法,必须要实现.
3.请说出作用域public,private,protected的作用范围
public:公共的,全局的。修饰类,变量。
private:私有的,在同一个类中可用。
protected:受保护的,修饰的成员变量和函数能被类本身、子类及同一个包中的类访问。
4.Java集合类框架的基本接口有哪些?有何区别?
集合主要有Collection和Map接口。
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
set 一般无序不重复.map kv 结构 list 有序
4.什么是线程池(thread pool)?
线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。
5.String、StringBuffer、StringBuilder区别
String:不可变字符串,线程安全,String实现了三个接口:Serializable、Comparable<String>、CarSequence。
StringBuffer:可变字符串,是非同步,运行于多线程中就需要使用着单独同步处理,线程不安全,效率高。
StringBuilder:可变字符串,线程安全,效率低,StringBuilder只实现了两个接口Serializable、CharSequence。
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
6.字节流和字符流的区别
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,
而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,
在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流。
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的
7.堆和栈的区别
栈:存储基本数据类型,引用类型地址
堆:存储对象的信息方法,String,数组。
8.反射的作用
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法
要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。当一个类被加载以后,Java虚拟机就会自动产生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。
9.构造器是否可以被重写
可以重载,不可以重写
首先,构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。
又由于构造器不能继承,所以就不能被重写。但是,在同一个类中,构造器是可以被重载的。
10.在 java 程序中怎么保证多线程的运行安全?
原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性
可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
有序性:程序执行的顺序按照代码的先后顺序执行
JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题
11.什么是死锁?
互斥条件:一个资源每次只能被一个进程占用
请求与保持条件:一个进程请求资源阻塞,对已获得的资源不放。
不剥夺条件:进程在使用资源在没有使用完前不能强行剥夺。
循环等待条件:若干进程形成一种头尾相接的循环等待资源状态。
12.单例设计模式
Mysql面试题连接完整
https://mp.weixin.qq.com/s/FyN3bLo7LFz3aX31kI13yQ