【复习】Java基础

概念

Java的特点

  1. 平台无关性:一次编译,处处运行
  2. 面向对象:封装、继承、多态
  3. 内存管理:Java有自己的垃圾回收机制,不需要手动管理内存。

Java为什么是跨平台的?

JVM不同平台有不同的版本。

我们编写的Java源码,编译后会生成.class文件(字节码文件)。虚拟机就是将字节码文件翻译成指定平台下的机器码运行的。只要在不同平台上安装对应的JVM,就可以运行字节码文件。

编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,需要通过JVM翻译成机器码才能运行,不同平台下的机器码不同,但是字节码却是一样的。

JVM、JDK、JRE的关系?

JVM:Java虚拟机,负责将字节码编译成机器码并执行程序(解释自己的指令集并映射到本地CPU指令集和OS的系统调用)

JRE:Java运行时的环境,是Java程序所需的最小环境,包含JVM和一组类库,用来支持程序的运行。(JRE不包含开发工具,只提供Java程序所需的运行环境)

JDK:Java开发工具包,包含了JVM、编译器(javac)等开发工具。JDK提供了开发、编译、调试和运行Java程序所需的全部工具和环境

Java的解释性和编译性

  1. 编译性:Java源码先被编译成字节码,JIT会把编译后的机器码保存起来,以备下次使用
  2. 解释性:JVM中的一个方法调用计数器,当累计技术大于一定值的时候,就是用JIT进行编译生成机器码文件,否则就是解释器进行解释执行。(字节码也是通过解释器进行解释运行的)

数据类型

八种基本的数据类型

  • 数值类型:long(8)、int(4)、short(2)、byte(1)、double(8)、float(4)
  • 字符类型:char(2)
  • 布尔类型:boolean(1)

数据类型转换的方式

  1. 自动类型转换:int转long、float转double
  2. 强制类型转换:long转int、double转float

为什么用BigDecimal不用double?

double会出现精度丢失的问题,double执行的是二进制的浮点运算,二进制有些情况下不能准确的表示一个小数。

Decimal是精确计算的,一般涉及到金钱的计算都会使用Decimal

在创建BigDecimal对象时,需要使用字符串作为参数,而不是直接使用浮点运算作为数值,以避免浮点数精度丢失。

装箱和拆箱

装箱是基本数据类型转成对应的包装类

拆箱是包装类转成对应的基本数据类型

Integer i = 10; // 装箱
int n = i; // 拆箱

自动装箱的问题

Integer sum = 0;
for(int i = 0; i < 10; ++i) {
 sum += i; // 一直发生装箱、拆箱
}

基本数据类型和引用数据类型不能直接转换,必须使用包装类来实现。

int类型转成String类型:int类型先转成Integer类型;Integer类型转成String类型

Integer的缓存

Integer类的内部实现了一个静态缓存池,用来存储特定范围内(默认:-128~127)的整数值对应的Integer对象。

当创建一个在指定范围内的整数对象时,并不会每次都生成新的对象,而是复用缓存中的现有对象,会直接从内存中取出,不需要新建一个对象

面向对象

怎么理解面向对象?

面向对象是一种编程范式,将现实世界中的事物抽象为对象。面向对象的设计思想以对象为中心,通过对象之间的交互来完成程序的功能。

  • 封装:将对象的数据和方法结合在一起,对外隐藏对象内部的实现细节,只通过对象提供的接口与外界交互
  • 继承:使得子类自动共享父类数据结构和方法的机制,是代码复用的重要手段,通过继承可以实现建立类和类之间的层次关系
  • 多态:允许不同类的对象对同一个消息做出不同的响应。(编译时多态、运行时多态)
    • 方法重载:同一个类可以有多个同名的方法(通过参数列表来区分)
    • 方法重写:子类可以提供对父类同名方法的具体实现
    • 接口的使用:多个类可以实现同一个接口,并通过接口类型的引用来调用这些类的方法
    • 向上转型和向下转型:
      • 向上转型:使用父类的引用指向子类对象
      • 向下转型:将父类引用转化成子类类型(需要确认引用实际指向的对象类型)

面向对象的设计原则

  1. 单一职责原则:一个类应该只有一个引起他变化的原因
  2. 开放封闭原则:软件实体应该对扩展开放,对修改封闭
  3. 里氏替换原则:子类对象应该能够替换所有的父类对象
  4. 接口隔离原则:客户端不应该依赖那些它不需要的接口
  5. 依赖倒置原则:高层模块不应该依赖底层模块
  6. 最少知识原则:一个对象应该对其他对象有最少的了解

