java guide 八股

Java语言特点
简单易学、面向对象(继承、封装、多态)、平台无关性(Java虚拟机jvm)、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存

JVM:Java虚拟机(跨平台的关键)
JRE(Java运行虚拟环境):JVM+Java类库
JDK(JAVA SDK):JRE+JAVAC(JAVA编译器)+其他
在这里插入图片描述

字节码文件:.class文件
在这里插入图片描述
编译型语言:通过编译器将源代码一次性编译成机器码
解释型语言:通过解释器一句一句将代码解释

Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行

java注释:单行、多行、文档注释

标识符、关键字:标识符就是一个名字,包括程序、类、变量、方法等。关键字是为赋予特殊含义的标识符,关键字都是小写。

自增自减运算符:符号在前就先加减,符号在后就后加减

移位运算符:在 Java 代码里使用 <<、 >> 和>>>转换成的指令码运行起来会更高效些
在这里插入图片描述
移位操作符实际上支持的类型只有int和long,编译器在对short、byte、char类型进行移位前,都会将其转换为int类型再操作。同时float和double类型不支持移位运算。
<< :左移运算符,向左移若干位,高位丢弃,低位补零。x << 1,相当于 x 乘以 2(不溢出的情况下)。 >> :带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。x >> 1,相当于 x 除以 2。>>> :无符号右移,忽略符号位,空位都以 0 补齐

return:return;直接用来结束方法的执行,用于没有返回值的函数

Java数据类型:8种,
6 种数字类型:4 种整数型:byte、short、int、long 2 种浮点型:float、double
1 种字符类型:char
1 种布尔型:boolean。
在这里插入图片描述
Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
char a = 'h’char :单引号,String a = “hello” :双引号。
所有整型包装类对象之间值的比较,全部使用 equals 方法比较

自动装箱、拆箱
装箱:将基本类型用他们对应的引用类型包装起来 用Interger.valueOf()
拆箱:将包装类型转换为基本类型 用intValue()
频繁装箱拆箱会严重影响系统性能

为什么浮点数运算会有精度丢失的风险?
因为用二进制保存数据,宽度是有限的,无限循环小数只能被截断。可以采用BigDecimal来对浮点数进行运算。
超过long类型的数据可以采用BigInteger来存储,其内部采用int[]来存储任意大小的整形数据,但其运算效率相对较低

变量:
成员变量与局部变量的区别?
成员变量是属于类的,局部变量是方法内的,成员变量可以被public、private、static进行修饰,可以被外部访问,但成员变量不可以。二者都可以用final进行修饰
成员变量如果被static修饰,其是属于类的,如果没有被static修饰,那么这个变量就是属于实例的。对象存在在堆内存中,局部变量存在于栈内存中。
成员变量随着对象创建而创建,局部变量随着方法调用创建,方法结束后消失
成员变量如果没有赋初始值,则会自动以类型的默认值而赋值,而成员变量不会自动赋值。
为什么成员变量有默认值?
对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。

静态变量有什么作用?
静态变量是被static修饰的变量,他可以被类的所有实例共享。静态变量只会被分配依次内存,即使创建多个对象,这样可以节省内存

静态方法为什么不能调用非静态成员?
静态方法是属于类的,可以通过类名直接访问,非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象才能访问
静态方法和实例方法有何不同?
静态方法可以直接通过类调用,实例方法必须先创建对象,通过对象调用

面向对象基础
面向对象和面向过程:
面向过程是把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题
面向对象会先抽象出对象,然后用对象执行方法的方式解决问题

对象相等和引用相等的区别?
对象相等一般比较的是内存中存放的内容是否相等
引用相等一般比较的是他们指向的内存地址是否相等
如果是基本数据类型用==,比较的是数值是否相等
如果是引用数据类型,比较的是内存地址是否一样
引用数据类型如果要比较数值,可以用.equals()方法

