Java基础面试知识点总结

Java面试知识点总结:从基础到高级的全面指南 在准备Java面试时,系统地覆盖从基础到高级的知识点是至关重要的。以下是一个详细的Java面试知识点总结,帮助你有针对性地准备面试。也算是我自己总结的知识点,先记录下来,说不定下次准备面试的时候,能再用上。 阅读详情

本文主要是我最近复习Java基础原理过程中写的Java基础学习总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理。

纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容 对做了比较深入的学习以及代码实现,基本上比较全面地讲述了每一个Java基础知识点,当然可能有些遗漏和错误,还请读者指正。

Java基础学习总结

每部分内容会重点写一些常见知识点,方便复习和记忆,但是并不是全部内容,详细的内容请参见具体的文章地址。

面向对象三大特性

继承:一般类只能单继承,内部类实现多继承,接口可以多继承

封装:访问权限控制public > protected > 包 > private 内部类也是一种封装

多态:编译时多态,体现在向上转型和向下转型,通过引用类型判断调用哪个方法(静态分派)。

运行时多态,体现在同名函数通过不同参数实现多种方法(动态分派)。

基本数据类型

基本类型位数,自动装箱,常量池

例如byte类型是1byte也就是8位,可以表示的数字是-128到127,因为还有一个0,加起来一共是256,也就是2的八次方。

32位和64位机器的int是4个字节也就是32位,char是1个字节就是8位,float是4个字节,double是8个字节,long是8个字节。

所以它们占有字节数是相同的,这样的话两个版本才可以更好地兼容。(应该)

基本数据类型的包装类只在数字范围-128到127中用到常量池,会自动拆箱装箱,其余数字范围的包装类则会新建实例

String及包装类

String类型是final类型,在堆中分配空间后内存地址不可变。

底层是final修饰的char[]数组,数组的内存地址同样不可变。

但实际上可以通过修改char[n] = 'a'来进行修改,不会改变String实例的内存值,不过在jdk中,用户无法直接获取char[],也没有方法能操作该数组。

所以String类型的不可变实际上也是理论上的不可变。所以我们在分配String对象以后,如果将其 = "abc",那也只是改变了引用的指向,实际上没有改变原来的对象。

StringBuffer和StringBuilder底层是可变的char[]数组,继承父类AbstractStringBuilder的各种成员和方法,实际上的操作都是由父类方法来完成的。

final关键字

final修饰基本数据类型保证不可变

final修饰引用保证引用不能指向别的对象,否则会报错。

final修饰类,类的实例分配空间后地址不可变,子类不能重写所有父类方法。因此在cglib动态代理中,不能为一个类的final修饰的函数做代理,因为cglib要将被代理的类设置为父类,然后再生成字节码。

final修饰方法,子类不能重写该方法。

抽象类和接口

1 抽象类可以有方法实现。

抽象类可以有非final成员变量。

抽象方法要用abstract修饰。

抽象类可以有构造方法,但是只能由子类进行实例化。

2 接口可以用extends加多个接口实现多继承。

接口只能有public final类型的成员变量。

接口只能有抽象方法,不能有方法体、

接口不能实例化,但是可以作为引用类型。

代码块和加载顺序

假设该类是第一次进行实例化。那么有如下加载顺序

静态总是比非静态优先,从早到晚的顺序是:

1 静态代码块 和 静态成员变量的顺序根据代码位置前后来决定。

2 代码块和成员变量的顺序也根据代码位置来决定

3 最后才调用构造方法构造方法

包、内部类、外部类

1 Java项目一般从src目录开始有com.*.*.A.java这样的目录结构。这就是包结构。所以一般编译后的结构是跟包结构一模一样的,这样的结构保证了import时能找到正确的class引用包访问权限就是指同包下的类可见。

import 一般加上全路径,并且使用.*时只包含当前目录的所有类文件,不包括子目录。

2 外部类只有public和default两种修饰,要么全局可访问,要么包内可访问。

3 内部类可以有全部访问权限,因为它的概念就是一个成员变量,所以访问权限设置与一般的成员变量相同。

非静态内部类是外部类的一个成员变量,只跟外部类的实例有关。

静态内部类是独立于外部类存在的一个类,与外部类实例无关,可以通过外部类.内部类直接获取Class类型。