抽象类和接口的区别

  1. 抽象类用来描述类的共同行为和特性,可以有成员变量、构造方法、具体方法;接口用来定义行为规范,可以多实现,只有常量和抽象方法
  2. 一个类可以实现(implements)多个接口,但是只能继承(extends)一个类
  3. 接口中只能有定义,不能有方法的实现;抽象类中可以有定义和实现
  4. 接口成员变量默认为public static final,成员方法默认为public abstract;抽象类中成员变量默认default,可以在子类中被重新定义,也可以被重新赋值,抽象类方法被abstract修饰,不能被private、static、synchronized、native修饰,必须以分号结尾。
  5. 抽象类可以包含实例变量和静态遍历;接口只能包含常量

new子类对象的加载顺序?

  • 父类静态成员变量、静态代码块
  • 子类静态成员变量、静态代码块
  • 父类构造方法
  • 子类构造方法

浅拷贝和深拷贝

  • 浅拷贝:只创建一个新的对象,将原对象的字段值放入新对象中,两个对象指向的是同一个引用对象
  • 深拷贝:递归复制对象内部所有引用类型的字段,生成一个全新的对象以及其内部的所有对象,实现方式如下:
    • 实现Cloneable接口并重写clone()方法
    • 将对象序列化为字节流,再从字节流反序列化为对象
    • 手动赋值

对象

Java创建对象的方式

  1. 使用new关键字

  2. 使用Class类的newInstance()方法【反射】

MyClass obj = (MyClass)Class.forName("com.example.MyClass").newInstance();
  1. 使用Constructor的newInstance()方法【反射】
Constructor<MyClass> constructor = MyClass.class.getConstructor();
MyClass obj = constructor.newInstance();
  1. 使用clone方法:如果类实现了Cloneable接口,可以使用clone()方法复制对象
  2. 使用反序列化:将对象序列化到文件中,再使用反序列化创建对象

new出的对象什么时候回收?

通过new创建出的对象,是由gc负责回收的,再程序运行过程中自动进行的,它会周期性检查不再被引用的对象,将其回收释放内存。gc主要是根据一些算法来决定的,主要有:

  1. 可达计数器:某个对象的引用计数器为0,表示该对象可以被回收
  2. 可达分析算法:从GC Root出发,一层层找所引用的对象,如果被找到就是存活对象,其他不可达的对象就是垃圾对象,垃圾对象就会被回收
  3. 终结器(Finalizer):如果对象重写了finalize()方法,gc会在回收该对象之前调用finalize()方法,对象可以在finalize()方法中进行一些清理操作。【不推荐】

反射

什么是反射

在运行过程中,任意一个类,都能够知道这个类的所有属性和方法,任意一个对象,都能调用它的任意一个方法和属性。

  1. 允许在运行时获取类的完整结构信息
  2. 可以使用反射API动态创建对象实例
  3. 可以在运行时动态调用对象的方法
  4. 允许在运行时访问和修改对象的字段值(包括私有的)

注解

Java注解的原理

注解本质是继承了Annotation的特殊接口,具体实现类是Java运行时生成的动态代理类。

通过反射获取注解,其实返回的是Java运行时生成的动态代理对象,通过代理对象调用自定义注解的的方法,最后会调用invoke方法。

注解的作用域

  1. 类级别作用域:描述类的注解,放在类上,用来指定类的一些属性
  2. 方法级别作用域:描述方法的注解,放在方法定义上,用来指定方法的一些属性
  3. 字段级别作用域:用来描述字段的注解,放在字段上,用来指定字段的一些属性

Object

== 与 equals的区别?

  1. 功能不同:==是操作符,用于比较两个变量或对象的引用地址是否相同;equals是一个方法,用于比较两个对象的内容是否相同,他是Object类中的一个方法,子类可以重写这个方法。
  2. 比较对象不同:==适用于基本数据类型(比较值是否相同)和对象引用(比较引用地址是否相同);equals适合于对象内容的比较,对于基本数据类型不能直接用equals,但是可以包装成对应的包装类对象,再使用equals比较
  3. 默认行为不同:equals对于未重写equals方法的子类来说,equals方法的行为与==相同,只有在类里重写了equals方法后,才会根据重写的方法逻辑进行比较
  4. 性能不同:==速度比较快,equals速度比较慢

