当前位置: 首页 > news >正文

Java 基础知识点

537ca3d0e5204e6cb1df52a7bfe56c9b.jpgObject 类相关方法

 

getClass 获取当前运行时对象的 Class 对象。

hashCode 返回对象的 hash 码。

clone 拷贝当前对象, 必须实现 Cloneable 接口。浅拷贝对基本类型进行值拷贝,对引用类型拷贝引用;深拷贝对基本类型进行值拷贝,对引用类型对象不但拷贝对象的引用还拷贝对象的相关属性和方法。两者不同在于深拷贝创建了一个新的对象。

equals 通过内存地址比较两个对象是否相等,String 类重写了这个方法使用值来比较是否相等。

toString 返回类名@哈希码的 16 进制。

notify 唤醒当前对象监视器的任一个线程。

notifyAll 唤醒当前对象监视器上的所有线程。

wait 1、暂停线程的执行;2、三个不同参数方法(等待多少毫秒;额外等待多少毫秒;一直等待)3、与 Thread.sleep(long time) 相比,sleep 使当前线程休眠一段时间,并没有释放该对象的锁,wait 释放了锁。

finalize 对象被垃圾回收器回收时执行的方法。

2、基本数据类型

整型:byte(8)、short(16)、int(32)、long(64)

浮点型:float(32)、double(64)

布尔型:boolean(8)

字符型:char(16)

3、序列化

Java 对象实现序列化要实现 Serializable 接口。

 

反序列化并不会调用构造方法。反序列的对象是由 JVM 自己生成的对象,不通过构造方法生成。

序列化对象的引用类型成员变量,也必须是可序列化的,否则,会报错。

如果想让某个变量不被序列化,使用 transient 修饰。

单例类序列化,需要重写 readResolve() 方法。

4、String、StringBuffer、StringBuilder

String 由 char[] 数组构成,使用了 final 修饰,是不可变对象,可以理解为常量,线程安全;对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。

StringBuffer 线程安全;StringBuiler 线程不安全。

操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。

5、重载与重写

重载 发生在同一个类中,方法名相同,参数的类型、个数、顺序不同,方法的返回值和修饰符可以不同。

重写 发生在父子类中,方法名和参数相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 或者 final 则子类就不能重写该方法。

6、final

修饰基本类型变量,一经出初始化后就不能够对其进行修改。

修饰引用类型变量,不能够指向另一个引用。

修饰类或方法,不能被继承或重写。

7、反射

在运行时动态的获取类的完整信息

增加程序的灵活性

JDK 动态代理使用了反射

8、JDK 动态代理

使用步骤

创建接口及实现类

实现代理处理器:实现 InvokationHandler ,实现 invoke(Proxy proxy,Method method,Object[] args) 方法

通过 Proxy.newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h) 获得代理类

通过代理类调用方法。

9、Java IO

普通 IO ,面向流,同步阻塞线程。

NIO,面向缓冲区,同步非阻塞。

二、Java 集合框架

1、List(线性结构)

ArrayList Object[] 数组实现,默认大小为 10 ,支持随机访问,连续内存空间,插入末尾时间复杂度 o(1),插入第 i 个位置时间复杂度 o(n - i)。扩容,大小变为 1.5 倍,Arrays.copyOf(底层 System.ArrayCopy),复制到新数组,指针指向新数组。

Vector 类似 ArrayList,线程安全,扩容默认增长为原来的 2 倍,还可以指定增长空间长度。

LinkedList 基于链表实现,1.7 为双向链表,1.6 为双向循环链表,取消循环更能分清头尾。

2、Map(K,V 对)

HashMap

底层数据结构,JDK 1.8 是数组 + 链表 + 红黑树,JDK 1.7 无红黑树。链表长度大于 8 时,转化为红黑树,优化查询效率。

初始容量为 16,通过 tableSizeFor 保证容量为 2 的幂次方。寻址方式,高位异或,(n-1)&h 取模,优化速度。

扩容机制,当元素数量大于容量 x 负载因子 0.75 时,容量扩大为原来的 2 倍,新建一个数组,然后转移到新数组。

基于 Map 实现。

线程不安全。

HashMap (1.7) 多线程循环链表问题

在多线程环境下,进行扩容时,1.7 下的 HashMap 会形成循环链表。

怎么形成循环链表: 假设有一 HashMap 容量为 2 , 在数组下标 1 位置以 A -> B 链表形式存储。有一线程对该 map 做 put 操作,由于触发扩容条件,需要进行扩容。这时另一个线程也 put 操作,同样需要扩容,并完成了扩容操作,由于复制到新数组是头部插入,所以 1 位置变为 B -> A 。这时第一个线程继续做扩容操作,首先复制 A ,然后复制 B ,再判断 B.next 是否为空时,由于第二个线程做了扩容操作,导致 B.next = A,所以在将 A 放到 B 前,A.next 又等于 B ,导致循环链表出现。

