Java教程

Java基础知识点(面试点)

本文主要是介绍Java基础知识点(面试点),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java面试基础知识

  1. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
    Java对于eqauls方法和hashCode方法是这样规定的 :
    (1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
    (2)如果两个对象的hashCode相同,它们并不一定相同。简单记忆:若x=y,则H(x)=H(y). 若H(x)=H(y),则x不一定等于y。(哈希碰撞的存在)
    
  1. ==和equals方法
==:比较的是两个对象的地址是否相同(基本数据类型和引用数据类型)
equals:object类中的方法
注意
当equals方法被覆盖时,比较的是两个对象的内容是否相同
当equals方法没有被覆盖时,效果和==一样

在这里插入图片描述

  1. String 是最基本的数据类型吗
不是。Java中的基本数据类型只有8个:
byte、short、int、long、float、double、char、boolean;
除了基本类型(primitive type)和枚举类型(enumeration type)
剩下的都是引用类型(reference type)。
  1. 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);其中有隐含的强制类型转换。
数据类型:精度低的可以自动转为精度高的,精度高的强制转换为精度低的。
  1. 拆箱和装箱
如果整型字面量的值在-128到127之间,那么不会new新的Integer对象
而是直接引用常量池中的Integer对象,所以下面的面试题中f1f2的结果是true
而f3f4的结果是false

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 访问修饰符public,private,protected,以及不写(默认)时的区别
修饰符
    1.类 只能用public ,abstract, final修饰。
    2.内部类 和成员变量(必须要初始化)一样可以用所有访问权限修饰符修饰。 
    3.局部内部类 和局部变量一样不能用访问权限修饰符修饰。

在这里插入图片描述

  1. &和&&的区别?
 二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
 &&之所以称为短路运算是因为,如果&&左边的表达式的值是false
 右边的表达式会被直接短路掉,不会进行运算。
  1. 构造器(constructor)是否可被重写(override)
构造器不能被继承,因此不能被重写,但可以被重载
  1. 是否可以继承String类?
 String是final类,不能被继承
  1. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
重载对返回类型没有特殊的要求。
  1. 静态变量和实例变量
静态变量隶属于类,实例变量隶属于对象。静态变量在程序运行的时候就被创建,而实例变量是在创建对象的时候创建。
静态变量与实例变量存储的地方也是不同的,静态变量存储在JVM的方法区中,而实例变量则存在于对象堆的内存中。
作为实际开发的时候,静态变量它的存储空间是相对比较小的,而实例变量存储的空间比较多,在我们Java面向对象编程中,我们在绝大多数场景下推荐优先使用实例变量而减少对静态变量的使用。因为实力变量会被垃圾回收。
  1. 获得一个类的类对象有哪些方式?
    方法1:类型.class,例如:String.class
    方法2:对象.getClass(),例如:”hello”.getClass()
    方法3:Class.forName(),例如:Class.forName(“java.lang.String”)
  1. Basic
常量使用final修改,关键字final表示这个变量只能被赋值一次,一旦被赋值之后就不能改变了。
static修改的方法是静态方法,属于本类的,静态方法不能访问非静态方法(原因:静态成员:包括静态变量和静态方法属于本类的,随着类的加载就会分配内存。
非静态成员属于类的对象,只有当类实例化的时候才会分配内存。在一个类的静态成员中去访问非静态成员之所以会出错是因为在类的非静态成员不存在的时候静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。)。
使用static final修改的变量称为类变量。
创建的对象(构造器创建)存储在堆中,一般变量存储在栈中。
所以变量占据的内存空间很小,对象占据的空间很大,用完之后要使用java垃圾回收机制进行回收。
重写(一般出现在接口中,子类重写父类的方法)、重载(方法名相同,参数个数不同、参数名称不同)、继承、封装、多态。
  1. this
    在这里插入图片描述
    在这里插入图片描述

  2. final类和方法

   final修饰的类不允许改变,也就是不允许有子类(不存在继承关系)。
   同样的final修饰的方法也不能被重写。例如String就是一个final修饰的类。
  1. 多线程及其安全
多线程
单个程序看起来可以同时处理多个任务。通常将每个任务称为一个线程。可以一次运行多个线程的程序称为多线程。
多线程和多进程的区别
每个进程有自己的变量的完备集,线程则共享相同的数据。
  1. 线程安全与线程不安全,决定安全与否的因素,解决安全方法
线程安全
线程安全是指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性。
线程不安全
线程不安全就是不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
决定安全与否的因素
全局变量及静态变量。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;
若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

解决安全方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
18. java中集合类总结

集合类三种:list,set,map
集合类接口:collection,map。其中list,set实现了collection接口

在这里插入图片描述
19. 多态

现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
多态的定义与使用格式。  
定义格式:父类类型 变量名=new 子类类型();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
20. 如何判断一个常量是废弃常量

 运⾏时常量池主要回收的是废弃的常量。那么,我们如何判断⼀个常量是废弃常量呢? 
假如在常量池中存在字符串 "abc",如果当前没有任何String对象引⽤该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发⽣内存回收的话⽽且有必要的话, "abc" 就会被系统清理出常量池。 
  1. 如何判断一个类是无用的类
 方法区主要回收的是无用的类,如何判断一个类是无用的类呢?
    1,该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
    2,加载该类的ClassLoader已经被回收。
    3,该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
  1. 序列化
定义
        Java序列化就是指把Java对象转换为字节序列的过程。
        Java反序列化就是指把字节序列恢复为Java对象的过程。

为什么要序列化/或者说作用
        序列化的作用:在传递和保存对象时保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
        反序列化的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

优点
         将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。
         序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。
         通过序列化可以在进程间传递对象。

serialVersionID
        一个版本号,和可序列化的类相关联。
        在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
        在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。

serialVersionID工作机制
        在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测序列化文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,
        如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且回报出错误
  1. 子类和父类的实例变量和方法的区别
父类的实例变量子类可以使用,子类的只能自己使用
    子类可以调用父类的方法,父类不能调用子类的方法。因为父类不知道它将被哪个子类继承,也不知道子类将增加怎么样的方法。
对于静态变量
父类的静态变量子类可以使用,方式为类.变量名。
如果子类的静态变量和父类的静态变量重名,且父类静态变量与子类静态变量值改变时,不相互影响。因为子类和父类变量的内存不同,子类的静态变量重新分配内存。

在这里插入图片描述
24. 重载和覆盖(重写)的区别

  重载:参数值不同、参数顺序不同、参数类型不同
    覆盖(重写):子类对父类方法的重写,方法名、参数列表必须相同,返回值小于父类,只能比父类抛出更少的异常,访问权限不能比父类的小。被覆盖的方法是private的话,就不是重写,而是定义的一个新方法;
返回值类型不同不能重载,例如void fun(),int fun(){return 1},在进行方法调用的时候直接fun(),编译器并不知道调用哪个具体的方法。
这篇关于Java基础知识点(面试点)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!