Java应届生面试必备考题(附答案)

点关注,不迷路;持续更新Java相关技术及资讯!!!
内容源于群友投稿!感谢支持!

前言

在这里插入图片描述

今年收到疫情的影响,导致很多的应届生都还没有找到工作的,那么对于Java应届生来说,又有那些是必须要要会的呢,那些又是必考的呢,今天带着大家一起来看一下!在这里整理了100个必备考题,因为篇幅有限只列举了部分出来,需要全部的大厂面试题的,可以点击此处免费领取,还有优秀的简历模板哟

面向对象的特征有哪些方面?

  • 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
  • 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类(超累,基类);得到继承信息的类被称为子类(派生类)。继承让变换中的软件系统有了一定的延续性。同时继承也是封装程序中可变因素的重要手段。
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列的完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一起可以隐藏的东西,只向外界提供最简单的编程接口。
  • 多态性:多态性是允许不同子类型对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时多态性和运行时多态性。如果将对象的方法是为对象向外界提供的服务,那么运行时的多态性可以解释为:调用不同的子类对象替换父类对象。方法重载(overload)实现的是编译时多态性(也成为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1方法重写(子类继承父类并重写父类中已有的或抽象的方法)2对象造型(用父类引用子类对象)

访问修饰符权限

权限分为:当前类,同包,子类,其他包

public均可;protected其他包不可;default同包下的可以;private只有自己可以。

String是基本数据类型吗

答:不是。java中8中基本类型:byte,short,int,long,float,double,char,boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。
在这里插入图片描述

float f=3.4

错误,默认是double的,需要强转,或者f=3.4f;

int和integer

为了将基本数据类型当做对象操作,Integer为包装类(wrapper class)。

Integer缓存为-128到127.所以,这个范围内的Integer对象是同一个,==为true。其他为false。
点击此处免费领取更多Java面试资料

&和&&

&链接的操作符都要计算。&&是短路运算,即当前面表达式有错误就停止计算。

解释内存中的栈(stack)、堆(heap)、和静态区(static area)的 用法

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello"和常量都是放在静态区中。栈空间操作起来最快但栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至磁盘上的虚拟内存都可以当做堆空间来使用。

String str = new String("hello");

上面,str放栈,用new出来的字符串对象放堆上,而“hello”这个字面量放在静态区。

java6开始使用“逃逸分析”的技术,可以将一些局部对象放在栈上提升对象操作性能。

switch是否可以用在byte,long,String?

答:java5前只可以:byte、short、char、int。5后增加enum,7后增加String.

最有效率的方法计算2乘以8

答:2<<3(左移3相当于乘以2的3次方,右移3相当于除以2的3次方)

补充:我们为编写的类重写hashCode方法时,可能会看到如下所示的代码,其实我们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个素数,为什么通常选择31这个数?前两个问题的答案你可以自己百度一下,选择31是因为可以用移位和减法运算来代替乘法,从而得到更好的性能。说到这里你可能已经想到了:31

数组有没有length()方法,String有没有length()方法?

在这里插入图片描述

答:数组没有length()方法,有length属性。String有length()方法。js中字符串是length属性。

构造器constructor是否可以override?

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

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

答:不对。equals的hashcode必须相同。

是否可以继承String类

答:String类是final类,不可以被继承。继承String是个错误的行为,应该用关联关系(Has-A)和依赖关系(Use A)而不是继承关系(Is-A).

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

答:是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。点击此处免费领取更多Java面试资料

String

@Test
    public void str_c(){
        String a = "hehe";
        String b = "he"+"he";
        String c = new String("hehe");
        String d = new String("hehe");
 
    System.out.println(a==b);//true
    System.out.println(a==c);//false
    System.out.println(a==a.intern());//true
    System.out.println(c==d);//false
    }

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

char 型变量中能不能存贮一个中文汉字,为什么?

答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

抽象类(abstract class)和接口(interface)有什么异同?

答:抽象类和接口都不能实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是privae,默认,protected,public,而接口中的成员变量全部是public。抽象类中可以定义成员变量,而接口中定义的成员白嬢实际上都是常量。有抽象方法的类必须被声明为抽象类,抽象类未必有抽象方法。

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

在这里插入图片描述

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。点击此处免费领取更多Java面试资料

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

答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。

  • View Code  上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete
    reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk
    Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。

总结

在这里插入图片描述

金九已然快结束了,银十即将到来,各位刚刚毕业的Java程序员们,都能把握住这面试热潮,应聘上合适自己的工作,在这里我也整理了一些大厂面试题,面试资料,以及写的好的简历模板,需要的可以点击此处免费领取,希望能帮到有需要的读者,祝各位能够在下一次求职面试当中更加顺利。
 在这里插入图片描述
在这里插入图片描述
需要的可以点击此处免费领取

猜你喜欢

转载自blog.csdn.net/yueyunyin/article/details/108772694