HashTable

线程安全,方法基本全用 Synchronized 修饰。

初始容量为 11 ,扩容为 2n + 1 。

继承 Dictionary 类。

ConcurrentHashMap

线程安全的 HashMap。

1.7 采用分段锁的形式加锁;1.8 使用 Synchronized 和 CAS 实现同步,若数组的 Node 为空,则通过 CAS 的方式设置值,不为空则加在链表的第一个节点。获取第一个元素是否为空使用 Unsafe 类提供的 getObjectVolatile 保证可见性。

对于读操作,数组由 volatile 修饰,同时数组的元素为 Node,Node 的 K 使用 final 修饰,V 使用 volatile 修饰,下一个节点也用 volatile 修饰,保证多线程的可见性。

LinkedHashMap LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。

TreeMap 有序的 Map,红黑树结构,可以自定义比较器来进行排序。

Collections.synchronizedMap 如何实现 Map 线程安全? 基于 Synchronized ,实际上就是锁住了当前传入的 Map 对象。

3、Set(唯一值)

HashSet 基于 HashMap 实现,使用了 HashMap 的 K 作为元素存储,V 为 new Object() ,在 add() 方法中如果两个元素的 Hash 值相同,则通过 equals 方法比较是否相等。

LinkedHashSet LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的。

TreeSet 红黑树实现有序唯一。

三、Java 多线程

1、synchronized

修饰代码块 底层实现,通过 monitorenter & monitorexit 标志代码块为同步代码块。

修饰方法 底层实现,通过 ACC_SYNCHRONIZED 标志方法是同步方法。

修饰类 class 对象时,实际锁在类的实例上面。

单例模式

public class Singleton {

 

private static volatile Singleton instance = null;

 

private Singleton(){}

 

public static Singleton getInstance(){

if (null == instance) {

    synchronized (Singleton.class) {

        if (null == instance) {

        instance = new Singleton();

        }

    }

  }

    return instance;

    }

 

 

 

 

}

private static volatile Singleton instance = null;

 

private Singleton(){}

 

public static Singleton getInstance(){

if (null == instance) {

    synchronized (Singleton.class) {

        if (null == instance) {

        instance = new Singleton();

        }

    }

  }

    return instance;

    }

偏向锁,自旋锁,轻量级锁,重量级锁

通过 synchronized 加锁,第一个线程获取的锁为偏向锁,这时有其他线程参与锁竞争,升级为轻量级锁,其他线程通过循环的方式尝试获得锁,称自旋锁。若果自旋的次数达到一定的阈值,则升级为重量级锁。

需要注意的是,在第二个线程获取锁时,会先判断第一个线程是否仍然存活,如果不存活,不会升级为轻量级锁。

2、Lock

ReentrantLock

基于 AQS (AbstractQueuedSynchronizer)实现,主要有 state (资源) + FIFO (线程等待队列) 组成。

公平锁与非公平锁:区别在于在获取锁时,公平锁会判断当前队列是否有正在等待的线程,如果有则进行排队。

使用 lock() 和 unLock() 方法来加锁解锁。

ReentrantReadWriteLock

同样基于 AQS 实现,内部采用内部类的形式实现了读锁(共享锁)和写锁 (排它锁)。

非公平锁吞吐量高 在获取锁的阶段来分析,当某一线程要获取锁时,非公平锁可以直接尝试获取锁,而不是判断当前队列中是否有线程在等待。一定情况下可以避免线程频繁的上下文切换,这样,活跃的线程有可能获得锁,而在队列中的锁还要进行唤醒才能继续尝试获取锁,而且线程的执行顺序一般来说不影响程序的运行。

3、volatile

Java 内存模型

image.png

 

在多线程环境下,保证变量的可见性。使用了 volatile 修饰变量后,在变量修改后会立即同步到主存中,每次用这个变量前会从主存刷新。

禁止 JVM 指令重排序。

单例模式双重校验锁变量为什么使用 volatile 修饰? 禁止 JVM 指令重排序,new Object()分为三个步骤:申请内存空间,将内存空间引用赋值给变量,变量初始化。如果不禁止重排序,有可能得到一个未经初始化的变

相关文章:

Java 基础知识点

Object 类相关方法 getClass 获取当前运行时对象的 Class 对象。 hashCode 返回对象的 hash 码。 clone 拷贝当前对象, 必须实现 Cloneable 接口。浅拷贝对基本类型进行值拷贝,对引用类型拷贝引用;深拷贝对基本类型进行值拷贝,对…...

jenkins容器内CI/CD 项目失败问题

问题: 在jenkins 的docker容器内CI/CD制作vue项目镜像失败 1、docker权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/build?buildargs%…...

CRC 校验码

