当前位置: 首页 > 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…...

超声波流量计的选项分类有哪些?

1、国科EQH/R5100系列小管超声波流量计EQH/R5100系列小管超声波流量计,是一款工业级时差式超声波流量计,专为液体流量测量领域设计,采用外夹式一体设计,具有体积小、易安装等特点,为不同材质管道设计,需要满…...

Vue可视化打印设计终极指南:5分钟告别复杂代码,拖拽式布局惊艳全场

Vue可视化打印设计终极指南:5分钟告别复杂代码,拖拽式布局惊艳全场 【免费下载链接】vue-plugin-hiprint hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 项目地址: https://gitcode.com/gh_mirrors/vu/v…...

转行网安别死磕技术!合规才是企业刚需,运维转更易上岸

很多运维转行网安时,只关注 “技术攻击与防御”(如渗透测试、漏洞挖掘),却忽视了 “合规知识”—— 而合规是企业安全的 “底线要求”,也是网安岗位的 “刚需技能”。随着《网络安全法》《数据安全法》《个人信息保护法…...

Coverband与Rails集成指南:从零到部署的完整流程

Coverband与Rails集成指南:从零到部署的完整流程 【免费下载链接】coverband Ruby production code coverage collection and reporting (line of code usage) 项目地址: https://gitcode.com/gh_mirrors/co/coverband Coverband是一款强大的Ruby生产环境代码…...

别再只写CRUD了!用SpringBoot拦截器和自定义注解,给你的课程设计项目加上专业的权限控制

从零构建SpringBoot权限控制系统:拦截器与注解实战指南 每次课程设计答辩现场,总能看到这样的场景:学生演示着千篇一律的增删改查功能,评委老师皱着眉头问"权限控制怎么实现的",然后全场陷入尴尬的沉默。如果…...

分享 种 .NET 桌面应用程序自动更新解决方案滞

一、Actor 模型:不是并发技巧,而是领域单元 Actor 模型的本质是: Actor 是独立运行的实体 Actor 之间只通过消息交互 Actor 内部状态不可被外部直接访问 Actor 自行决定如何处理收到的消息 Actor 模型真正解决的是: 如何在不共享状…...

GPT-6 Spud倒计时×AI格局变局:2026年4月第一周全景扫描

上一篇 OpenClaw生态模型使用量全景:国产模型主导12.96万亿Token时代 下一篇 GPT-6 Spud深度解析:Symphony架构、双系统推理与OpenAI的AGI豪赌 摘要 2026年4月第一周(3月31日至4月6日),AI行业迎来密集动态&#xff1a…...

IOSSecuritySuite 最佳实践:避免常见陷阱的7个关键点

IOSSecuritySuite 最佳实践:避免常见陷阱的7个关键点 【免费下载链接】IOSSecuritySuite iOS platform security & anti-tampering Swift library 项目地址: https://gitcode.com/gh_mirrors/io/IOSSecuritySuite 在iOS应用开发中,安全防护是…...

香港科技大学破解自动驾驶难题:让AI在虚拟暴风雨中学会驾驶

当你在雨夜开车时,雨滴敲打挡风玻璃,雾气遮挡视线,路面反射着车灯的光芒——这些恶劣天气条件对人类司机来说已经够困难了,对于正在学习驾驶的人工智能来说更是巨大的挑战。这项由香港科技大学、厦门大学和美团联合完成的突破性研…...

紧急!PHP网关CPU飙升至98%却无堆栈痕迹?锁定glibc malloc arena争用导致的工业级假死现象(现场抓取core dump实录)

第一章:紧急!PHP网关CPU飙升至98%却无堆栈痕迹?锁定glibc malloc arena争用导致的工业级假死现象(现场抓取core dump实录)凌晨三点,某支付网关集群中多台PHP-FPM worker进程CPU持续飙至98%,但 g…...