异常

1 异常体系的最上层是Throwable类

子类有Error和Exception

Exception的子类又有RuntimeException和其他具体的可检查异常。

2 Error是jvm完全无法处理的系统错误,只能终止运行。

运行时异常指的是编译正确但运行错误的异常,如数组越界异常,一般是人为失误导致的,这种异常不用try catch,而是需要程序员自己检查。

可检查异常一般是jvm处理不了的一些异常,但是又经常会发生,比如Ioexception,Sqlexception等,是外部实现带来的异常。

3 多线程的异常流程是独立的,互不影响。

大型模块的子模块异常一般需要重新封装成外部异常再次抛出,否则只能看到最外层异常信息,难以进行调试。

日志框架是异常报告的最好帮手,log4j,slf4j中,在工作中必不可少。

泛型

Java中的泛型是伪泛型,只在编译期生效,运行期自动进行泛型擦除,将泛型替换为实际上传入的类型。

泛型类用class A {

}这样的形式表示,里面的方法和成员变量都可以用T来表示类型。泛型接口也是类似的,不过泛型类实现泛型接口时可以选择注入实际类型或者是继续使用泛型。

泛型方法可以自带泛型比如void E go();

泛型可以使用?通配符进行泛化 Object可以接受任何类型

也可以使用 这种方式进行上下边界的限制。

Class类和Object类

Java反射的基础是Class类,该类封装所有其他类的类型信息,并且在每个类加载后在堆区生成每个类的一个Class<类名>实例,用于该类的实例化。

Java中可以通过多种方式获取Class类型,比如A.class,new A().getClass()方法以及Class.forName("com.?.?.A")方法。

Object是所有类的父类,有着自己的一些私有方法,以及被所有类继承的9大方法。

有人讨论Object和Class类型谁先加载谁后加载,因为每个类都要继承Object,但是又得先被加载到堆区,事实上,这个问题在JVM初始化时就解决了,没必要多想。

javac和java

javac 是编译一个java文件的基本命令,通过不同参数可以完成各种配置,比如导入其他类,指定编译路径等。

java是执行一个java文件的基本命令,通过参数配置可以以不同方式执行一个java程序或者是一个jar包。

javap是一个class文件的反编译程序,可以获取class文件的反编译结果,甚至是jvm执行程序的每一步代码实现。

反射

Java反射包reflection提供对Class,Method,field,constructor等信息的封装类型。

通过这些api可以轻易获得一个类的各种信息并且可以进行实例化,方法调用等。

类中的private参数可以通过setaccessible方法强制获取。

反射的作用可谓是博大精深,JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义成一个类,然后用class.for(name)会把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。

枚举类

枚举类继承Enum并且每个枚举类的实例都是唯一的。

枚举类可以用于封装一组常量,取值从这组常量中取,比如一周的七天,一年的十二个月。

枚举类的底层实现其实是语法糖,每个实例可以被转化成内部类。并且使用静态代码块进行初始化,同时保证内部成员变量不可变。

序列化

序列化的类要实现serializable接口

transient修饰符可以保证某个成员变量不被序列化

readObject和writeOject来实现实例的写入和读取。

待更新。

事实上,一些拥有数组变量的类都会把数组设为transient修饰,这样的话不会对整个数组进行序列化,而是利用专门的方法将有数据的数组范围进行序列化,以便节省空间。

动态代理

jdk自带的动态代理可以代理一个已经实现接口的类。

cglib代理可以代理一个普通的类。

动态代理的基本实现原理都是通过字节码框架动态生成字节码,并且在用defineclass加载类后,获取代理类的实例。

一般需要实现一个代理处理器,用来处理被代理类的前置操作和后置操作。在JDK动态代理中,这个类叫做invocationHandler。

JDK动态代理首先获取被代理类的方法,并且只获取在接口中声明的方法,生成代理类的字节码后,首先把这个类通过defineclass定义成一个类,然后把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。

而对于cglib动态代理,一般会把被代理类设为代理类的父类,然后获取被代理类中所有非final的方法,通过asm字节码框架生成代理类的字节码,这个代理类很神奇,他会保留原来的方法以及代理后的方法,通过方法数组的形式保存。

