Java⾯试题⼤汇总(附答案)
下列⾯试题都是在⽹上收集的,本⼈抱着学习的态度了下参考答案,有不⾜的地⽅还请指正,更多精彩内容可以关注我的:Java团长
相关概念
⾯向对象的三个特征
封装,继承,多态.这个应该是⼈⼈皆知.有时候也会加上抽象.
多态的好处
允许不同类对象对同⼀消息做出响应,即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式(发送消息就是函数调⽤).主要有以下优点:
1. 可替换性:多态对已存在代码具有可替换性.
2. 可扩充性:增加新的⼦类不影响已经存在的类结构.
3. 接⼝性:多态是超类通过⽅法签名,向⼦类提供⼀个公共接⼝,由⼦类来完善或者重写它来实现的.
4. 灵活性.
程序设计语言基础淘师湾作业答案5. 简化性.
代码中如何实现多态
实现多态主要有以下三种⽅式:
1. 接⼝实现
2. 继承⽗类重写⽅法
3. 同⼀类中进⾏⽅法重载
虚拟机是如何实现多态的
动态绑定技术(dynamic binding),执⾏期间判断所引⽤对象的实际类型,根据实际类型调⽤对应的⽅法.
接⼝的意义
接⼝的意义⽤三个词就可以概括:规范,扩展,回调.
抽象类的意义
抽象类的意义可以⽤三句话来概括:
1. 为其他⼦类提供⼀个公共的类型
2. 封装⼦类中重复定义的内容
3. 定义抽象⽅法,⼦类虽然有不同的实现,但是定义时⼀致的
接⼝和抽象类的区别
⽐较抽象类接⼝
默认⽅法抽象类可以有默认的⽅法实现java 8之前,接⼝中不存在⽅法的实现.
实现⽅式⼦类使⽤extends关键字来继承抽象类.如果⼦类不是抽象类,⼦类需要提供抽
象类中所声明⽅法的实现.
⼦类使⽤implements来实现接⼝,需要提供接⼝中
所有声明的实现.
构造器抽象类中可以有构造器,接⼝中不能
和正常类
区别抽象类不能被实例化接⼝则是完全不同的类型
访问修饰
符
抽象⽅法可以有public,protected和default等修饰接⼝默认是public,不能使⽤其他修饰符多继承⼀个⼦类只能存在⼀个⽗类⼀个⼦类可以存在多个接⼝
添加新⽅法想抽象类中添加新⽅法,可以提供默认的实现,因此可以不修改⼦类现有的代码
如果往接⼝中添加新⽅法,则⼦类中需要实现该⽅
法.
法想抽象类中添加新⽅法,可以提供默认的实现,因此可以不修改⼦类现有的代码
法.
⽗类的静态⽅法能否被⼦类重写
不能.重写只适⽤于实例⽅法,不能⽤于静态⽅法,⽽⼦类当中含有和⽗类相同签名的静态⽅法,我们⼀般称之为隐藏.
什么是不可变对象
不可变对象指对象⼀旦被创建,状态就不能再改变。任何修改都会创建⼀个新的对象,如 String、Integer及其它包装类。
静态变量和实例变量的区别?
静态变量存储在⽅法区,属于类所有.实例变量存储在堆当中,其引⽤存在当前线程栈.
能否创建⼀个包含可变对象的不可变对象?
当然可以创建⼀个包含可变对象的不可变对象的,你只需要谨慎⼀点,不要共享可变对象的引⽤就可以了,如果需要变化时,就返回原对象的⼀个拷贝。最常见的例⼦就是对象中包含⼀个⽇期对象的引⽤.
java 创建对象的⼏种⽅式
1. 采⽤new
2. 通过反射
3. 采⽤clone
4. 通过序列化机制
前2者都需要显式地调⽤构造⽅法. 造成耦合性最⾼的恰好是第⼀种,因此你发现⽆论什么框架,只要涉及到解耦必先减少new的使⽤.
switch中能否使⽤string做参数
在idk 1.7之前,switch只能⽀持byte,short,char,int或者其对应的封装类以及Enum类型。从idk 1.7之后switch开始⽀持String.
switch能否作⽤在byte,long上?
可以⽤在byte上,但是不能⽤在long上.
String s1=”ab”,String s2=”a”+”b”,String s3=”a”,String s4=”b”,s5=s3+s4请问s5==s2返回什么?
返回false.在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=new String(“ab”);
你对String对象的intern()熟悉么?
intern()⽅法会⾸先从常量池中查是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回.
⽐如
String s1=”aa”;
sql数据库备份恢复String s2=s1.intern();
System.out.print(s1==s2);//返回true
Object中有哪些公共⽅法?
1. equals()
2. clone()java常见笔试题
3. getClass()
4. notify(),notifyAll(),wait()
5. toString
java当中的四种引⽤
强引⽤,软引⽤,弱引⽤,虚引⽤.不同的引⽤类型主要体现在GC上:
1. 强引⽤:如果⼀个对象具有强引⽤,它就不会被垃圾回收器回收。即使当前内存空间不⾜,JVM也不会回收它,⽽是抛出
OutOfMemoryError 错误,使程序异常终⽌。如果想中断强引⽤和某个对象之间的关联,可以显式地将引⽤赋值为null,这样⼀来的话,JVM在合适的时间就会回收该对象
2. 软引⽤:在使⽤软引⽤时,如果内存的空间⾜够,软引⽤就能继续被使⽤,⽽不会被垃圾回收器回收,只有在内存不⾜时,软引⽤才
会被垃圾回收器回收。
3. 弱引⽤:具有弱引⽤的对象拥有的⽣命周期更短暂。因为当 JVM 进⾏垃圾回收,⼀旦发现弱引⽤对象,⽆论当前内存空间是否充⾜,
都会将弱引⽤回收。不过由于垃圾回收器是⼀个优先级较低的线程,所以并不⼀定能迅速发现弱引⽤对象
4. 虚引⽤:顾名思义,就是形同虚设,如果⼀个对象仅持有虚引⽤,那么它相当于没有引⽤,在任何时候都可能被垃圾回收器回收。
更多了解参见深⼊对象引⽤:
blog.csdn/dd864140130/article/details/49885811
WeakReference与SoftReference的区别?
变量名词英文这点在四种引⽤类型中已经做了解释,这⾥简单说明⼀下即可:
虽然 WeakReference 与 SoftReference 都有利于提⾼ GC 和内存的效率,但是 WeakReference ,⼀
旦失去最后⼀个强引⽤,就会被 GC 回收,⽽软引⽤虽然不能阻⽌被回收,但是可以延迟到 JVM 内存不⾜的时候。
为什么要有不同的引⽤类型
不像C语⾔,我们可以控制内存的申请和释放,在Java中有时候我们需要适当的控制对象被回收的时机,因此就诞⽣了不同的引⽤类型,可以说不同的引⽤类型实则是对GC回收时机不可控的妥协.有以下⼏个使⽤场景可以充分的说明:
1. 利⽤软引⽤和弱引⽤解决OOM问题:⽤⼀个HashMap来保存图⽚的路径和相应图⽚对象关联的软引⽤之间的映射关系,在内存不⾜
时,JVM会⾃动回收这些缓存图⽚对象所占⽤的空间,从⽽有效地避免了OOM的问题.
2. 通过软引⽤实现Java对象的⾼速缓存:⽐如我们创建了⼀Person的类,如果每次需要查询⼀个⼈的信息,哪怕是⼏秒中之前刚刚查询过
的,都要重新构建⼀个实例,这将引起⼤量Person对象的消耗,并且由于这些对象的⽣命周期相对较短,会引起多次GC影响性能。此时,通过软引⽤和 HashMap 的结合可以构建⾼速缓存,提供性能.
java中==和eqauls()的区别,equals()和`hashcode的区别
borderbottom边框下划线==是运算符,⽤于⽐较两个变量是否相等,⽽equals是Object类的⽅法,⽤于⽐较两个对象是否相等.默认Object类的equals⽅法是⽐较两个对象的地址,此时和==的结果⼀样.换句话说:基本类型⽐较⽤==,⽐较的是他们的值.默认下,对象⽤==⽐较时,⽐较的是内存地址,如果需要⽐较对象内容,需要重写equal⽅法
equals()和hashcode()的联系
hashCode()是Object类的⼀个⽅法,返回⼀个哈希值.如果两个对象根据equal()⽅法⽐较相等,那么调⽤这两个对象中任意⼀个对象的hashCode()⽅法必须产⽣相同的哈希值.
如果两个对象根据eqaul()⽅法⽐较不相等,那么产⽣的哈希值不⼀定相等(碰撞的情况下还是会相等的.)
a.hashCode()有什么⽤?与a.equals(b)有什么关系
hashCode() ⽅法是相应对象整型的 hash 值。它常⽤于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与equals() ⽅法关系特别紧密。根据 Java 规范,使⽤ equal() ⽅法来判断两个相等的对象,必须具有相同的 hashcode。
将对象放⼊到集合中时,⾸先判断要放⼊对象的hashcode是否已经在集合中存在,不存在则直接放⼊集
合.如果hashcode相等,然后通过equal()⽅法判断要放⼊对象与集合中的任意对象是否相等:如果equal()判断不相等,直接将该元素放⼊集合中,否则不放⼊.
有没有可能两个不相等的对象有相同的hashcode
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。如果两个对象相等,必须有相同的hashcode 值,反之不成⽴.
可以在hashcode中使⽤随机数字吗?
西门子三相异步电动机型号不⾏,因为同⼀对象的 hashcode 值必须是相同的
a==b与a.equals(b)有什么区别
如果a 和b 都是对象,则 a==b 是⽐较两个对象的引⽤,只有当 a 和 b 指向的是堆中的同⼀个对象才会返回 true,⽽ a.equals(b) 是进⾏逻辑⽐较,所以通常需要重写该⽅法来提供逻辑⼀致性的⽐较。例如,String 类重写 equals() ⽅法,所以可以⽤于两个不同对象,但是包含的字母相同的⽐较。
3*0.1==0.3返回值是什么
false,因为有些浮点数不能完全精确的表⽰出来。
a=a+b与a+=b有什么区别吗?
+=操作符会进⾏隐式⾃动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,⽽a=a+b则不会⾃动进⾏类型转换.如:byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // ok
(译者注:这个地⽅应该表述的有误,其实⽆论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)
short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改?
有错误,short类型在进⾏运算时会⾃动提升为int类型,也就是说s1+1的运算结果是int类型.
short s1= 1; s1 += 1; 该段代码是否有错,有的话怎么改?
+=操作符会⾃动对右边的表达式结果强转匹配左边的数据类型,所以没错.
& 和 &&的区别
⾸先记住&是位操作,⽽&&是逻辑运算符.另外需要记住逻辑运算符具有短路特性,⽽&不具备短路特性.
public class Test{
static String name;
public static void main(String[] args){
if(name!=null&userName.equals("")){
System.out.println("ok");
}else{
System.out.println("erro");
}
}
}
以上代码将会抛出空指针异常.
⼀个.java⽂件内部可以有类?(⾮内部类)
只能有⼀个public公共类,但是可以有多个default修饰的类.
如何正确的退出多层嵌套循环.
1. 使⽤标号和break;
2. 通过在外层循环中添加标识符
内部类的作⽤
内部类可以有多个实例,每个实例都有⾃⼰的状态信息,并且与其他外围对象的信息相互独⽴.在单个外围类当中,可以让多个内部类以不同的⽅式实现同⼀接⼝,或者继承同⼀个类.创建内部类对象的时刻不依赖于外部类对象的创建.内部类并没有令⼈疑惑的”is-a”关系,它就像是⼀个独⽴的实体.
内部类提供了更好的封装,除了该外围类,其他类都不能访问
final,finalize和finally的不同之处
final 是⼀个修饰符,可以修饰变量、⽅法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize ⽅法是在对象被回收之前调⽤的⽅法,给对象⾃⼰最后⼀个复活的机会,但是什么时候调⽤ finalize 没有保证。finally 是⼀个关键字,与 try 和 catch ⼀起⽤于异常的处理。finally 块⼀定会被执⾏,⽆论在 try 块中是否有发⽣异常。
clone()是哪个类的⽅法?
java.lang.Cloneable 是⼀个标⽰性接⼝,不包含任何⽅法,clone ⽅法在 object 类中定义。并且需要知道 clone() ⽅法是⼀个本地⽅法,这意味着它是由 c 或 c++ 或其他本地语⾔实现的。
深拷贝和浅拷贝的区别是什么?
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,⽽所有的对其他对象的引⽤仍然指向原来的对象。换⾔之,浅拷贝仅仅复制所考虑的对象,⽽不复制它所引⽤的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,⽽那些引⽤其他对象的变量将指向被复制过的新对象,⽽不再是原有的那些被引⽤的对象。换⾔之,深拷贝把要复制的对象所引⽤的对象都复制了⼀遍。
static都有哪些⽤法?
⼏乎所有的⼈都知道static关键字这两个基本的⽤法:静态变量和静态⽅法.也就是被static所修饰的变量/⽅法都属于类的静态资源,类实例所共享.
除了静态变量和静态⽅法之外,static也⽤于静态块,多⽤于初始化操作:
public calss PreCache{
static{
//执⾏相关操作
}
}
此外static也多⽤于修饰内部类,此时称之为静态内部类.
最后⼀种⽤法就是静态导包,即import static.import static是在JDK 1.5之后引⼊的新特性,可以⽤来指定导⼊某个类中的静态资源,并且不需要使⽤类名.资源名,可以直接使⽤资源名,⽐如:
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));传统做法
System.out.println(sin(20));
}
}
final有哪些⽤法
final也是很多⾯试喜欢问的地⽅,能回答下以下三点就不错了:
1.被final修饰的类不可以被继承
2.被final修饰的⽅法不可以被重写
3.被final修饰的变量不可以被改变.如果修饰引⽤,那么表⽰引⽤不可变,引⽤指向的内容可变.
4.被final修饰的⽅法,JVM会尝试将其内联,以提⾼运⾏效率
5.被final修饰的常量,在编译阶段会存⼊常量池中.
回答出编译器对final域要遵守的两个重排序规则更好:
1.在构造函数内对⼀个final域的写⼊,与随后把这个被构造对象的引⽤赋值给⼀个引⽤变量,这两个操作之间不能重排序.
2.初次读⼀个包含final域的对象的引⽤,与随后初次读这个final域,这两个操作之间不能重排序.
数据类型相关
java中int char,long各占多少字节?
类型位数字节数
short216
int432
long864
float432
double864
char216
64位的JVM当中,int的长度是多少?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论