javanew⼀个list集合⾥⾯放对象_超详细的Java⾯试题汇总
(基础篇+框架篇)
Java⾯试题汇总-基础篇
1.⾯向对象是什么?
答:⾯向对象是⼀种思想,世间万物都可以看做⼀个对象,这⾥只讨论⾯向对象编程(OOP),Java是⼀个⽀持并发、基于类和⾯向对象的计
算机编程语⾔,⾯向对象软件开发的优点:代码开发模块化,更易维护和修改;代码复⽤性强;增强代码的可靠性和灵活性;增加代码的可
读性。
2、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)
和枚举类型(enumeration type),剩下的都是引⽤类型(reference type)。
3、float f=3.4;是否正确?
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要
强制类型转换float f =(float)3.4; 或者写成float f =3.4F;。
4、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答:对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。⽽short
s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
5、⼀个".java"源⽂件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以有多个类,但只能有⼀个public的类,并且public的类名必须与⽂件名相⼀致。
6、Java有没有goto?
答:java中的保留字,现在没有在java中使⽤。
7、int和Integer有什么区别?
答:Java是⼀个近乎纯洁的⾯向对象编程语⾔,但是为了编程的⽅便还是引⼊了基本数据类型,但是为了能够将这些基本数据类型当成对象
操作,Java为每⼀个基本数据类型都引⼊了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引⼊了⾃动装箱/拆
箱机制,使得⼆者可以相互转换。
public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; // 将3⾃动装箱成Integer类型 int c = 3; System.out.println(a == b); // false 两个引⽤没还有⼀个⾯试题,也是和⾃动装箱和拆箱有点关系的,代码如下所⽰:
public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2); System.out.println(f3 == f4); }
如果不明就⾥很容易认为两个输出要么都是true要么都是false。⾸先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引⽤,所以
下⾯的==运算⽐较的不是值⽽是引⽤。装箱的本质是什么呢?当我们给⼀个Integer对象赋⼀个int值的时候,会调⽤Integer类的静态⽅法valueOf,代码如下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) { return IntegerCache.cache[i + (-IntegerCache.low)]; return new In
简单的说,如果整型字⾯量的值在-128到127之间,那么不会new新的Integer对象,⽽是直接引⽤常量池中的Integer对象,所以上⾯的
⾯试题中f1==f2的结果是true,⽽f3==f4的结果是false。
8、解释内存中的栈(stack)、堆(heap)和静态区(static area)的⽤法。
栈空间操作起来最快但是栈很⼩,通常⼤量的对象都是放在堆空间
String str = new String("hello");
上⾯的语句中变量str放在栈上,⽤new创建出来的字符串对象放在堆上,⽽”hello”这个字⾯量放在静态区。
9、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
10、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满⾜x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls⽅法和hashCode⽅法是这样规定的:(1)如果两个对象相同(equals⽅法返回true),那么它们的hashCode值⼀定要相同;(2)如果两个对象的hashCode相同,它们并不⼀定相同
11、是否可以继承String类?
答:String 类是final类,不可以被继承。
12、当⼀个对象被当作参数传递到⼀个⽅法后,此⽅法可改变这个对象的属性,并可返回变化后的结果,那么这⾥到底是值传递还是引⽤传递?
答:是值传递。Java语⾔的⽅法调⽤只⽀持参数的值传递。当⼀个对象实例作为⼀个参数被传递到⽅法中时,参数的值就是对该对象的引⽤。对象的属性可以在被调⽤过程中被改变,但对对象引⽤的改变是不会影响到调⽤者的。
13、und(11.5) 等于多少?und(-11.5)等于多少?
答:und(11.5)的返回值是12,und(-11.5)的返回值是-11。四舍五⼊的原理是在参数上加0.5然后进⾏下取整。
14、switch 是否能作⽤在byte 上,是否能作⽤在long 上,是否能作⽤在String上?
答:expr可以是byte、short、char、int、enum、String类型,但是long类型不能。
15、⽤最有效率的⽅法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次⽅,右移3位相当于除以2的3次⽅)。
16、数组有没有length()⽅法?String有没有length()⽅法?
答:数组没有length()⽅法,有length 的属性。String 有length()⽅法。JavaScript中,获得字符串的长度是通过length属性得到的,这⼀点容易和Java混淆。
17、char型变量中能不能存贮⼀个中⽂汉字?为什么?
可以存储,因为java中使⽤的编码是Unicode编码,⼀个char类型占2个字节(16bit),放⼀个中⽂汉字是没有问题的。
Unicode编码:不选择任何特定的编码,直接使⽤字符在字符集中的编码,这是统⼀的唯⼀⽅法。
18、⽤最有效率的⽅法算出2乘以8等於⼏?
2 << 3,因为将⼀个数左移n位,就相当于乘以了2的n次⽅,那么,⼀个数乘以8只要将其左移3位即可,⽽位运算cpu直接⽀持的,效率最⾼,所以,2乘以8等於⼏的最效率的⽅法是2 << 3。
19、使⽤final关键字修饰⼀个变量时,是引⽤不能变,还是引⽤的对象不能变?
使⽤final关键字修饰⼀个变量时,是指引⽤变量不能变,引⽤变量所指向的对象中的内容还是可以改变的。
20、重载(Overloading)和重写(Override)的区别
重载(Overloading):多个同名函数同时存在,参数类型和参数个数不通,返回值类型可同可不同,统⼀⽅式处理不同类型的数据。这也是java特性中多态性的⼀种体现,⼀个类中的多态性。
重写(Override):⼦类中重新⽗类的⽅法,也叫做⽅法覆盖,⽅法名与⽗类相同,参数返回类型相同,⼦类的修饰权限不能够低于⽗类不同类之间多态的体现。
21、"=="和equals的区别
“==”: ⽐较变量值是否相等(数值) 相当于⽐较的是地址
“equals”: 两个独⽴对象的内容是否相同 ⽐较的是内容
22、静态变量和实例变量的区别
静态变量:静态变量也叫做类变量,static修饰,在类中,为类所有,只要程序加载啦字节码⽂件,不⽤创建实例对象就会⾃动的为静态变量分配内存空间。所有对象共有,其中⼀个对象将其值改变,其他对象得到的就是改变后的结果。
实例变量:new了对象之后,才会分配内存空间。当前对象私有,改变其值,不会影响其他对象。
23、是否可以从⼀个static⽅法内部发出对⾮static⽅法的调⽤?
答:不可以。因为static⽅法的调⽤可以直接通过类名.⽅法名()调⽤,不⽤创建对象。⽽⾮static⽅法要与对象关联在⼀起的,必须要创建对象之后才可以在该对象上进⾏⽅法的调⽤,所以是不可以的。
24、多线程有⼏种实现⽅法?同步有⼏种实现⽅法?
多线程有两种实现⽅法:继承Thread类与实现Runnable接⼝
同步的实现⽅⾯有两种:synchronized,wait与notify
wait():使⼀个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使⼀个正在运⾏的线程处于睡眠状态,是⼀个静态⽅法,调⽤此⽅法要捕捉InterruptedException异常。
notify():唤醒⼀个处于等待状态的线程,注意的是在调⽤此⽅法的时候,并不能确切的唤醒某⼀个等待状态的线程,⽽是由JVM确定唤醒哪个线程,⽽且不是按优先级。
Allnotity():唤醒所有处⼊等待状态的线程,注意并不是给所有唤醒线程⼀个对象的锁,⽽是让它们竞争。
25、启动⼀个线程是⽤run()还是start()?
启动⼀个线程是调⽤start()⽅法,使线程就绪状态,以后可以被调度为运⾏状态,⼀个线程必须关联⼀些具体的执⾏代码,run()⽅法是该线程所关联的执⾏代码。
26、List 、Map、Set区别?
List:存储单列数据的集合,数据有序,并且允许重复。
Map:数据⽆序,键值集合,键不可以重复,值是可以重复的。
Set:数据⽆序,⽆重复对象。
27、Collection 和 Collections的区别?
Collection:集合类的上级接⼝,继承与他的接⼝主要有Set 和List.
Collections:针对集合类的⼀个帮助类,提供了⼀系列静态⽅法实现对各种集合的搜索、排序、线程安全化等操作。
28、当⼀个线程进⼊⼀个对象的synchronized⽅法A之后,其它线程是否可进⼊此对象的synchronized⽅法B?
答:不能。其它线程只能访问该对象的⾮同步⽅法,同步⽅法则不能进⼊。因为⾮静态⽅法上的synchronized修饰符要求执⾏⽅法时要获得对象的锁,如果已经进⼊A⽅法说明对象锁已经被取⾛,那么试图进⼊B⽅法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
29.如果两个键的hashcode相同,你如何获取值对象?
答:当我们调⽤get()⽅法,HashMap会使⽤键对象的hashcode到bucket位置,然后会调⽤keys.equals()⽅法去到链表中正确的节点,最终到要的值对象。
30、GC是什么?为什么要有GC?
答:GC是垃圾收集的意思,垃圾回收可以有效的防⽌内存泄露,有效的使⽤可以使⽤的内存。
31、Java 中 bytes 与其他类型的转换?
public class Test {  private static ByteBuffer buffer = ByteBuffer.allocate(8);  public static void main(String[] args) {  //测试 int 转 byte  int int0 = 234;  byte byte0 = in 32、⽤ wait-notify 写⼀段代码来解决⽣产者-消费者问题?
在同步块中调⽤ wait() 和 notify()⽅法,如果阻塞,通过循环来测试等待条件。请参考答案中的⽰例代码。
【⽣产者】
package com.st; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; public class Producer implements R
【消费者】
package com.st; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; public class Consumer implements
【测试函数】
package com.st; import java.util.Vector; public class ProducerConsumerSolution {  public static void main(String[] args) {  Vector sharedQ
33、 ⽤ Java 写⼀个线程安全的单例模式(Singleton)?
当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使⽤枚举作为单例类是最简单的⽅式来创建
线程安全单例模式的⽅式。请参考答案中的⽰例代码,这⾥⾯⼀步⼀步教你创建⼀个线程安全的 Java 单例类。
⽴即加载/饿汉式:
【在调⽤⽅法前,实例就已经被创建】
package com.weishiyao.learn.day8.singleton.ep1;public class MyObject { // ⽴即加载⽅式==恶汉模式 private static MyObject myObject = new MyObject(); private M 【创建线程类】
package com.weishiyao.learn.day8.singleton.ep1;public class MyThread extends Thread { @Override public void run() { System.out.In
【创建运⾏类】
package com.weishiyao.learn.day8.singleton.ep1;public class Run { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 =
延迟加载/懒汉式:
java重写和重载的区别【建对象的实例】
package com.weishiyao.learn.day8.singleton.ep2;public class MyObject { private static MyObject myObject; private MyObject() { } public static MyObject ge
【创建线程类】
package com.weishiyao.learn.day8.singleton.ep2;public class MyThread extends Thread { @Override public void run() { System.out.In
【创建运⾏类】
package com.weishiyao.learn.day8.singleton.ep2;public class Run { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); }}【运⾏测试类】
package com.weishiyao.learn.day8.singleton.ep2;public class Run { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = java⾯试题汇总-框架篇
⼀、Spring⾯试题
1、Spring下的注解?
注册:@Controller @Service @Component
注⼊:@Autowired @Resource
请求地址:@RequestMapping
返回具体数据类型⽽⾮跳转:@ResponseBody
2、Spring DI 的三种⽅式?
构造器注⼊:通过构造⽅法初始化
setter⽅法注⼊:通过setter⽅法初始化
接⼝注⼊
3、Spring主要使⽤了什么模式?
⼯⼚模式:每个Bean的创建通过⽅法
单例模式:默认的每个Bean的作⽤域都是单例
代理模式:关于Aop的实现通过代理模式
4、Spring 在ssm中起什么作⽤?
Spring:轻量级框架
作⽤:Bean⼯⼚,⽤来管理Bean的⽣命周期和框架集成。
两⼤核⼼:
①. IOC/DI(控制反转/依赖注⼊) :把dao依赖注⼊到service层,service层反转给action层,Spring顶层容器为BeanFactory。
②. AOP:⾯向切⾯编程
5、Spring的事务?
编程式事务管理:编程⽅式管理事务,极⼤灵活性,难维护。
声明式事务管理:可以将业务代码和事务管理分离,⽤注解和xml配置来管理事务。
6、IOC,AOP的实现原理?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。