cglib的动态代理需要实现一个enhancer和一个interceptor,在interceptor中配置我们需要的代理内容。如果没有配置interceptor,那么代理类会调用被代理类自己的方法,如果配置了interceptor,则会使用代理类修饰过的方法。

多线程

这里先不讲juc包里的多线程类。juc相关内容会在Java并发专题讲解。

线程的实现可以通过继承Thread类和实现Runable接口

也可以使用线程池。callable配合future可以实现线程中的数据获取。

Java中的线程有7种状态,new runable running blocked waiting time_waiting terminate

blocked是线程等待其他线程锁释放。

waiting是wait以后线程无限等待其他线程使用notify唤醒

time_wating是有限时间地等待被唤醒,也可能是sleep固定时间。

Thread的join是实例方法,比如a.join(b),则说明a线程要等b线程运行完才会运行。

o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态,notify则是持有o锁对象的线程通知其他等待锁的线程获取锁。notify方法并不会释放锁。注意这两个方法都只能在synchronized同步方法或同步块里使用。

synchronized方法底层使用系统调用的mutex锁,开销较大,jvm会为每个锁对象维护一个等待队列,让等待该对象锁的线程在这个队列中等待。当线程获取不到锁时则让线程阻塞,而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁。

Thread.sleep(),Thread.interrupt()等方法都是类方法,表示当前调用该方法的线程的操作。

一个线程实例连续start两次会抛异常,这是因为线程start后会设置标识,如果再次start则判断为错误。

IO流

IO流也是Java中比较重要的一块,Java中主要有字节流,字符流,文件等。其中文件也是通过流的方式打开,读取和写入的。

IO流的很多接口都使用了装饰者模式,即将原类型通过传入装饰类构造函数的方式,增强原类型,以此获得像带有缓冲区的字节流,或者将字节流封装成字符流等等,其中需要注意的是编码问题,后者打印出来的结果可能是乱码哦。

IO流与网络编程息息相关,一个socket接入后,我们可以获取它的输入流和输出流,以获取TCP数据包的内容,并且可以往数据报里写入内容,因为TCP协议也是按照流的方式进行传输的,实际上TCP会将这些数据进行分包处理,并且通过差错检验,超时重传,滑动窗口协议等方式,保证了TCP数据包的高效和可靠传输。

网络编程

承接IO流的内容

IO流与网络编程息息相关,一个socket接入后,我们可以获取它的输入流和输出流,以获取TCP数据包的内容,并且可以往数据报里写入内容,因为TCP协议也是按照流的方式进行传输的,实际上TCP会将这些数据进行分包处理,并且通过差错检验,超时重传,滑动窗口协议等方式,保证了TCP数据包的高效和可靠传输。

除了使用socket来获取TCP数据包外,还可以使用UDP的DatagramPacket来封装UDP数据包,因为UDP数据包的大小是确定的,所以不是使用流方式处理,而是需要事先定义他的长度,源端口和目标端口等信息。

为了方便网络编程,Java提供了一系列类型来支持网络编程的api,比如URL类,InetAddress类等。

后续文章会带来NIO相关的内容,敬请期待。

Java8

接口中的默认方法,接口终于可以有方法实现了,使用注解即可标识出默认方法。

lambda表达式实现了函数式编程,通过注解可以声明一个函数式接口,该接口中只能有一个方法,这个方法正是使用lambda表达式时会调用到的接口。

Option类实现了非空检验

新的日期API

各种api的更新,包括chm,hashmap的实现等

Stream流概念,实现了集合类的流式访问,可以基于此使用map和reduce并行计算。

欢迎工作一到五年的Java工程师朋友们加入Java架构师:697558955

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,

Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不

要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

Java面试知识点总结 目录 基础篇 一、JAVA: 二、JDK JRE JVM的区别: 三、java的基本数据类型 四、switch默认接受的几种数据类型 五、修饰符的作用 六、Static修饰符 七、final,finally,finalize 三者区别 八、StringBuffer StringBuilder String 区别 九、String的常用方法 十、Java面向对象的特征 十一、抽象类与接口的区别 十二、List,Set,Collection,Collecti.. 阅读详情

相关推荐

最全Java面试知识点梳理

