【面试宝典】:检验是否为合格的初中级程序员的面试知识点,你都知道了吗?查漏补缺(上)

简介: 在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢迎一起学习【面试知识,工作可待】系列 《面试知识,工作可待篇》

《面试知识,工作可待篇》-Java笔试面试基础知识大全


前言


是不是感觉找工作面试是那么难呢?


在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢迎一起学习【面试知识,工作可待】系列 《面试知识,工作可待篇》



1. Java环境


1. 1 Java 和 C++ 的区别?


  • 都是面向对象的语言,都支持封装、继承和多态。
  • Java 不提供指针来直接访问内存,程序内存更加安全。
  • Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。


【重要】Java 有自动内存管理机制,不需要程序员手动释放无用内存。


1.2  JDK、JRE、JVM


1.2.1 JDK


JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。开发工具如:


  • 用于编译 Java 程序的 javac 命令。
  • 用于启动 JVM 运行 Java 程序的 Java 命令。
  • 用于生成文档的 Javadoc 命令。
  • 用于打包的 jar 命令等等。


1.2..2 JRE


JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机(JVM)和丰富的系统类库。系统类库即为 Java 提前封装好的功能类,只需拿来直接使用即可,可以大大的提高开发效率。


1.2..3 JVM


JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持。


1.2..4 三者关系


  • JDK > JRE > JVM


1.2  为什么 Java 被称作是“平台无关的编程语言”?


  • Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。
  • Java 源文件( .java )被编译成能被 Java 虚拟机执行的字节码文件( .class )。
  • Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。


1.3 什么是字节码?


这个问题,面试官可以衍生提问,Java 是编译执行的语言,还是解释执行的语言。 Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。


编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。


每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java 源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。这也就是解释了 Java 的编译与解释并存的特点。


1.4  Java 源代码


=> 编译器 => JVM 可执行的 Java 字节码(即虚拟指令)=> JVM => JVM 中解释器 => 机器可执行的二进制机器码 => 程序运行


1.5  采用字节码的好处?


Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。


解释型语言:解释型语言,是在运行的时候将程序翻译成机器语言。解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。这样解释型语言每执行一次就要翻译一次,效率比较低 例如:Python、PHP 。


2. 面向对象和面向过程


2.1  什么是面向对象?


面向对象是一种思想,万事万物抽象成一个对象,这里只讨论面向对象编程(OOP),Java 是一个支持并发、基于类和面向对象的计算机编程语言。


2.1.1 类class


类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。 用计算机语言来描述,是属性方法的集合。


2.1.2 对象instance、object


对象是类的具象,是一个实体。 对于我们每个人这个个体,都是抽象概念人 类 的不同的 实体 。


面向对象软件开发具有以下优点:


  • 代码开发模块化,更易维护和修改。
  • 代码复用性强。
  • 增强代码的可靠性和灵活性。
  • 增加代码的可读性。


2.2 面向对象的特征


2.1 封装


封装,给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。


在 Java 当中,有 4 种修饰符: default、public、private 和 protected 。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限,权限如下:


访问权限 子类 其他包
public
protect ×
default × ×
private × × ×


封装好处:


  • 通过隐藏对象的属性来保护对象内部的状态。
  • 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
  • 禁止对象之间的不良交互提高模块化。


2.2  继承


继承,使对象基于基类字段和方法,新增自定义的的方法和属性。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。


继承属性:


  • 子类拥有父类非 private 的属性和方法。
  • 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法


2.3 多态


多态,程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。


Java中有两种形式可以实现多态:


  • 继承(多个子类对同一方法的重写)
  • 接口(实现接口并覆盖接口中同一方法)


2.3 面向对象和面向过程的区别?


面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,


面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。


2.3.1 面向过程


  • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。比如,单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是最重要的因素。
  • 缺点:没有面向对象易维护、易复用、易扩展。


2.3.2 面向对象


  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
  • 缺点:性能比面向过程低。


3. Java数据类型(基本数据类型和引用类型)


3. 1 基本数据类型如下:


  • 整数值型:byte、short、int、long
  • 字符型:char
  • 浮点类型:float、double
  • 布尔型:boolean


20.png


整数型:默认 int 型,小数默认是 double 型。Float 和 Long 类型的必须加后缀。

比如:float f = 100f 。


引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。


3.2 引用类型


引用类型指向一个对象,不是原始值,指向对象的变量是引用变量


在java里面除去基本数据类型的其他类型都是引用类型,自己定义的class类都是引用类型,可以像基本类型一样使用。


引用类型常见的有:String、StringBuffer、ArrayList、HashSet、HashMap等

特别注意,String 是引用类型不是基本类型。


3.3 引用类型简介


引用类型 对象是否可引用 回收时间 使用场景
强引用 可以 从不回收 普遍对象的状态
软引用 可以 内存不足时 内存敏感的高速缓存
弱引用 可以 下一次GC 对象缓存
虚引用 不可以 下一次GC 一般用于追踪垃圾收集器的回收动作


3. 4 什么是值传递和引用传递?


  • 值传递,是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。
  • 引用传递,一般是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。


一般认为,Java 内的传递都是值传递,Java 中实例对象的传递是引用传递。


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


  • C 语言中,char 类型占 1 个字节,而汉字占 2 个字节,所以不能存储。
  • Java 语言中,char 类型占 2 个字节,而且 Java 默认采用 Unicode 编码,一个 Unicode 码是 16 位,所以一个 Unicode 码占两个字节,Java 中无论汉字还是英文字母,都是用 Unicode 编码来表示的。所以,在 Java 中,char 类型变量可以存储一个中文汉字。


