Java面试常见问题总结

一、创建对象的4中方法:

1、new 关键字直接创建

example:Student s=new Student();

2、class的反射调用(使用class的newInstanse方法可以调用无参构造器创建对象)

 Example:class.forName();

3、使用clone()来创建

     Example: try{

            Student stu3 = (Student) stu1.clone();

             System.out.println(stu3);

}

catch (CloneNotSupportedException e)

{

             e.printStackTrace();

}

4、使用序列化(实现Serializable接口)

     Example:public class Student implements Serializable{  }

二、线程不安全/安全的类

1、 不安全:StringBuilder、HashMap、ArrayList、LinkedList

2、安全:StringBuffer 、HashTable、Vector、stack(栈先进后出


三、 HashTable和HashMap

  • Map 集合中不能包含重复的键 ,但可以包含重复的值

  • HashMap内部基于哈希表(数组)存储键值对(映射项)。

  • HashMap是线程不安全的。

  • HashMap根据键的哈希码值重新计算键值对(映射项)的在哈希表中的位置。

  • HashMap的key可以为null ,value 也可以为 null 。

  • HashMap的父类是 AbstractMap 。

  • Hashtable内部基于哈希表(数组)存储键值对(映射项)。

  • Hashtable是线程安全的 ( 所有的方法都被 synchronized 关键词所修饰 )。

  • Hashtable直接根据键的哈希码值确定键值对(映射项)的在哈希表中的位置。

  • Hashtable的key和value 都不能为null 。

  • Hashtable的父类是 Dictionary 类。

  • 唯一不一样的是:HashTable为线程安全和key/value不可以为null值


四、ArrayList和LinkedList

  • ArrayList 内部借助于数组实现元素的存储。
  • ArrayList 是线程不安全的,相对于线程安全的Vector来说可能效率较高。
  • ArrayList 内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
  • ArrayList 内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )
  • LinkedList 内部基于链表实现元素的存储。
  • LinkedList是线程不安全的。
  • LinkedList内部基于链表实现数据存储,因此随机访问效率较低。( 需要逐个遍历链表中的结点 )
  • LinkedList内部基于链表实现数据存储,因此增删元素速度较快。( 增删元素只需要修改相邻两个节点的指针 )

五、Vector类和Stack类

  • Vector 内部借助于数组实现元素的存储。
  • Vector是线程安全的,相对于线程不安全的ArrayList来说可能效率较低。
  • Vector内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
  • Vector内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )
  • Stack 类是 Vector 类的子类。
  • push 将元素压入栈顶
  • peek 检查栈顶元素(不弹出元素)
  • pop 弹出栈顶元素
  • search 从栈顶开始搜索元素( 基数从 1 开始 )
  • empty 判断当前栈是否为空

六、线程的五种状态:

1、 新建状态:new Thread();

2、 就绪状态:t.starts();等待获得CPU

3、 运行状态:获得CPU,实现run方法

4、 阻塞状态:执行了Thread.sleep方法、发生了IO操作、或者调用了同步锁的外套方法

5、 死亡状态:代码执行完毕。

sleep 和 yield 的区别

1. sleep 不考虑线程优先级 ( 一个线程睡眠后其它线程都有机会获得CPU ),yield 要考虑线程优先级 ( 仅让位给 跟自己同等优先级或优先级比自己高的线程 )

2. sleep 可能抛出 InterruptedException ,而 yield 不会抛出异常

3. sleep 导致运行状态的线程进入到阻塞状态,而 yield 会导致运行状态的线程进入就绪状态


七、异常处理机制

  • 当程序发生异常时会产生一个代表该异常的对象
  • 同时当前程序会把这个异常对象交给运行时系统
  • 运行时系统根据接受到的异常对象寻找相应代码来处理该异常。
  • 处理异常的方式有两种,一种是 捕获异常 ,另外一种是 抛出异常。

八、受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的区别

