java常见面试题(不定时更新)

1.Math类中提供了三个与取整有关的方法:ceil、floor、round

2.float f=3.4;是否正确?

3.int和Integer有什么区别

4.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么

5.数组有没有length()方法?String有没有length()方法

6.构造器(constructor)是否可被重写(override)?

7.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

8.是否可以继承String类?

9.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

10.String和StringBuilder、StringBuffer的区别?

11.描述一下JVM加载class文件的原理机制

12.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同

13.Java 中会存在内存泄漏吗,请简单描述

14.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

15.Java 内存模型的组成和各部分的作用

16.什么叫不可变对象?

17.Java创建对象的方式

18…Object中有哪些公共方法?

19. HashMap和HashTable的区别

20.HashMap的实现原理(说一下HashMap)

21.比较一下list、set、map

22.list、map、set的使用场景

23.Java有没有goto?

24.Get/Post对缓存的影响

25.多态的好处

26.虚拟机是如何实现多态的?










1.Math类中提供了三个与取整有关的方法:ceil、floor、round

ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;


floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;


最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。

2.float f=3.4;是否正确?

3.4是双精度数,将双精度型赋值给单精度型(float)属于下转型会造成精度损失,因此需要强制类型转换; 或者写成float f =3.4F

        float ff = (float) 3.4;
        float ff1 = 3.4f;

扩展;数值型:1)整型:byte 1个字节;short 2个字节;int 4个字节;long 8个字节。2)浮点型:float 4个字节;double 8个字节;

3.int和Integer有什么区别

一个是基本数据类型一个是引用数据类型

原始类型: boolean, char, byte,short, int, long,float,double

-包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

        Integer i1 = 100,i2 = 100,i3 = 150,i4 = 150;
		System.out.println(i1 == i2);  // -->true
		System.out.println(i3 == i4);  //-->false
		/**
		*如果整形字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象
		*/

4.JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

Jsp本质上就servlet

Servlet充当控制层,jsp充当表示层视图层,jsp编译后是“类servlet”

最本质的区别就是Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑。

5.数组有没有length()方法?String有没有length()方法?

数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆

6.构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

7.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

如果两个对象x和y满足x.equals(y) == true,那么它们的hashCode值一定要相同(除非重写了equlas方法)

8.是否可以继承String类?

String 类是final类,不可以被继承

9.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

值传递

java中方法参数传递方式是按值传递。

如果参数是基本类型,传递的是基本类型的字面量值的拷贝。

如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝

10.String和StringBuilder、StringBuffer的区别?

Java平台提供了两种类型的字符串:
String和sStringBuffer/StringBuilder,它们可以储存和操作字符串。其中String被final修饰是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程使用

String 字符串常量,string可以赋空值,不可改变字符序列

StringBuffer 字符串变量(线程安全),可改变字符序列(效率低)

StringBuilder 字符串变量(非线程安全),可改变效率系列(效率高)

对于三者使用的总结:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 ->StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 ->StringBuffer

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrW4Dtzx-1580786443990)(798BF204470344238AA8C8442BD99581)]

         String s1="你好,Java"; 
		 String s2="你好,"+"Java"; 
		 System.out.println(s1==s2);   //true
		 System.out.println(s1.intern()==s2.intern());   //true

11.描述一下JVM加载class文件的原理机制

1.装载:查找和导入class文件;

2.连接:

(1)检查:检查载入的class文件数据的正确性;

(2)准备:为类的静态变量分配存储空间;

(3)解析:将符号引用转换成直接引用(这一步是可选的)

3.初始化:初始化静态变量,静态代码块。

这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作

在这里插入图片描述

12.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同

可以在一个类的内部定义另一个类, 这种类称为嵌套类(nested classes),它有两种类型:

静态嵌套类和非静态嵌套类.静态嵌套类使用很少, 最重要的是非静态嵌套类, 也即是被称作为内部类(inner).

其中inner类又可分为三种:

(1) 在一个类(外部类)中直接定义的内部类;

(2) 在一个方法(外部类的方法)中定义的内部类;

(3) 匿名内部类.

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化

13.Java 中会存在内存泄漏吗,请简单描述

理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生

14.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

15.Java 内存模型的组成和各部分的作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uW5fdaAl-1580786443992)(D86223E184C54F05A9D0BD50781F4FBF)]

这就是java内存模型,其中方法区和堆是线程共享的,虚拟机栈、本地方法栈,程序计数器都是线程私有的。

1>.程序计数器

存储线程当前执行的字节码行号,字节码解释器在工作时就会通过改变这个计数器的值来选取下一条要执行的字节码指令.

2>.虚拟机栈

用于每个方法的局部变量表,操作数栈,动态链接,方法出口等信息。

3>.本地方法栈

与虚拟基站一样,不同的是它只为navtive方法服务,而虚拟机栈为java方法服务。

4>.堆

是java虚拟机管理的内存中最大的一块区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例。它是垃圾收集器管理的主要区域。java堆可以处于内存中的不连续区域中,只要逻辑连续即可。

5>.方法区

存储已被虚拟机加载的类的信息,常量,静态变量,即时编译器编译后的代码等数据。

16.什么叫不可变对象?

指对象一旦被创建状态不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。

17.Java创建对象的方式

  • new
  • 反射
  • 采用clone
  • 通过序列化机制

前2者都需要显式地调用构造方法. 造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用.

18.Object中有哪些公共方法?

equals()、clone()、getClass()、notify(),notifyAll(),wait()

19. HashMap和HashTable的区别

HashTable是线程安全的HashMap不是

HashMap中允许存在null键和null值,HashTable中不允许

20.HashMap的实现原理(说一下HashMap)

HashMap的底层实现是“基于拉链法的散列表”

  • 1)HashMap是线程不安全的
  • 2)HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,采用哈希表来存储的

1> 底层以哈希表的结构进行存储数据

2> HashMap是以key(键)/value(值)方式进行元素的存储

3> HashMap中的key必须唯一,value是可以重复的

4> HashMap中的key和value是一一映射的关系

5> HashMap存储的元素是无序的

21.比较一下list、set、map

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYOvDcoF-1580786443994)(EE83A41A186B498E84BE5686312BB6B2)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2BzljrNZ-1580786443996)(07D66D8555574500855604DF6AB18FEE)]

1.list存储数据特点:有序的(怎么存的怎么取出来),可以存重复的


2.set存储数据特点:无序的(怎么存的不一定怎么取的),不能存相同的元素,没有下标不能用普通的for循环遍历


3.map存储数据特点:是以key/value方式进行元素的存储,key是唯一的但value可以重复,key和value是一一映射关系,也是无序的

22.list、map、set的使用场景

1.如果经常使用索引对容器中的元素进行访问,使用list。

ArrayList访问比LinkedList访问快,但是添加删除LinkedList比ArrayList快


2.如果想以插入的顺序依次存储,还用list,因为list是一个有序容器


3.如果想保证插入的唯一性,可以用set。比如HashSet、LinkedHashSet 或者 TreeSet


4.如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择

23.Java有没有goto?

goto 是Java中的保留字,在目前版本的Java中没有使用。

24.Get/Post对缓存的影响

此题其实是问浏览器缓存对于HTTP Method中Get和Post的请求是否支持,答案是不支持Post Method。Get可以被浏览器缓存

25.多态的好处

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1WLHN75-1580786443997)(F41CE1C0FED7441BBC57B26FBBE42A33)]

  • 提高了代码的维护性(继承保证)
  • 提高了代码的扩展性(由多态保证)

26.虚拟机是如何实现多态的?

动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法.





发布了213 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42363032/article/details/104166876