String、StringBuffer、StringBuilder的区别?

  1. String是不可变的字符串,因为他的不可变性,在拼接字符串的时候就会产生很多无用的中间对象(线程安全)
  2. StringBuffer就是为了解决String在拼接字符串的时候产生大量中间对象而提供的类。它是可变的,是线程安全的。
  3. StringBuilder和StringBuffer本质上没什么区别,但是它是线程不安全的,减少了开销。

速度:String < StringBuffer < StringBuilder

适用场景:

  • String:操作少量数据
  • StringBuffer:多线程操作大量数据
  • StringBuilder:单线程操作大量数据

序列化

怎么把一个对象从一个jvm转移到另一个jvm

  1. 使用序列化和反序列化:将一个对象序列化为字节流,并将其发送到另一个JVM,在另一个JVM进行反序列化恢复对象。
  2. 使用消息队列
  3. 使用远程方法调用(RPC):在分布式系统中调用远程JVM上对象的方法
  4. 使用共享数据库或缓存:将对象存储在共享数据库或共享缓存中,让不同的JVM可以访问这些共享数据。

I/O

Java怎么实现网络IO高并发编程

传统的BIO:如果TCP RecvBuffer里没有数据,函数会一直阻塞,直到收到数据,返回读取到的数据,如果BIO想要并发处理多个客户端的IO,只能使用多线程模式,一个线程专门处理一个客户端io,随着客户端越来越多,所需要的线程也会增多,会消耗系统的性能。

Java NIO:同步非阻塞的I/O模型,基于IO多路复用,可以用一个线程处理多个客户端IO

  • BIO:传统的java.io包,基于流模型实现,在读写动作完成之前,线程会阻塞。代码比较直观,但是IO的效率和扩展性差
  • NIO:java.nio包,提供了Channel、Selector、Buffer等抽象,同步非阻塞的IO程序,同时提供了更接近操作系统底层高性能的数据操作方式
  • AIO:是NIO的升级版,提供了异步非阻塞的IO,应用操作后会直接返回,不会阻塞在那里,当后台处理完成后,操作系统会通知响应的线程进行后续的操作。

NIO是怎么实现的?

NIO:同步非阻塞的IO模型。

  • 同步:线程不断轮询IO事件是否就绪

  • 非阻塞:线程在等待IO的时候可以同时做其他任务

同步的核心是Selector,Selector代替线程本身的IO实践,避免了阻塞同时减少了不必要的线程消耗

非阻塞的核心是通道和缓冲区,当IO事件就绪时,可以通过写到缓冲区保证IO的成功,而无需线程阻塞式等待

NIO由一个专门的线程处理所有的IO事件,负责并发。

Netty的IO模型式基于非阻塞IO实现的。

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

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

相关文章

四步彻底卸载IDEA!!!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习四步彻底卸载IDEA&#xff01;&#xff01;&#xff01; 首先我要提醒各位 如果你想删除 IDEA 相关&#xf…

Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现

Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台&#xff0c;支持云端认证、本地部署、全部功能开放&#xff0c;并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作&#xff0c;使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案&#xff0…

BIRCH算法深度解析与实践指南

一、算法全景视角 BIRCH&#xff08;Balanced Iterative Reducing and Clustering using Hierarchies&#xff09;是首个针对超大规模数据集的聚类算法&#xff0c;可在有限内存下高效处理十亿级数据。其核心创新在于采用CF Tree数据结构&#xff0c;将数据压缩为多级聚类特征…

更改conda 环境默认安装位置

一、找到".condarc" Windows 下&#xff0c;~/.condarc 文件通常位于 C:\Users\<你的用户名>\.condarc 二、修改内容 在.condarc 里添加上 envs_dirs:- D:\ProgramData\anaconda3\envs- C:\Users\<你的用户名>\.condarc &#xff08;第一个优先&…

vue怎么设置允许局域网手机访问

打开vite.config.ts 添加 server: {host: 0.0.0.0}, host: 0.0.0.0&#xff1a;设置为0.0.0.0&#xff0c;允许从所有IP访问。port: 5173&#xff1a;指定端口号&#xff0c;可以根据需要进行修改。不指定默认 5173disableHostCheck: true&#xff1a;禁用主机检查&#xff0c…

【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 秘钥创建与配置