3.6 equals 与 == 的区别?


  • 值类型(int,char,long,boolean 等)都是用 == 判断相等性。
  • 对象引用的话


  • == 判断引用所指的对象是否是同一个。
  • equals 方法,是 Object 的成员函数,有些类会覆盖(override) 这个方法,用于判断对象的等价性。


例如 String 类,两个引用所指向的 String 都是 "abc" ,但可能出现他们实际对应的对象并不是同一个(和 JVM 实现方式有关),因此用 == 判断他们可能不相等,但用 equals 方法判断一定是相等的。


4. Java类Class


类是对事物的抽象,抽象类是对类的抽象,接口是对抽象类的抽象。


4.1 Java 对象(Class)创建的方式?


  • 使用 new 关键字创建对象。
  • 使用 Class 类的 newInstance 方法(反射机制)。
  • 使用 Constructor 类的 newInstance 方法(反射机制)。
  • 使用 clone 方法创建对象。
  • 使用(反)序列化机制创建对象。


4.2 抽象类与接口


4.2.1 抽象类


从面向对象的角度来讲,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样,并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以认为是抽象类


抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。


4.2.2 接口


接口,在JAVA编程语言中是一个抽象类型,主要是抽象方法的集合,接口中的变量定义必须为public static final类型。接口通常以interface来声明。


4.2.3  抽象类与接口的对比


参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码 如果你往接口中添加方法,那么你必须改变实现该接口的类。


4.3 讲讲类的实例化顺序


初始化顺序如下:


---->父类静态变量

--------->父类静态代码块

------------->子类静态变量、

----------------->子类静态代码块

--------------------->父类非静态变量(父类实例成员变量)

------------------------->父类构造函数

----------------------------->子类非静态变量(子类实例成员变量)

--------------------------------->子类构造函数


4.4 内部类


简单的说,就是在一个类、接口或者方法的内部创建另一个类。这样理解的话,创建内部类的方法就很明确了。当然,详细的可以看看 《Java 内部类总结(吐血之作)》 文章。


4.4.1 内部类的作用是什么?


  • 内部类可以很好的实现隐藏(一般的非内部类,是不允许有 private 与protected权限的,但内部类可以)
  • 内部类拥有外围类的所有元素的访问权限
  • 可是实现多重继承
  • 可以避免修改接口而实现同一个类中两种同名方法的调用。


4.5 Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?


可以继承其他类或实现其他接口,在 Java 集合的流式操作中,我们常常这么干。


4.6 内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?


一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。


如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,例如:


class Outer {
    static int x;
    static class Inner {
    void test() {
      syso(x);
    }
    }
}
复制代码


4.7  构造方法、构造方法重载


4.7.1 构造方法


当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java 编译器会为这个类创建一个默认的构造方法。


4.7.2 构造方法重载


Java 中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。


4. 8 重载和重写的区别?


4.8.1 重写 override


  • 方法名、参数、返回值相同。
  • 子类方法不能缩小父类方法的访问权限。
  • 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
  • 存在于父类和子类之间。
  • 方法被定义为 final 不能被重写。


4.8.2 重载 overload


  • 参数类型、个数、顺序至少有一个不相同。
  • 不能重载只有返回值不同的方法名。
  • 存在于父类和子类、同类中。


4.9  hashCode() 以及equals()


4.9.1 为什么需要子类实现这两个方法?


父类的 equals ,一般情况下是无法满足子类的 equals 的需求。


比如所有的对象都继承 Object ,默认使用的是 Object 的 equals 方法,在比较两个对象的时候,是看他们是否指向同一个地址。但是我们的需求是对象的某个属性相同,就相等了,而默认的 equals 方法满足不了当前的需求,所以我们要重写 equals 方法。


如果重写了 equals 方法,就必须重写 hashCode 方法,否则就会降低 Map 等集合的索引速度。


4.9.2 说一说你对 java.lang.Object 对象中 hashCode 和 equals 方法的理解。在什么场景下需要重新实现这两个方法?


理解答案与4.8.1差不多,


equals 方法,用于比较对象的内容是否相等。


当覆盖了 equals 方法时,比较对象是否相等将通过覆盖后的 equals 方法进行比较(判断对象的内容是否相等)。 hashCode 方法,大多在集合中用到。


将对象放入到集合中时,首先判断要放入对象的 hashCode 值与集合中的任意一个元素的 hashCode 值是否相等,如果不相等直接将该对象放入集合中。 如果 hashCode 值相等,然后再通过 equals 方法判断要放入对象与集合中的任意一个对象是否相等,如果 equals 判断不相等,直接将该元素放入到集合中,否则不放入。


4.9.3 有没有可能 2 个不相等的对象有相同的 hashCode?


可能会发生,这个被称为哈希碰撞。当然,相等的对象,即我们重写了 equals 方法,一定也要重写 hashCode 方法,否则将出现我们在 HashMap 中,相等的对象作为 key ,将找不到对应的 value 。


4.9.4 equals 和 hashCode 的关系


  • equals 不相等,hashCode 可能相等。


  • equals 相等,请重写 hashCode 方法,保证 hashCode 相等。


一般来说,hashCode 方法的重写,可以看看 《科普:为什么 String hashCode 方法选择数字31作为乘子》 方法。



目录
相关文章
|
30天前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
30天前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
30天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
1月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
27 3
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
25 2
|
1月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
49 1
|
1月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
39 1
|
2月前
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
1月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
讲解Activity的启动流程了,Activity的启动流程相对复杂一下,涉及到了Activity中的生命周期方法,涉及到了Android体系的CS模式,涉及到了Android中进程通讯Binder机制等等, 首先介绍一下Activity,这里引用一下Android guide中对Activity的介绍:
50 4

相关实验场景

更多
下一篇
无影云桌面