目录
一、集合
1.集合与集合之间的区别
2.集合子类之间的区别(数据结构)
二、线程
三、面向对象
继承
多态
四、异常
五、IO流
六、序列化与反序列化
今天给大家分享 Java基础篇的面试题,小编给大家稍微整理了一下,希望即将面试的朋友们看了后能有帮助。
一、集合
1.集合与集合之间的区别
例如:list、set、map之间的区别
List:有序、可重复。
Set:无序、不可重复的集合。重复元素会覆盖掉。
Map:键值对,键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。
2.集合子类之间的区别(数据结构)
问题一:ArrayList与Linkedlist的区别
它们都属于list集合的子类。
ArrayList-数组-查询修改快,删除新增慢
Linkedlist-链表-查询修改慢,删除新增快
问题二:hashset和treeset的区别
它们都属于set集合的子类。
hashset的数据结构是哈希表,哈希表特点是去重 底层数据结构依赖跟hashcode以及equals返回值有关
treeset的数据结构是二叉树,二叉树的特点自带排序属性,实现了Comarable自然排序接口
hashset的哈希表是怎么判断是否同一个对象的?
判读对象 是否是同一个对象重写hashcode(x轴)与equals(y轴)这两个方法,如果返回值都相同,那么就是同一个对象。
问题三:hashmap与hashtable的区别
hashmap线程不安全。
hashtable的方法都被synchronize修饰,线程是同步,线程安全。
二、线程
概念:最小的程序运行单元;进程与线程的关系是1对多
实现:extends Thread,implement Runnable
线程的状态:初始化、就绪、运行、阻塞/等待/休眠、销毁
问题一:start与run的区别?
启动线程用start方法,run方法实现的是内容。
问题二:sleep与wait的区别?
sleep设置休眠时间到了后是线程自动唤醒,wait要通过notify方法人为唤醒
死锁:两个及以上的线程,互相抢占锁资源,呈现僵持状态
三、面向对象
继承
问题一:重写与重载的区别
重载 同名不同参重写 同名同参 子类覆盖父类的方法,而且只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常。多态
问题二:接口与抽象类的区别
接口是比抽象类更抽象的抽象类
- 抽象类可以有构造方法,接口中不能有构造方法;
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 一个类可以实现多个接口,但只能继承一个抽象类。
四、异常
处理方式:声明throws 扑捉异常try catch
问题一:普通异常与运行时异常的区别运行时异常不用声明throws,普通异常必须要处理,否则编译不通过。
怎么样写一段指定的代码,抛出指定的异常(栈内存溢出StackOverflow)递归最容易出现栈内存溢出。
五、IO流
常识:InputStream、outputstream、Reader、Writer
文件拷贝/文件夹递归查询文件拷贝案例
public static void main(String[] args) throws Exception { BufferedInputStream in = new BufferedInputStream( new FileInputStream(new File("E:\\学习资料\\Y1\\java基础录屏\\readme.txt")) ); BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File("E:\\workspace\\java基础面试笔记.txt")) ); byte[] bytes = new byte[1024]; int len = 0; while ((len = in.read(bytes)) != -1) { out.write(bytes,0,len); } in.close(); out.close(); }
六、序列化与反序列化
定义:将一个对象转化为一种格式,能够更好的传输和理解。
反序列化是转换过来,便于人们观看的。
问题:怎样把对象如何实现序列化?
举个例子,假如我们要对
Student
类对象序列化到一个名为student.txt
的文本文件中,然后再通过文本文件反序列化成Student
类对象:先写一个实体类
public class Student implements Serializable { private String name; private Integer age; private Integer score; @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", score=" + score + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } }
写一个方法实现 对象->流
public static void serialize( ) throws IOException { Student student = new Student(); student.setName("linko"); student.setAge( 18 ); student.setScore( 1000 ); ObjectOutputStream objectOutputStream = new ObjectOutputStream( new FileOutputStream( new File("D:\\student.txt") ) ); objectOutputStream.writeObject( student ); objectOutputStream.close(); System.out.println("序列化成功!已经生成student.txt文件"); }
再写一个方法实现 流-->对象
public static void deserialize( ) throws IOException, ClassNotFoundException { ObjectInputStream objectInputStream = new ObjectInputStream( new FileInputStream( new File("student.txt") ) ); Student student = (Student) objectInputStream.readObject(); objectInputStream.close(); System.out.println("反序列化结果为:"); System.out.println( student ); }
运行结果