文章目录 1 前言2 准备工作3 具体配置过程3.1. 本地生成 GPG 密钥3.2. 导出 GPG 密钥3.3. 将密钥配置到 Git 中3.4. 测试提交 4 问题排查记录5 小结与复盘 1 前言 昨天在更新我的第二个 Vim 专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git 操作问题&#xff1a;如何在 …

为什么继电器要加一个反向并联一个二极管

1 动感就是电流不突变 2 为什么有的继电器上面要反向并联一个二极管和电阻 1 并联二极管是为消除掉动感产生的高压 2 加上二极管是为了让继电器更快的断开&#xff08;二极管选型的工作电流要大于动感电流&#xff0c;开关要够快&#xff09; 3 公式&#xff1a;二极管压降0…

每日精讲:删除有序数组中的重复项,移除元素,合并两个有序数组

一 移除元素 1题目链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 2题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

关于使用带elementplus前缀图标的步骤

关于使用带elementplus前缀图标的步骤 官网 安装 | Element Plus 1.需要全局注册 2.使用某个图标时导入&#xff0c; 如 import { Search } from element-plus/icons-vue

DPVS-3: 双臂负载均衡测试

测试拓扑 双臂模式&#xff0c; 使用两个网卡&#xff0c;一个对外&#xff0c;一个对内。 Client host是物理机&#xff0c; RS host都是虚拟机。 LB host是物理机&#xff0c;两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件&#xff0c;其中…

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …

数据分析与算法设计-作业2-拉普拉斯算子空间滤波和增强

作业2 题目 对Flower.dat图像&#xff08;10241024&#xff0c;np.uint8&#xff09;用如下拉普拉斯算子进行空间滤波和增强&#xff1a;np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])&#xff0c;图像边缘采用复制填充方式&#xff0c;不使用其他第三方库&#xff0c;使…

SpringBoot+Vue+微信小程序的猫咖小程序平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当下这个高速发展的时代&#xff0c;网络科技正以令人惊叹的速度不断迭代更新。从 5G …

基于SpringBoot的二手交易系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会&#xff0c;随着电子商务的蓬勃发展和人们消费观念的转变&#xff0c;二手物品交易逐渐成为了一种新的生活方式。人们越来越倾向于将不再需要的物品进行二次交易&#xff0c;以实现资源的有效利用和环保理念的实践。…

vscode无法预览Markdown在线图片链接

问题&#xff1a;在VSCode中&#xff0c;打开MarkDown文件&#xff0c;存在在线图片链接&#xff0c; 但是在预览时却无法显示。 原因&#xff1a;因为Visual Studio Code中的MarkDown默认配置中只允许载入安全内容 解决方法&#xff1a; 1、输入快捷键 Ctrl Shift P 打开…

Power Query M函数

文章目录 三、PQ高阶技能&#xff1a;M函数3.1 M函数基本概念3.1.1 表达式和值3.1.2 计算3.1.3 运算符3.1.4 函数3.1.5 元数据3.1.6 Let 表达式3.1.6 If 表达式3.1.7 Error 3.2 自定义M函数3.2.1 语法3.2.2 调用定义好的自定义函数3.2.3 直接调用自定义函数3.2.4 自定义函数&am…

election靶机渗透测试

发现靶机ip地址 使用nmap进行扫描端口发现详细信息nmap -T4 -sV -sC -p- 192.168.52.142 用dirsearch扫一下网站的目录 看到一个phpinfo 一个phpmyadmin的登录页面 robots.txt文件 看一下这个election目录下并没有发现什么 继续进行目录扫描&#xff0c;这时候看到一个admin的l…

为AI聊天工具添加一个知识系统 之119 详细设计之60 圣灵三角形和Checker 之2

本文要点 要点回顾 我们回顾一下本题目的讨论内容。 我的想法是&#xff0c; 将Substance 作为 面向服务的架构的起点并基于差异来自下而上地分类 实体--目的是实体职责单一化&#xff0c;将Object作为面向对象的语义差异的系统原点 并沿着差异继承的路径来至上而下地划分对…

安全生产月安全知识竞赛主持稿串词

女:尊敬的各位领导、各位来宾 男:各位参赛选手、观众朋友们 合:大家好&#xff5e; 女:安全是天&#xff0c;有了这一份天&#xff0c;我们的员工就会多一份幸福&#xff0c; 我们的企业就会多一丝光彩。 男:安全是地&#xff0c;有了这一片地&#xff0c;我们的员工就多了一…