1. 前言 最近面试了几家公司,体验了一下电话面试和今年刚火起来的视频面试, 虽然之前就有一些公司会先通过电话面试的形式先评估下候选人的能力水平,但好像不多,至少我以前的面试形式100%都是现场面试。 面试过程中,不可避免的被问到了很多面试题,本篇博客就总结下面试过程中被问到的关于String的2道面试题,分别是: 如何判断一个字符串中某个字符出现的次数? 如何反转一个字符串? 其余的面试题,目前都已梳理出来,后续会以博客的形式进行分享。 Java核心架构笔记大致如下 0~1年: Java基础(基本语

m0_56675572的博客 1927

取object里的值

最近碰到了一个情况,就是一个object里会有一串数据,但是数据是没有key的,只是最普通的一个数组的数据,那么怎么获得里面的值呢. 如果Object是List集合 List<Object> resultList; for (Object obj : resultList) { JSONArray objs = (JSONArray) obj; String param1 = (String) objs.get(0); } 这样就可以取到 .

qq_54250541的博客 6885

Java中如何获取Object对象的值?一文带你学会!

在Java编程中,Object类是所有类的父类,每个Java对象都继承自Object。因此,当我们处理泛型、反射、动态对象或集合等场景时,经常会遇到需要从Object类型的变量中提取其实际值的需求。这看似简单的操作,实际上包含了许多需要深入理解的内容,比如类型转换、反射机制、自动拆装箱等。本文将通过实例代码演示如何从Java的Object类型中获取值,并深入探讨相关的技术细节与优化手段。同时,我们还将延伸讨论如何在实际项目中处理Object类型的值,以帮助开发者更好地应对复杂的编程场景。在Java中,

喵手的博客 2380

点滴积累-从object中取值

问题        很多人在编程中可能会遇到这样的问题,返回一个object对象,怎么取其中的值 解决方案 一般获得的值都需要转换成字符串对象。如果Object中只有一个值,直接转换就可以。多个值的情况下怎么获取呢?这时候就应该考虑强制转换。然后再去取值。 Object[] objlist= (Object[]) object; objlist[0].toString(); o

我翱翔的天空 1万+

Java面试必备知识点大全

本文还有配套的精品资源,点击获取 简介:Java面试题是程序员求职中的重要环节,旨在评估应聘者在基础知识、编程能力、并发处理等多方面技能。本文列举了Java面试中常见的核心知识点,包括Java基础、数据类型与集合框架、多线程编程、IO流与NIO、反射机制、设计模式、JVM原理、并发工具类、Spring框架以及数据库连接等方面。求职者应深入理解每个知识点,并结合实战经验,以展...

weixin_42599908的博客 1927

全面掌握Java面试知识点.pdf

在Java中,类是对象的蓝图或模板。类定义了对象将拥有哪些属性(成员变量)和方法(行为)。创建类的语法结构是声明类名和类体。类体用大括号{}包围,类体内部可以包含属性和方法的定义。// 成员变量// 构造方法// 方法上述代码定义了一个Person类,拥有两个属性name和age,一个构造方法用于初始化对象,以及一个introduce方法用于向外界介绍自己。这个类描述了所有人的共同特征,但还未实例化为具体对象。

weixin_32535825的博客 954

Java中获取Object中的值的方法

例: Object object = {name:“张三”,age:23} 代码实现: Map entity = (Map)object; //获取object中name的值: String name = entity.get("name").toString(); //获取object中age的值 int age = Integer.valueOf(entity.get("age"));

jiandan7410的博客 1万+

Java面试及笔试核心知识点汇总

本文还有配套的精品资源,点击获取 简介:Java开发者在求职过程中常被考察的笔试和面试题包括多个核心知识点。这些知识点包括Java基础语法、面向对象编程、异常处理、集合框架、JVM原理、多线程、设计模式、IO流、网络编程、数据库操作、框架与技术以及算法与数据结构。这些内容是求职者提升面试竞争力、有效应对面试挑战的关键。 1. Java基础语法 Java语言是...

weixin_35751412的博客 892

java面试知识点——基础

java面试知识点——基础 java面试知识点解析(一)——基础知识篇

qq_40996030的博客 7335

java的JsonObject对象提取值方法

下面小编就为大家分享一篇java的JsonObject对象提取值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

电力抄表协议DL/T645和698.45到底有啥区别?一张图帮你选对协议

本文深入对比了电力抄表协议DL/T645和DL/T698.45的技术差异,从协议架构、报文结构、功能覆盖到实施成本进行全面分析。通过实际案例和数据,揭示698.45协议在通信效率、业务扩展性和长期成本上的优势,并提供清晰的选型决策流程图,帮助工程师根据具体需求选择最适合的电力抄表协议。

weixin_38168696的博客 401

Java基础面试知识点

Java面试基础知识点

weixin_43816557的博客 1973

FOC-滑膜控制器SMC/滑膜观测器SMO

三相PMSM是一个非线性、强耦合的多变量控制系统,对于外界的扰动或者电机自身的参数发生变化时,传统的PI控制并不能满足实际的要求。因此可以引入滑模控制SMC,它对扰动和参数不敏感,响应速度也够快。简单来说就是,滑膜观测器就是通过采样与坐标变换得到的Ualpha,Ubeta,Ialpha,Ibeta四个参数值,获取。SMO叫滑膜观测器(Sliding Mode Observer),用于获取转子位置信息与转速信息。2、作为滑膜观测器SMO,获取电机角度与转速信息。之间的误差来设计滑膜观测器,并通过该误差。

小胡同学的工程师学习之路 1万+

【Java】面试必考知识点五分钟过完

反射是通过获取类的class对象,然后动态的获取到这个类的内部结构,动态的去操作类的属性和方法。应用场景有:要操作权限不够的类属性和方法时、实现自定义注解时、动态加载第三方jar包时、按需加载类,节省编译和初始化时间;获取class对象的方法有:class.forName(类路径),类.class(),对象的getClass()

2401_89664701的博客 2474

深度学习之常用算子介绍

打开 onnx 模型图,可以看到它是一个有向无环图。除了 Input、Output ,其他都是算子(是操作,而不是节点)在ONNX(Open Neural Network Exchange)模型中,除了输入和输出,其他都是算子(Operations)。算子是表示神经网络模型中的不同操作或层的元素。一个ONNX模型由一系列算子组成,通过连接这些算子来定义模型的计算流程。

ueke1的博客 8459

【AIGC】Qwen3-Embedding:Embedding与Rerank模型新标杆

Qwen3-Embedding:文本嵌入与重排序模型的技术解析与应用实践

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3094

java基础面试知识点

1.java中==和equals和hashCode的区别 详细介绍 2.int、char、long各占多少字节数 详细介绍 3.int与integer的区别 详细介绍 4.对java多态的理解 详细介绍 5.String、StringBuffer、StringBuilder区别 详细介绍 6.什么是内部类?内部类的作用 详细介绍 7.抽象类和接口区别 详细介绍 8.抽象类的意义 详细介绍 9.抽象...

weixin_43175808的博客 474

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 655

应届生java面试必备知识点

java研发工程师面试必备知识点,你都get到了嘛,准备好再出发。 文章借鉴于我的小伙伴,均来自于网络整理聚合。 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重 ...

Donkey日迹 5552

对称式目镜设计实例

对称式目镜设计实例

weixin_72050316的博客 1163

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3940

Java面试知识点汇总

为了更加美好的明天而努力吧由于我不断补充,现在知识点已经比较庞杂,很多人私信我,说那一篇全是知识点太过庞杂,问我有没有整合的。。希望对大家有所帮助!

m0_74823524的博客 143

【ROS2】RViz2加载URDF模型文件

1)运行RViz2rviz22)添加组件:RobotModel3)选择通过文件添加4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可

郭老二 1450

java面试重要知识点复习大纲和一些值得看的面试题

面试重要知识点复习大纲 一、Java基础部分 (搞定所有技术之后才考虑复习的技术点) 1.数组中的排序问题(笔试或者机试,前者可能性更大) 2.面向对象的理解 3.集合相关的问题,比如hashmap跟hashtable的区别。搞清楚每个集合对象的特性就欧了。 4.多线程启动方式,以及产生死锁的原因和解决办法【多线程问题不是很常问,有精力就复习这块内容】 5.IO流,了解常见的几个流对象...

weixin_44048532的博客 1002

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 优秀的程序员和一般的程序员差别在哪?
下一篇: 阿里P7架构师告诉你Java架构师必须知道的 6 大设计原则
普通网友
博客等级 码龄8年 15粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值