![85beb72c24d574112f53fa07367eb4c9.gif](https://i-blog.csdnimg.cn/blog_migrate/74d60a86ecd7a51b79674215242ae9bd.gif)
Java程序员面试都问些什么?
关于Java面试,一般应该会问到下面这些问题。
[编程工具]
你常用的编程工具有哪些?这个问题主要是考察你工作的专业性,你是不是具有大型项目的工作经验.
一般好的,Java的编程工具,你比如说,Eclipse, netbeans, Intelli J 等等。
![cb2922337e7a20014b90467578d5a1c7.png](https://i-blog.csdnimg.cn/blog_migrate/5d04a1d7765eb0a6995b18b2f3463c4a.jpeg)
[局部变量和类变量的区别]
这个问题主要是考察选手对于scope的概念。回答这个问题,
就是局部变量是在方法里面定义的。这个变量只能在方法内部才可以被调用。
类变量呢,可以在类的内部,任何地方都可以被调用。类变量还可以添加一些修饰符,限制或者允许外部类调用。
![d9b6d2662c8e9ecb5d5aace8d48acda4.png](https://i-blog.csdnimg.cn/blog_migrate/2230ee538e3122eb8a2f323359ca22b5.jpeg)
[什么是继承? ]
继承就是说子类可以享有父类的一些定义。
![796e4e0091a35291d1a162f8bc5671b8.png](https://i-blog.csdnimg.cn/blog_migrate/49ebd5a9c5f617a53f09f00e4025c531.jpeg)
[什么是封装?]
封装是通过类定义的方式,把一些方法和数据包裹起来。
![d879a2ed04c28b8e0851b3c8410f5f49.png](https://i-blog.csdnimg.cn/blog_migrate/54ea4de145ca9afdb4c2d4f9988ce45c.jpeg)
[什么是多态?]
多态是指一个对象可以通过具体的引用类型来调用父类和子类的一些方法。
这三个问题主要是考察选手对于面向对象编程的概念。
![38af0e96b9ef60c8f65f4ce31ace303b.png](https://i-blog.csdnimg.cn/blog_migrate/c303468c3bbc75ed873f89f078c5b517.jpeg)
[ Overriding 和 overloading的区别]
这两种方法在编程中会经常用到。被问的可能性非常大。
Overriding主要用在子类要使用父类的一些方法定义。方法名必须相同,方法参数必须相同, 返回值类型必须相同。使用这种方法, 子类既可以调用父类的方法也可以添加自己个性化的实现。
Overloading主要用在方法这一层次上。具有同样的方法名,不同的参数类型, 可能会返回不同的数据类型。
![f515b107a5a1bc2d3137220315966464.png](https://i-blog.csdnimg.cn/blog_migrate/05c4da6e8a20aceb0e0645c4f898a294.jpeg)
[接口和抽象的区别?]
这个问题在面向对象编程里面也是经常被问到的一个问题。
在Java中,无法实现多类继承,所以就引入了接口的概念。接口中,主要是类的声明,没有实现内容。
抽象类中至少要含有一个抽象方法。这个抽象方法只有声明没有实现。抽象类的非抽象方法,需要有实现内容。
![1f46628683ec3c04d603d65be9690107.png](https://i-blog.csdnimg.cn/blog_migrate/a42a7066b780183ac6e0fb89b55f5ac5.jpeg)
[说一下访问修饰符]
这也是面向对象编程里面非常重要的一个概念。
private, protected, public。没有修饰符,就是default。
private只能在本类内部访问。
protected在本类和子类中访问。
public在其他类中都可访问。
default在包内可访问。
![4f64b60c7b42e1df10fc8ade18cafef7.png](https://i-blog.csdnimg.cn/blog_migrate/132fdd7e124360daab48a7e5bcf3a3c2.jpeg)
[数组和数组列表的区别?]
![12ecaff87d0be0f483309ee7b3b0a0b1.png](https://i-blog.csdnimg.cn/blog_migrate/221111e7ddfae19926ca4a8097a098cc.jpeg)
[String, StringBuilder, StringBuffer的区别? ]
string不可修改。
string builder可修改,线程不安全的。
string buffer可修改,线程安全的。
![d4eae933e6287ebf7979a2da8945099e.png](https://i-blog.csdnimg.cn/blog_migrate/77db69c64d618e4125d6efc217896e89.jpeg)
[HashMap, HashTable 的区别? ]
都是字典类型。
hash map 是线程不安全的。
hash table 是线程安全的。
![a6728dd54369e1a1decd846286d23211.png](https://i-blog.csdnimg.cn/blog_migrate/ba709d85238e0ea69b7578f48be1f412.jpeg)
[Set 相关的问题]
Set里面的数据是唯一的。
sorted set是可排序的。
![cde826cddb813fa6af63bc85bde0d40a.png](https://i-blog.csdnimg.cn/blog_migrate/56ba7faea9ebd862908e6149e6127284.jpeg)
[Queue 相关的问题]
priority queue先进先出。
![7a5c0acc778cd67709abfe6d218336f4.png](https://i-blog.csdnimg.cn/blog_migrate/ac480053a9a882007a796fef7fb729c9.jpeg)
[Map相关的问题]
有hash map, linked hash map, tree map.
![7dca7e455ce444657011b62c061ca783.png](https://i-blog.csdnimg.cn/blog_migrate/4466245a5d325100ef37a0d4e808667c.jpeg)
[Tree相关的问题]
主要是二叉树, 搜索二叉树以及平衡二叉树。
二叉树是指只有左边和右边两个节点的结构。
搜索二叉树是指左边的节点永远比右边的节点小。
平衡二叉树是指左边的高度与右边的高度相差不超过1。
这是数据结构相关的问题。
![6a1cc52d9185a5e06733c02a04870191.png](https://i-blog.csdnimg.cn/blog_migrate/3390ae8bb56bfa6400cf5710650182b1.jpeg)
[final相关的问题]
final分别用在变量,类和方法上意味着什么。
final用在类上,这样的类无法被继承。
final用在变量上, 这样的变量无法被修改。
final用在方法上,这样的方法无法被overriding。
![3970fcdeece8f6ccd36ad76553485e65.png](https://i-blog.csdnimg.cn/blog_migrate/e272f1db2d7b97bacd2eea3ca8e99d37.jpeg)
[Exception相关的问题]
一共有几种exception?
out of index, io, illegal argument, etc.
他们的区别是什么?在什么时候用?
这样的exception很多。顾名思义,在对应的情况下使用对应的exception。
Runtime exception和compile exception有什么区别?
run time exception,是在运行过程中发生的exception。
compile exception,是指在程序编译的时候,报出来的exception。
![be01261e5e550733ead19376a7c81fe9.png](https://i-blog.csdnimg.cn/blog_migrate/4a42a2d635c426630354a94f2c32f0cf.jpeg)
[线程相关的问题]
什么是线程?
线程是进程的一个分支。
如何创建线程?
可以使用thread和 handler来创建线程。
如何在线程中间传输数据?
可以通过共享数据和线程变量。
解释一下yield, wait, notify, notifyAll, sleep
yield是把线程从运行状态,变为可运行状态。
wait是要求线程解锁并放弃运行状态,进入等待队列。
notify是用来从等待队列里面唤醒一个线程。
notifyAll是用来从等待队列里面唤醒所有线程。
sleep是暂停线程的执行。当前线程被唤醒后会进入可运行状态。
解释线程的生命状态。
线程的生命状态,新创建,可运行,正在运行,不可运行,终止。
如何实现线程的同步?线程同步有什么缺点?
通常使用synchronized 关键字来实现。缺点是降低了程序的执行效率。
Volatile是干什么用的?
这个关键字是用来在主内存上定义一个变量。而不是在线程的内存上。主要用来做数据的共享。
![4cb95de97316b05d9447d6db7b56062f.png](https://i-blog.csdnimg.cn/blog_migrate/15162e046dd493cf73e901da14bea9af.jpeg)
[序列化是怎么回事]
序列化是指把一个对象写入文件当中。反序列化是指从文件返回一个对象。
如何来做序列化和反序列化?
可以使用objectoutputstream写入和读取。
![43215ccd89be5aa19b164d357b7c88eb.png](https://i-blog.csdnimg.cn/blog_migrate/b0c830c96229dafbcd75276911617353.jpeg)
好了,这个问题先说这些,欢迎关注留言点赞,我们下次再见。