面向对象三大特征
封装(private,把对象的一部分属性隐藏在内部,不允许外部对象直接访问)
继承(extend,)子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,只是拥有。子类可以拥有自己属性和方法,即子类可以对父类进行扩展。子类可以用自己的方式实现父类的方法。注意,Java只能单继承,就是说子类只能继承一个父类,但是父类可以有多个子类。 但是接口可以多继承
多态:一个对象具有多种状态,具体表现为父类的引用指向子类的实例。

深拷贝和浅拷贝的区别?
浅拷贝:拷贝对象和原对象共用同一个内部对象
深拷贝:完全复制整个对象,包括内部对象
引用拷贝:两个不同的引用指向同一个对象

== 对于基本类型和引用类型的作用效果是不同的:

对于基本数据类型来说,== 比较的是值。
对于引用数据类型来说,== 比较的是对象的内存地址
equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等
String 中的 equals 方法是被重写过的,因为 Object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
hashCode() 和 equals()都是用于比较两个对象是否相等
注意:hashcode值相等不一定代表两个对象相等,因为可能会发生哈希碰撞。
只有hashcode相等并且equals方法返回true,认为两个对象一样。
equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。
两个对象有相同的 hashCode 值,他们也不一定是相等的(哈希碰撞)

string是不可变的(String 类中使用 final 关键字修饰字符数组来保存字符串,所以不可改变),其是线程安全的,stringbuffer也是线程安全的,但stringbuilder不是线程安全的,但其性能有提升。
操作少量的数据: 适用 String
单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

字符串对象通过“+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象 。循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象。如果直接使用 StringBuilder 对象进行字符串拼接的话,就不会存在这个问题了
String 中的 equals 方法是被重写过的,比较的是 String 字符串的值是否相等。 Object 的 equals 方法是比较的对象的内存地址。

字符串常量池作用?
字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

异常:在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类:
exception:程序本身可以处理的异常,可以通过catch来进行捕获
error:程序无法处理的错误,不能通过catch捕获,一般这些异常发生的时候,jvm会选择线程终止。

try-catch-finally 如何使用?
try块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
catch块:用于处理 try 捕获到的异常。
finally 块:无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。
不要在 finally 语句块中使用 return!
如果finally之前虚拟机被终止的话,finally中的代码就不会执行。

动态代理的实现也依赖反射,注解的实现也用到了反射

java中只有值传递:方法接收的实参值的拷贝,会创建副本
引用传递:方法接收的值是实参所引用对象在堆中的地址,不会创建副本,对形参的修改会影响到实参。

java序列化与反序列化:
序列化:将数据结构或对象转换成二进制字节流的过程
反序列化:将在序列化过程中生成的二进制字节流转换成数据结构或者对象的过程
应用场景:
对象在进行网络传输之前先序列化,接收到序列化的对象之后需要反序列化。
对象存储到文件之前需要序列化,将对象读取出来的时候需要反序列化
将对象存储到数据库之前需要序列化,将对象从缓存数据库中读出来需要反序列化
将对象存储到内存之前需要序列化,从内存中读取出来之后需要进行反序列化。
序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。
序列化协议对应:应用层、传输层、网络层、网络接口层

serialVersionUID:版本控制的作用,反序列化的时候会检查是否和当前类一致,不一致会抛出异常。
如果字段不想被序列化,可以用transient进行修饰。
kryo是一个高性能的序列化/反序列化工具(不推荐使用JDK自带的序列化方式,其不支持跨语言调用,性能差且存在安全问题)

反射:本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451187.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【maven下载、安装、配置教程】

一、下载 maven 官网&#xff1a;Maven – Download Apache Maven 注意&#xff1a;idea 和 maven 的版本问题&#xff0c;不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本&#xff0c;用 3.9版本的 maven 会报错。 二、配置maven全局配置…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州成功举办&#xff0c;大会以“AI芯片AI应用AloT”为主题&#xff0c;通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联&#xff0c;吸引数千名开发者、合作伙伴以及行业专…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

Java基础-接口

