一、
问题:
Java支持的数据类型有哪些?什么是自动拆装箱?
答案:
Java语言支持的8种基本数据类型是
自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。
比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。
二、
问题:
数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?
答案:
区别:
1、Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
2、Array大小是固定的,ArrayList的大小是动态变化的。
3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
什么时候应该使用Array而不是ArrayList:
对于基本类型数据,集合使用自动装箱来减少编码工作量。
但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
三、
问题:
什么是值传递和引用传递?
答案:
值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
所以对引用对象进行操作会同时改变原对象。
一般认为,java内的传递都是值传递。
四、
问题:
为什么会出现4.0-3.6=0.40000001这种现象?
答案:
二进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。
五、
问题:
符号“==”比较的是什么?
答案:
“==”对比两个对象基于内存引用,如果两个对象的引用完全相同(指向同一个对象)时,“==”操作将返回true,否则返回false。
“==”如果两边是基本类型,就是比较数值是否相等。
六、
问题:
Java里面的final关键字怎么用?
答案:
当用final修饰一个类时,表明这个类不能被继承。如果一个类你永远不会让他被继承,就可以用final进行修饰。
注意:final类中的所有成员方法都会被隐式地指定为final方法
final修饰一个变量时,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
七、
问题:
JDK和JRE的区别是什么?
答案:
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。
如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。
JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
八、
问题:
接口和抽象类有什么区别?
答案:
1.接口中所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法;
2.Java接口中声明的变量默认都是final的,抽象类可以包含非final的变量;
3.Java接口中的成员函数默认是public的,抽象类的成员函数可以是private,protected或者是public;
4.类可以实现很多个接口,但是只能继承一个抽象类
九、
问题:
与、或、异或运算的运算规则是什么?请举例说明
答案:
1.与运算(&)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:两位同时为“1”,结果才为“1”,否则为0
例如:
3
2.或运算(|)
参加运算的两个对象,按二进制位进行“或”运算。
运算规则:参加运算的两个对象只要有一个为1,其值为1。
例如:
3
3.异或运算(^)
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。即:相同为 0, 不同为 1
例如:
3
十、
问题:
Servlet 是什么?
答案:
Servlet是用来处理客户端请求并产生动态网页内容的Java类。
Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。
十一、
问题:
java 中遍历数组有几种方式?
答案:
1、普通 for 循环
例如:
int
2、foreach 循环
例如:
for
3、利用Array类中的toString方法
调用Array.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,并用逗号分开
例如:
System
十二、
问题:
Java中,什么是构造方法?什么是构造方法重载?
答案:
构造方法:
1、构造方法的名字和类名相同;
2、构造方法没有返回值;
3、构造方法可以创建多个,但是构造方法必须有它自己唯一的参数列表。
构造方法重载:
构造方法重载与普通方法重载相同;
在Java中,Java会同时根据方法名和参数列表来决定所要调用的方法,这叫做方法重载。
十三、
问题:
Java支持多继承么?
答案:
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。
但是java中的接口支持多继承,,即一个子接口可以有多个父接口。
接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能
十四、
问题:
什么是进程和线程?进程和线程的区别是什么?
答案:
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
线程与进程的区别:
1.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3.调度和切换:线程上下文切换比进程上下文切换要快得多。
4.在多线程OS中,进程不是一个可执行的实体。
十五、
问题:
创建线程有几种不同的方式?
答案:
创建线程的方式:
1. 继承 Thread 类;
2. 实现 Runnable 接口;
3. 实现Callable接口;
4. 应用程序可以使用Executor框架来创建线程池。
十六、
问题:
什么是迭代器(Iterator)?
答案:
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的
迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的
remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
十七、
问题:
JAVA 中什么是死锁?它产生的必要条件?
答案:
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
四个必要条件:
1. 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2. 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
3. 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4. 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。
十八、
问题:
如何确保多个线程可以访问多个资源同时又不导致死锁?
答案:
使用多线程时避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
十九、
问题:
Java集合类框架的基本接口有哪些?
答案:
集合类接口指定了一组叫做元素的对象。
集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。
Java集合类框架的基本接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。
二十、
问题:
Iterator和ListIterator的区别是什么?
答案:
1、Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2、Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
3、ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
二十一、
问题:
Java中的HashMap的工作原理是什么?
答案:
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
二十二、
问题:
hashCode()和equals()方法的重要性体现在什么地方?
答案:
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
二十三、
问题:
什么是JVM?JVM结构?
答案:
JVM是Java Virtual Machine的缩写。它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机。
JVM主要包括:程序计数器(Program Counter),Java堆(Heap),Java虚拟机栈(Stack),本地方法栈(Native Stack),方法区(Method Area)
二十四、
问题:
javac 命令和java 命令是用来做什么的?
答案:
javac:是用来编译 java 文件的,当执行javac时,会启动java的编译器程序。对指定扩展名的.java文件进行编译。 生成了jvm可以识别的字节码文件。也就是class文件或者说是java的运行程序。
java:是用来运行文件的,会启动jvm。加载运行时所需的类库,并对class文件进行执行。
二十五、
问题:
Java 修饰符主要分为几类?它的作用?
答案:
两类:
1. 访问修饰符
2. 非访问修饰符
修饰符用来定义类、方法或者变量,通常放在语句的最前端
二十六、
问题:
访问修饰符与非访问修饰符?
答案:
访问修饰符:
1. default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
2. private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
3. public : 对所有类可见。使用对象:类、接口、变量、方法
4. protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
注意:
1. 父类中声明为 public 的方法在子类中也必须为 public。
2. 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
3. 父类中声明为 private 的方法,不能够被继承。
非访问修饰符:
1. static 修饰符,用来修饰类方法和类变量。
2. final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
3. abstract 修饰符,用来创建抽象类和抽象方法。
4. synchronized 和 volatile 修饰符,主要用于线程的编程。
二十七、
问题:
Java的占位符有哪些?
答案:
Java的格式化功能提供了多种占位符,可以把各种数据类型“格式化”成指定的字符串:
1. %d:格式化输出整数;
2. %x:格式化输出十六进制整数;
3. %f:格式化输出浮点数
4. %e:格式化输出科学计数法表示的浮点数
5. %s:格式化字符串
注意:由于%表示占位符,因此,连续两个%%表示一个%字符本身。
二十八、
问题:
什么是 Java 多态?
答案:
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性是对象多种表现形式的体现。
比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。
接下来让我们通过实例来了解Java的多态。
二十九、
问题:
++i 与 i++ 的区别是什么?
答案:
++写在前面和后面计算结果是不同的,++i 表示先加 1 再引用 i,i++ 表示先引用 i 再加 1。
在常规运算中不建议把 ++ 混入,因为容易自己把自己搞混。
三十、
问题:
int
输出的结果是什么?
答案:
a
<< 或者 >> 表示的是移位运算,在计算机中,整数总是以二进制的形式表示的。
7
所以,
n
原文作者 | 小强很强
原文平台 | 知乎
原文链接 | 小强很强:JAVA 30 道面试题,算法为主面试题