JAVA面试题
- 1. Java的"一次编写,处处运行"如何实现?
- 2. 描述JVM运行原理
- 3. 为什么Java没有全局变量
- 4.说明一下public static void main(String[] args)这段声明里每个关键字的作用
- 5. Java是否存在内存泄漏
- 6. ==与equals的区别
- 7. Java中几种类型的流
- 8. 如何让用java代码列出一个目录下的所有文件夹
- 9. &和&&的区别
- 10. 构造器(constructor)是否可被重写(override),其规范是什么
- 11. JAVA 的反射机制的原理。
- 12. 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
- 14. 什么是值传递和引用传递?
- 15. Java的访问修饰符是什么?.
- 16. Java基础数据类型有哪些?
- 17. hashCode()和 equals)方法的重要性体现在什么地方?
- 18. switch 中用于判断的表达式,可以用哪些数据类型?
- 19. char型变量中能不能存贮一个中文汉字?为什么?。
- 20.静态变量和实例变量的区别?.
- 21.是否可以从-个static方法内部发出对非static方法的调用?.
- 22. Integer 与int的区别?
- 23. Overload和Override的区别。参数列表相同,返回值不同的方法,是否是重载方法?.
- 24.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?。
- 25.面向对象有哪三三大特性?.
- 26. abstract class和interface有什么区别?
- 27. 如何理解Java中的Serialization和Deserialization。
- 28. String 是最基本的数据类型吗?
- 29. 如何实现字符串的反转及替换。。
- 30. String s = new String("xyz");创建了几个字符串对象。
- 31. String 和StringBuffer,StringBuilder的区别。
- 32.数组有没有length()这个方法? String有没有length()这个方法?
- 33. final, finally, finalize 的区别。
- 34. Errror , Exception,RuntimeException区别。
- 35. Java 语言如何进行异常处理,关键字: throws、throw、 try、 catch、 finally 分别如何使用。
- 36. throw和throws有什么区别?
- 37. 请说一下你常用的几种异常?
- 38.线程的基本概念?线程的基本状态以及状态之间的关系。
- 39. sleep() 和wait() 有什么区别?
- 40.多线程有几种实现方法?
- 41.启动一个线程是用run()还是start()?
- 42.线程的基本状态以及状态之间的关系。
- 43.Set和List的区别,List和Map的区别?
- 45. 描述Java锁机制。
- 46. Comparable 和Comparator接口是干什么的?列出它们的区别.
- 47. Java集合类框架的最佳买践有哪些?
- 48. HashMap和Hashtable的区别。
- 49. HashSet和TreeSet有什么区别?.
- 50.说出ArrayList,Vector, LinkedList的存储性能和特性。
1. Java的"一次编写,处处运行"如何实现?
Java在每个平台上都有Java虚拟机(JVM:JDK安装后里面的),中间编译文件class是由Java虚拟机在运行时动态转换为对应平台的机器代码
2. 描述JVM运行原理
Java平台由java虚拟机和java应用程序接口搭建java语言则是进入这个平台的通道,用java语言编写并编译的程序可以运行在这个平台上
结构:
运行期环境代表java平台开发人员编写java代码(.java文件),然后编译成字节码(.class文件),然后字节码装入内存,然后进入虚拟机,被解释器解释执行.
3. 为什么Java没有全局变量
- 破坏了引用的透明性
- 制造了命名空间冲突
可以使用properties类将想要全局有效的变量值写在这里,在何处用时都从这个文件夹中读取这个变量的值就可以了
4.说明一下public static void main(String[] args)这段声明里每个关键字的作用
Public: 是一个访问权限(访问修饰符)公共
static: 修饰的成员称为类成员或静态成员
void : 当方法定义使用时,表示没有返回值
String: 类来创建和操作字符串
5. Java是否存在内存泄漏
通俗的讲,创建对象后直不再使用,却一直被引用,即无用的对象无法被垃圾回收机制回收,这就是内存泄漏
一定要让程序各种分支情况都完整执行到程序结束,然后看某个对象是是否被使用过,如果没有,才能判断这个对象属于内存泄漏.
6. ==与equals的区别
== :除了比较基本数据外都是比较的内存地址
equals:都是比较内容的
7. Java中几种类型的流
1.字节流 2.字符流
分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个)
InputStream,OutputStream,Reader,Writer
8. 如何让用java代码列出一个目录下的所有文件夹
File f = new File("/Users/XXX/Downloads");
for (File temp : f.listFiles()) {
if (temp.isFile()) {
System.out.println(temp.getName());
}
}
9. &和&&的区别
- & 和 &&都可以作为逻辑与的运算符,
- 开发过程中用到&&的几率大,因为&&具有短路功能,
- &同时也是位运算符,就是我们通常所说的按位与运算,当&两边都是Boolean表达式或值时,就执行按位与运算
10. 构造器(constructor)是否可被重写(override),其规范是什么
构造器不能被继承,因此不能重写,但可以重载.
每一个类必须有自己的构造函数,负责构造自己这部分构造,子类不会覆盖父类构造函数,相反必须负责在一开始调用父类的构造函数
11. JAVA 的反射机制的原理。
JAVA反射机制是在运行状态中,对于任意一- 个类,都能够知道这个类的所有属性和方法;对于任意-一个对象,都能够调用它的任意-一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
主要提供了以下功能:
- 在运 行时判断任意一个对象所属的类;
- 在运行时构造任意-一个类的对象;
- 在运行时判断任意–个类所具有的成员变量和方法
- 在运行时调用任意-一个对象的方法;
- 生成动态代理。
12. 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
内部类是类中类(内部类不为同一包的其他类可见,具有很好的封装性),分为1.静态内部类,2.成员内部类,3.局部内部类以及4.匿名内部类;局部内部类写在方法里面;用到最多的就是匿名内部类。
- 静态的内部类称为嵌套类,嵌套类不能直接引用外部类的non-static属性和方法,创建嵌套类对象时不依赖外部类对象;
- 静态内部类没有了指向外部的引用,
- 在任何非静态内部类中,都不能有静态数据、静态方法或者又一个静态内部类(也就是不止一-层),然后静态内部类可以拥有这一-切。
14. 什么是值传递和引用传递?
对象被值传递,意味着传递了对象的-一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。
对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。
15. Java的访问修饰符是什么?.
在Java编程语言中有四种权限访问控制符,这四种访问权限的控制符能够控制类中成员的可见性。
- public是公共的,被public所修饰的成员可以在任何类中都能被访问到。
- protected 是受保护的,受到该类所在的包所保护。
- friendly是友好的,即在成员的前面不写任何的访问修饰符的时候,
- private是私有的,即只能在当前类中被访问到,它的作用域最小。
16. Java基础数据类型有哪些?
1.byte(字节)2. shot(短整型) 3.int(整型) 4.long(长整型) 5.float(浮点型) 6.double(双精度)7.char(字符型)8.boolean(布尔型)。
17. hashCode()和 equals)方法的重要性体现在什么地方?
确定键值对的索引,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap 的精确性和正确性是至关重要的
18. switch 中用于判断的表达式,可以用哪些数据类型?
- int 2.char. 3.byte 4. short 5.枚举 6. String: PS:对JDK版本有要求,必须为1.7及以上版本.
19. char型变量中能不能存贮一个中文汉字?为什么?。
Java里采用了Unicode编码格式,Unicode编码中-一个char型占用2个字节,而一个汉字也是占用2个字节,所以可以存储中文汉字。
20.静态变量和实例变量的区别?.
在语法定义. 上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时 的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,不用创建任何实例对
21.是否可以从-个static方法内部发出对非static方法的调用?.
不可以。因为非static 方法必须创建-一个对象后,才可以在该对象上进行方法调用, 而static方法调用时不需要创建对象,可以直接调用。 也就是说,当一个static 方法被调用时,可能还没有创建任何实例对象,如果从一一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,- - 个static 方法内部发出对非static方法的调用。。
22. Integer 与int的区别?
1、int是基本数据类型,Integer 是包装类;。
2、int 的默认值是0,Interger 的默认值是null;
23. Overload和Override的区别。参数列表相同,返回值不同的方法,是否是重载方法?.
- Overload是重载的意思,Override是覆盖的意思,也就是重写。。重载是指在一一个类里,方法名相同,参数不同;重写是指子类继承父类,子类里重新编写了父类中的同名(同参数)方法,也就是覆盖了父类的方法;.
- 不是!因为重载必须要求参数列表不同!。
24.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?。
接口可以继承多个接口。抽象类可以实现(implements)接口,抽象类是可继承具体类。
只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。
25.面向对象有哪三三大特性?.
1、面向对象有三大特性,分别是:封装、继承和多态。
26. abstract class和interface有什么区别?
- 抽象类里面可以用普通方法,而接口中的方法全部都是抽象的;。
- 在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各模块协同工作;抽象类是对相似类进行抽象,形成- -个抽象的父类可供重用!.
27. 如何理解Java中的Serialization和Deserialization。
串行化(serialization)是指将一个 对象的当前状态转换成字节流(a stream of bytes)的过程,
而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成-一个对象,打回原形。
28. String 是最基本的数据类型吗?
- String是个类,不是基本数据类型;
- 基本数据类型包括byte、int、 char、 long、 float、 double、 boolean 和short。
29. 如何实现字符串的反转及替换。。
- 通过jdk自带reverse的方法.
注: String 类本身没有反转类,需要包装成Stringbuiler或者是StringBuffer类。. - 通过自己写循环。
利用String.toCharArray0方法, 将String转成一个char型数组,然后用数组遍历的方式从后向前遍历。
30. String s = new String(“xyz”);创建了几个字符串对象。
两个(一个是“xyz”,一个是指向“xyz”的引用对象s)
一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new String(String)创建并初始化的、内容与"xyz"相同的实例
在String的工作原理中,已经提到了,new 一个String对象,是需要先在字符串常量中查找相同值或创建一个字符串常量,然后再在内存中创建一个String对象,所以 String str = new String(“xyz”); 会创建两个对象。
31. String 和StringBuffer,StringBuilder的区别。
1、String 是个不可变长度的字符串,而StringButfer是个可变长度的字符串;。
2、在对String 类进行操作的时候(例如追加字符),实际上是在内存中产生了一个新的String 对象;而StringBuffer是给原对象增加字符,不是新创建一- 个对象;。
32.数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这 个方法,有length 的属性。String 有length()这个方法。。
33. final, finally, finalize 的区别。
Itfinal用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。。
finally是异常处理语句结构的一部分, 表示总是执行。。
finalize是Object 类的一一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾
收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
34. Errror , Exception,RuntimeException区别。
- Error ( 错误)表示系统级的错误和程序不必处理的异常,是java 运行环境中的内部错误或者硬件问题。比如:内运行时异常
- Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
- Exception又分为运行时异常,受检查异常。
- 运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。
- 受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理)
- Exception体系包括RuntimeException(运行时异常)体系和其他非RuntimeException(非运行时异常)的体系:
- ①RuntimeException: RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等
- ②其他非RuntimeException (IOException 等等) :这类异常- -般是外部错误,例如试图从文件尾后读取数据等,
35. Java 语言如何进行异常处理,关键字: throws、throw、 try、 catch、 finally 分别如何使用。
- throws是获取异常:
- throw是抛出异常:
- try是将会发生异常的语句括起来,从而进行异常的处理,
- catch是如果有异常就会执行他里面的语句,
- 而finally不论是否有异常都会进行执行的语句。
36. throw和throws有什么区别?
throws是用来声明一个方法可能抛出的所有异常信息,
throw则是指抛出的-一个具体的异常类型。
37. 请说一下你常用的几种异常?
- 空指针异常;
- 数组下标越界;
- 类型转换异常;
- 算数异常,例如除数为零;
- I0异常,比如说找不到文件;
- 找不到类异常;
- sql异常,例如sql语句不能正常运行;
38.线程的基本概念?线程的基本状态以及状态之间的关系。
- 线程是程序执行流的最小单元。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
- 开始时:就绪状态,等待cpu 调用后进入运行状态,运行过程中遇到阻塞事件,进入阻塞状态,等待阻塞事件
- 结束后,重新进入就绪状态;如果没有阻塞事件,运行结束后,则进入结束状态。
39. sleep() 和wait() 有什么区别?
sleep就是暂停当前线程一段时间,把cpu让给其他线程使用,到时后会自动恢复。调用sleep不会释放对象锁。wait 方法导致本线程放弃对象锁,进入等待,只有等到本对象的notify方法(或notifyAll)后本线程才进入就绪状态,等待执行。
40.多线程有几种实现方法?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口。
41.启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,-一个线程必须关联一-些具体的执行代码,run(方法是该线程所关联的执行代码。
42.线程的基本状态以及状态之间的关系。
-
新建状态(New) :新创建了一个线程对象。
-
就绪状态(Runnable) :也叫可运行状态。线程对象创建后,其他线程调用了该对象的start()方法。 该状态的
线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。↓ -
运行状态(Running) :就绪状态的线程获取了CPU,执行程序代码。
-
阻塞状态(Blocked) :阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状
态,才有机会转到运行状态。阻塞的情况分三种:- 等待阻塞:运行的线程执行waitO方法,JVM会把该线程放入等待池中。↓
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。。
- 其他阻塞:运行的线程执行sleep(或 join0方法,或者发出了I/O 请求时,JVM会把该线程置为阻塞状态。当
sleep0状态超时、join0等 待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。:
-
死亡状态(Dead) :线程执行完了或者因异常退出了run(方法,该线程结束生命周期。。
43.Set和List的区别,List和Map的区别?
- Set是无序的,元素不可重复; List是有序的,元素可以重复;.
- List 存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的) ;。
45. 描述Java锁机制。
java中所说的锁就是指的内置锁,每个java对象都可以作为–个实现同步的锁,虽然说在java中-一切皆对象,但
是锁必须是引用类型的,基本数据类型则不可以。每一个引用类型的对象都可以隐式的扮演一个用于同步的锁的
角色,执行线程进入synchronized块之前会自动获得锁,无论是通过正常语句退出还是执行过程中抛出了异常,线
程都会在放弃对synchronized块的控制时自动释放锁。获得锁的唯一途径就是进入这个内部锁保护的同步块或方
46. Comparable 和Comparator接口是干什么的?列出它们的区别.
Comparable相当于“内部比较器”,自动使用.而Comparator相当于“外部比较器”,手动使用
47. Java集合类框架的最佳买践有哪些?
根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知
道,我们就应该用Array而不是ArrayList。。
有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新
计算hash值或者是扩容。
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的
ClassCastException。
使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode(和equalsQ方法。 **
编程的时候接口优于实现**。
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。
48. HashMap和Hashtable的区别。
- HashMap和Hashtable都完成了Map接口;。
- HashMap非线程安全的,而Hashtable是线程安全的,原因是Hashtable里面的方法使用Synchronize关键字修
饰的; - 因为Hashtable使用了Synchronize 关键字修饰,其性能比较差; ( 具体原因不做详细说明)。
49. HashSet和TreeSet有什么区别?.
相同点:
- 单列存储
- 元素不可重复
不同点:
- 底层数据结构不同(HashSet== =哈希表结构TreeSet====叉 树结构) 。
- 数据唯- -性依据不同( HashSet通过重写hashcode和equals
TreeSet通过compareable接口)。 - 有序性不同,HashSet 无序,TreeSet 有序。
50.说出ArrayList,Vector, LinkedList的存储性能和特性。
- ArrayList 和LinkedList都完成了List接口;
- ArrayList 底层是用数组实现的,而LinkedList使用链表实现的;
- ArrayList 在插入、删除时,需要移动数组元素,故性能较差;但是在查询时,因为是连续的数组,所以查询速度快; LinkedList 正好相反。。