1、运行时异常是指 直接 或 间接 继承了 java.lang.RuntimeException 类的那些 异常类, 而 受检查异常 是指从来都没有继承过 java.lang.RuntimeException 类的那些 异常类 。

2、对于受检查异常来说,必须在编译之前就显式书写异常的处理代码,可以是通过 try … catch … finally 语句捕获并处理异常, 也可以通过为 相应的方法 添加 throws 声明 来 声明抛出的异常类型。

3、对于运行时异常来说,在编译阶段可以不显式书写任何跟异常处理有关的代码。

受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的相同点

1、都是异常( 都是 Exception 的子类型,不是 Error 的子类型 )

2、都可以被 捕获 ( try … catch … finally ) 或 抛出 ( throw )


九、十种常见的异常

  • IOException

  • FileNotFoundException

  • RunnTimeException

  • ArithmeticException

  • lllegalArgumentException

  • ArrayIndexOutOfBoundsException

  • NullPointerException

  • ArrayStoreException

  • ClassCastException

  • NumberFormatException


十、Mysql和ORACLE的区别

1、 Oracle是大型数据库而Mysql是中小型数据库 Mysql是开源的而Oracle价格非常高

2、 Oracle支持大并发,大访问量

3、 Oracle也Mysql操作上的一些区别

主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;

Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。

4、 单引号的处理 MYSQL里可以用双引号包起字符串,

ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。


十一、C和Java的区别

  • JAVA是从可以算是从C++发展而来的,因此Java与C语言的语法比较类似的。

  • C在使用完一块内存时,要手动释放内存;而java有内存自动回收机制

  • C有指针,而java没有

  • C是多线继承,而java是单继承

  • Java有package的概念,C没有


十二、String、StringBuffer、StringBuilder的区别

  • String:字符串常量,字符串长度不变,是被声明程final的,一次赋值不可改变

  • StringBuffer:字符串变量,线程安全,如果需要频繁的对字符串内容进行修改,处于效率考虑最好使用StringBuffer;

  • StringBuilder:字符串变量,非线程安全,与StringBuffer的区别是StringBuilder它是在单线程环境下使用的,所以效率要比StringBuffer高


十三、集合和数组的区别

  • 数组的长度是固定的,而集合长度是可变的

  • 数组值可以存储对象,还可以存储基本数据类型;而集合只能够只能存储对象

  • 数组存储的数据类型是固定的,而集合存储的数据类型不固定


十四、int和Integer的区别

  • Integer是int提供的封装类。int是基本数据类型中的一种。

  • Integer的默认值是null。int的默认值是0

  • Integer是一个对象,需要一个引用来指向这个对象,int是基本数据类型, 直接存储在内存中。

  • 声明为Integer的变量需要实例化,声明为int的变量不需要实例化。


十五、抽象类与接口的区别

  • 抽象类和接口都不能直接实例化

  • 接口是设计的结果 ,抽象类是重构的结果

  • 抽象类里可以没有抽象方法

  • 如果一个类里有抽象方法,那么这个类只能是抽象类

  • 抽象类可以有具体的方法 和属性, 接口只能有抽象方法和不可变常量


十六、单列的特点和作用

特点

  • 单例类确保自己只有一个实例。
  • 单例类必须自己创建自己的实例。
  • 单例类必须为其他对象提供唯一的实例

作用

  • 控制资源的使用,通过线程同步来控制资源的并发访问;

  • 控制实例产生的数量,达到节约资源的目的。

  • 作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信


十七、数据结构中的栈和队列的区别

:后进先出

队列:先进先出

Queue:先进先出


文末彩蛋

针对于上面面试有提到的知识点我总结出了有1到5年开发经验的程序员在面试中涉及到的绝大部分架构面试题及答案做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。

资料获取方式 QQ群搜索“658752593” 备注“csdn” 即可免费领取

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42982923/article/details/88726564