文章目录 1.快速入门代码&#xff1a;结果&#xff1a; 2.接口基本介绍1.语法注意&#xff1a;在jdk1.8以后接口才可以有静态方法&#xff0c;默认方法 2.代码实例 3.接口的应用场景1.场景介绍2.代码实例4.接口使用细节 5.接口课堂练习题目&#xff1a;答案&#xff1a;注意&am…

【快速上手QT】08-Buttons组件

我们差不多把QT的基础部分讲差不多了。接下来我们把一些组件介绍一下&#xff0c;最后再开始QT的进阶部分&#xff0c;需要先把基础打牢嘛&#xff0c;也当是练习练习怎么使用QT助手了。 就按照QtDesigner里的顺序&#xff0c;今天我们讲一讲Buttons&#xff0c;也就是按钮组件…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息&#xff0c;如 ls --help&#xff0c;help ls&#xff0c;man ls&#xff0c;info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时&#xff0c;可以使用快捷键进行操作

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

深入浅出Java泛型

公众号「稀有猿诉」 原文链接 深入浅出Java泛型 温故而知新&#xff0c;可以为师矣&#xff01; 在前面的一篇文章中学习了Kotlin的泛型知识&#xff0c;但总感觉还不够深入&#xff0c;因为一些深入的话题和高级的特性并未有讲清楚。但在继续深入之前还是有必要重温一下…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09; 第一门课&#xff1a;神经网络和深度学习 (Neural Networks an…

04-微服务 面试题

目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…

scrapy的基本使用介绍

创建项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架 scrapy startproject my_spider### 4. 生成项目 scrapy genspider baidu https://www.b…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接&#xff1a;https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码&#xff1a;v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…

15. UE5 RPG获取GE应用的回调,并根据Tag设置数据显示到窗口

在上一篇介绍了对标签如何在项目中设置&#xff0c;这一篇先讲解一下如何在GE里面使用GameplayTag标签。 之前我在第十一章节中 11. UE5 RPG使用GameplayEffect修改角色属性&#xff08;二&#xff09;介绍了一些GE的属性&#xff0c;在UE 5.3版本中&#xff0c;修改的配置方式…

SpringBoot中MD5使用

SpringBoot中MD5使用 新建md5类 public final class MD5 {public static String encrypt(String strSrc) {try {char[] hexChars {0, 1, 2, 3, 4, 5, 6, 7, 8,9, a, b, c, d, e, f};byte[] bytes strSrc.getBytes();MessageDigest md MessageDigest.getInstance("MD5…

云游戏发行是什么?云游戏发行的演进历程

云游戏发行是一系列基于云游戏技术的游戏发行策略或行为&#xff0c;融合云试玩、云微端、可玩广告、跨端移植等技术&#xff0c;从而在传统游戏发行生态的基础上实现更为卓越的发行效果。 云游戏发行出现的原因 近年来&#xff0c;游戏市场出现负增长。其原因一方面在于游戏版…

高颜值抓包工具Charles,实现Mac和IOS端抓取https请求

Hi&#xff0c;大家好。在进行测试的过程中&#xff0c;不可避免的会有程序报错&#xff0c;为了能更快修复掉Bug&#xff0c;我们作为测试人员需要给开发人员提供更准确的报错信息或者接口地址&#xff0c;这个时候就需要用到我们的抓包工具。 常见的抓包工具有Fiddler、Char…

LeetCode_Java_二叉搜索树系列(题目+思路+代码)

目录 108.将有序数组转化为二叉搜索树 109.有序链表转换二叉搜索树 876.链表的中间节点 108.将有序数组转化为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 示例 1&#xff1a; 输入&#xf…

vscode使用svn

网上这种文章很多&#xff0c;但很多都实现不了&#xff0c;自己亲测安装有效的过程记录下来&#xff0c;分享给大家。 第一步&#xff1a;去官网下载svn.安装TortoiseSVN 下载地址 下载的地址&#xff1a; Apache Subversion Binary Packageshttps://subversion.apache.or…