CRC 校验码 题目解答发送端接收端 题目 假设生成多项式为 G(X)X4X31,要求出二进制序列10110011的CRC校验码 解答 发送端 首先 生成多项式为:G(X)X4X31,改写为二进制比特串为11001(有X的几次方,对应的2的几次方的位就是1) 因为…...

代码随想录二刷day01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、704. 二分查找二、35. 搜索插入位置三、34. 在排序数组中查找元素的第一个和最后一个位置四、69. x 的平方根五、367. 有效的完全平方数六、27. 移除元素七…...

【C++奇遇记】智能的函数探幽

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...

使用wxPython和PyMuPDF在Python中显示PDF目录的实现

展示如何使用wxPython和PyMuPDF库在Python中选择PDF文件并将目录显示在列表框中。 简介: 在本篇教程中,我们将学习如何使用wxPython和PyMuPDF库在Python中选择PDF文件,并将其目录显示在一个列表框中。这将使用户能够方便地浏览PDF文档的目录…...

综述:计算机视觉中的图像分割

一、说明 这篇文章是关于图像分割的探索,这是解决计算机视觉问题(如对象检测、对象识别、图像编辑、医学图像分析、自动驾驶汽车等)的重要步骤之一。让我们从介绍开始。 二、图像分割介绍 图像分割是计算机视觉中的一项基本任务,涉…...

【动态规划基础】数字三角形(IOI1994)

题目描述 数字三角形 输入输出样例 输入样例#1: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5输出样例#1: 30思路: 这题可能看到的第一眼——直接贪心然后一层一层判断呀!!!不过很快又会发现,额___好…...

yolo源码注释2——数据集配置文件

代码基于yolov5 v6.0 目录: yolo源码注释1——文件结构yolo源码注释2——数据集配置文件yolo源码注释3——模型配置文件yolo源码注释4——yolo-py 数据集配置文件一般放在 data 文件夹下的 XXX.yaml 文件中,格式如下: path: # 数据集存放路…...

Java实现根据姓名生成头像(钉钉样式)

头像生成器代码如下: package com.hua.util;import org.apache.commons.lang3.StringUtils;import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.i…...

微信小程序备案流程

微信小程序备案流程 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我…...

JavaScript版本ES5/ES6及后续版本

JavaScript简史 1995: Brendan Eich在短短10天内创建了JavaScript的第一个版本。它被称为摩卡,但已经具备了现代JavaScript的许多基本特性! 1996: 为了吸引Java开发人员,Mocha先是更改为LiveScript,然后又更改为Ja…...

解决Idea 多模块,maven项目是多层级文件夹的子项时无法加入git管理的问题

问题 多模块项目,引入模块无法做git管理,第一个项目没有git分支标志,也不能像其他项目一样右键出git选项。 解决方法 发现该模块是多层级的文件夹结构,也就是项目本身在一个文件夹下。应该是要管理该文件夹。 Settings-Versi…...

yolo源码注释4——yolo-py

代码基于yolov5 v6.0 目录: yolo源码注释1——文件结构yolo源码注释2——数据集配置文件yolo源码注释3——模型配置文件yolo源码注释4——yolo-py yolo.py 用于搭建 yolov5 的网络模型,主要包含 3 部分: Detect:Detect 层Model…...

计算机网络中速率和带宽的区别

速率,指的是连接在计算机网络上的主机在数字信道上传送数据的速率,它也称为数据率或比特率,单位是bps。速率往往指的是额定速率或者标称速率,意思也就是在非常理想的情况下才能达到的数据传送的速率,然而在现实生活中是…...

MySQL数据库练习

目录 表结构 建表 插入数据 1、用SQL语句创建学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在系的默认值是 “计算机”。 2、修改student 表中年龄(age)字段属性,数据类型由…...

Redis BitMap/HyperLogLog/GEO/布隆过滤器案例

面试问题: 抖音电商直播,主播介绍的商品有评论,1个商品对应了1系列的评论,排序展现取前10条记录用户在手机App上的签到打卡信息:1天对应1系列用户的签到记录,新浪微博、钉钉打卡签到,来没来如何…...

POI处理excel,根据XLOOKUP发现部分公式格式不支持问题

poi4不支持XLOOKUP函数,但poi最新的5.2.3却已经对此函数做了支持 poi下载地址:Index of /dist/poi/release/bin 公式源码位置:org/apache/poi/ss/formula/atp/XLookupFunction.java 但是在使用此函数过程中,发现有些XLOOKUP函数会…...

第一次PR经历

第一次PR测试地址:https://github.com/firstcontributions/first-contributions说明文档: https://github.com/firstcontributions/first-contributions/blob/main/translations/README.zh-cn.md...

背上小书包准备面试之TypeScript篇

目录 typescript是啥?与javascript的区别? typescript数据类型? typescript中枚举类型?应用场景? typescript中接口的理解?应用场景? typescript中泛型的理解?应用场景&#xf…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

什么是EULA和DPA

文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​:Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...