Java 面试(一)基础知识

  1、java中“==”和equals和hashCode的区别

  操作符“==”:

  专门用来比较两个变量的值是否相等,即用于比较变量所对应的内存中所存储的数值是否相同。比如比较两个基本类型的数据是否相等或两个引用变量是否指向同一个对象等,需要使用“==”

  equals方法:

  是Java类层次中根类Object中定义的方法,也就是说每个类都继承了这个方法,一般都来比较两个非空对象是否相同,返回true or false。

  无论何时重写此方法,通常都必须重写hashCode方法,以维护hashCode方法的一般约定——该方法声明相等对象必须具有相同的hashcode。

  hashcode方法:  

  返回对象的hashcode值。这个方法支持散列表,例如HashMap提供的散列表。

  hashcode的一般规约:

在一个Java应用程序的执行过程中,无论同一个Object的hashcode()方法被调用了多少次,只要在equals比较中需要用到的信息没有被修改,hashcode()方法必须始终返回相同的整数。当然在不同的执行过程中,该整数无需保持一致。

如果两个对象根据equals方法的判别是相等的,那么对每个对象的hashcode()方法的调用都会得到相同的整数。

根据equals方法判别不相等的两个对象,并不要求两个对象的hashcode()方法必须返回不同的整数。但是,程序员应该注意,为不相等的对象生成不同的整数结果可能会提高散列表的性能。

  事实上,Object中定义的hashcode()方法的确为不同的对象返回不同的整数值。这是通过将对象的内部地址转换为整数来实现的,但这种转换技术并不是Java语言要求的。

  ()

  2、int、char、long各占多少字节数?

  整数型:byte:1B  short :2B  int:4B  long:8B

  浮点型:float:4B  double:8B

  字符型:char:2B

  关于boolean:The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn\'t something that\'s precisely defined.

  

  3、int与Integer的区别

  Java为每个基本数据类型提供了一个包装类,Integer就是int的包装类。

  包装类有属性和方法,功能比基本数据类型更加强大。

  Java也提供自动将基本类型数据和他们包装类之间转换的机制。

  4、谈谈对Java多态的理解

  多态的定义:在程序中定义的引用变量所指向的具体类型在编程时并不确定,而是在程序运行期间才确定。

  多态的表现:相同的消息使得不同的对象做出不同的响应。

  多态的类型:编译时多态,运行时多态

  多态的实现方式:继承(继承关系、方法重写、向上转型)和接口(通过接口变量调用不同的对象中的接口方法)。

  

  5、String、StringBuffer、StringBuilder区别

  String:

  String对象是不可变对象,即当你修改一个String对象的内容时,JVM不会改变原来的对象,而是生成一个新的String对象;

  String对象被保存在String Pool中;

  Java中的不可变对象都是线程安全的,所以String对象也是线程安全的,意味着String对象不能被两个线程同时使用。

  StringBuffer:

  StringBuffer对象是可变对象,即它的值可以被修改。StringBuffer在进行字符串处理时,不生成新的对象。

  StringBuffer对象被存储在heap中;

  StringBuffer中的方法与StringBuilder中的方法是相同的,但是StringBuffer中的方法都是具有同步性的,即是线程安全的。因此,StringBuffer对象不允许两个线程同时访问同一个方法。

  因为保证了线程安全,StringBuffer的性能会降低。

  可以通过toString()方法转换成String类;可以通过String对象构造一个StringBuffer对象。

  StringBuffer的内部实现方式和String不同;

  StringBuilder:

  和StringBuffer基本一致;

  不同点在于,StringBuilder中的方法都不保证同步性和线程安全,因此速度会比StringBuffer快一些。

  

  6、什么是内部类?内部类的作用

  将一个类的声明和定义放在另一个类的内部。内部类相当于外部类的类成员,可以访问外部类的成员变量、方法和其它内部类。

  内部类的作用:

对类进行逻辑分组。如果类A仅对类B有作用,则可以把类A作为类B的内部类。

提高了封装程度。内部类可以被申明为private,可以访问外部类的私有成员。这时也只有外部类可以访问内部类。

可以使代码更可读和更易维护。把小型类定义在大型类的内部,可以使它更靠近它被使用到地方,从而更可读。

内部类对象创建时刻不依赖外部类对象的创建,内部类没有(和外部类)令人迷惑的“is a”关系,就是一个独立的实体。

每个内部类都能独立地继承一个类或实现一个接口,所以无论外部类是否已经继承了某个类或者实现了某个接口,对内部类没有影响。

  (https://www.geeksforgeeks.org/nested-classes-java/)

  7、抽象类和接口区别

  接口和抽象类的不同表现在下面三个方面:

  (1)抽象层次不同

    抽象类是对整个类的整体进行抽象,包括属性、行为;

    接口只对行为抽象。 

  (2)建模关系不同

    抽象类对有相似特点的类建模,抽象类体现的更多是一种继承关系;

    而接口可以对不相关的类建模。

  (3)设计层次不同

    抽象类是自下而上进行设计;

    接口只需要定义一个规则,只关心行为的需求描述;

  

  8、抽象类的意义

  抽象类可以有属性和方法,但是不能创建实例,它是用来被继承的。但是,抽象类可以有构造方法!

  抽象类中的抽象方法的具体实现由子类自己负责完成,从抽象父类派生的子类要能够实现所有的抽象方法。

  9、抽象类与接口的应用场景

  一个类可以实现多个接口;一个类只能继承一个抽象类;

  选择抽象类:

You want to share code among several closely related classes.

You expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private).

You want to declare non-static or non-final fields. This enables you to define methods that can access and modify the state of the object to which they belong.

  选择接口:

You expect that unrelated classes would implement your interface. For example, the interfaces Comparable and Cloneable are implemented by many unrelated classes.

You want to specify the behavior of a particular data type, but not concerned about who implements its behavior.

You want to take advantage of multiple inheritance of type.

  10、抽象类是否可以没有方法和属性?

  可以!

  接口也可以没有方法和属性。

  11、接口的意义

  接口为实现类提供一个必须做到的行为规范;

  一个接口可以继承多个接口;

  一个类可以实现多个接口,弥补了类之间单继承的缺陷;

  12、泛型中extends和super的区别

  为泛型的类型限制提供上界(还可以使用上界类中的方法)和下界;

  13、父类的静态方法能否被子类重写

  可以,但是重写的方法也必须申明为static。

  14、进程和线程的区别

  15、final,finally,finalize的区别

  final:

  final修饰类,避免产生子类。如果一个类声明为final,它的所有方法默认为final(反正也不会被重写),但是它的属性不这样;

  final修饰方法,意味着方法不能被子类重写;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjyzy.html