JAVA学习
文章平均质量分 92
Noblegasesgoo
一只苦逼的大学软件工程小萌新,目前更新的自己的学习日记博客,绝大多数都是从课程中得到的代码内容并自己加以细致的注释得来的,在我之后更深的学习之后,我会逐渐修改我的之前博客内容,添加上属于真正自己的示例,希望大家能够多多包涵,github/gitee同名
展开
-
Java并发编程经典题目整理(2022.03.11 更新)
有关多线程部分的经典题目整理,持续更新ing......原创 2022-03-12 19:11:44 · 974 阅读 · 0 评论 -
简易秒杀系统-优化(详细注释)
简易秒杀系统的优化过程(入门级),用到了缓存,消息中间件等技术原创 2022-02-18 21:47:54 · 1263 阅读 · 2 评论 -
JAVA多线程-线程池源码详解
线程池详解FutureTask详解Future 表示了一个任务的生命周期,是一个可取消的异步运算。可以把它看作是一个异步操作的结果的占位符。他将在未来的某个时刻完成,并提供对其结果的访问。并发包中许多异步任务类都继承自 Future,最典型的就属 FutureTask 了。线程池的体系结构从 JDK5 开始,工作单元和执行机制被分离开来了,工作单元包括了 Runnable 和 Callable,而执行机制由 Executor 框架提供。/* |_ java.util.concur原创 2022-02-08 22:12:00 · 694 阅读 · 0 评论 -
JAVA多线程-生产者消费者模型
生产者消费者模型一个经典的同步模型。在Java中要制作这个模型,得满足以下几个条件:高内聚低耦合前提下,线程操纵资源类。判断、干活、唤醒通知。严防多线程并发状态下的虚假唤醒。传统的:sync、wait、notifyJUC变种:lock、await、signal以上这俩种都不是我们的重点。下面还是来实现一下。传统JUC锁版示例双线程情况,大于双线程就得加多个 conditionclass Data { private int number原创 2022-01-27 22:02:45 · 650 阅读 · 0 评论 -
JAVA多线程-常用JUC工具类及阻塞队列
工具类CountDownLactch简述允许一个或多个线程等待,直到在其他线程中执行的一组操作完成,同步辅助。CountDownLatch 类用给定的计数初始化。await 方法阻塞,直到由于 countDown() 方法的调用而导致当前计数达到零后所有等待线程被释放,并且任何后续的 await 调用立即返回。这是一个一次性的计数操作,因为计数无法重置。如果需要重置计数的版本,请考虑使用 **CyclicBarrier **类。构造函数/* 参数 count 减的次数原创 2022-01-27 21:59:56 · 1079 阅读 · 0 评论 -
JAVA多线程-JAVA锁有关内容
可重入锁(递归锁)什么是可重入锁指的是同一线程的外层函数获得锁之后,内层递归函数仍能获取该锁的代码。在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。线程可以进入一个它已经拥有的锁所同步着的代码块!也就是说,已经加锁的代码块中还有有锁方法调用,那么这个调用的方法也会获取这个锁。锁定的是对象,如果获得锁了,那么被这个锁修饰的方法/代码块都可以进行访问。// method01 是上锁了的,此时内部调用了 method02 方法,// 此时虽然 method02 也是同步方法,但原创 2022-01-27 21:58:05 · 479 阅读 · 0 评论 -
JAVA多线程-集合类线程不安全问题
ArrayList线程不安全案例package JUC;import java.util.ArrayList;import java.util.List;import java.util.UUID;/** * @author zhaolimin * @date 2021/11/13 * @apiNote ArrayList类不安全测试 */public class ArrayListNotSafeDemo { public static void main(String原创 2022-01-27 21:56:22 · 2863 阅读 · 0 评论 -
多线程-CAS
什么是CAS操作通俗来讲就是比较并交换(Compare And Swap)。是一条CPU并发原语。他是判断内存某个位置的值是否为预期值,如果是则更改为新值,否则线程不挂起,持续比较到主内存与工作内存中的值一致为止。整个执行过程都是满足原子性的。为什么不会造成数据不一致CAS操作体现在Java语言之中就是 Unsafe类 中的各个方法。调用 Unsafe类 中的CAS操作,JVM 会帮我们实现出 CAS的汇编指令。这是一种完全依赖于硬件的功能,通过它实现原子操作。实现逻辑原创 2022-01-27 21:54:29 · 733 阅读 · 0 评论 -
多线程-有关JMM、Volatile
JMM它并不是真实存在的,它描述的是一组规范或者说是规则。通过这组规范定义了程序中的各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式。| JMM内存模型图示JMM关于同步的规定线程解锁前:必须把共享变量的值刷新回主存。线程加锁前:必须读取主存中最新的共享变量的值到自己的工作内存中。加锁和解锁的锁是同一把锁。主内存相当于堆内存。这个主内存不是JAVA虚拟机的而是硬件上的内存条的内存。工作内存相当于栈内存。但是他有指向堆内存的指针。原创 2022-01-25 10:32:38 · 435 阅读 · 0 评论 -
多线程-并发编程相关概念
JMM并发编程模型的分类● 提出这些模型的原因是为了解决线程(并发活动的执行体)之间如何通信以及线程之间如何同步。● 命令式编程之中,线程之间的通信机制有两种:共享内存、消息传递。● JAVA 的并发采用的是共享内存模型,所以JAVA线程之间的通信是隐式进行的,整个通信的过程对于程序员来说是完全透明的!共享内存● 线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式的进行通信。● 在该模型中,线程同步是显式进行的,程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。消原创 2022-01-25 10:25:23 · 270 阅读 · 0 评论 -
ConcurrentHashMap的JDK1.7源码解析(含详细注释)
为什么HashTable慢HashTable 虽然它是一个线程安全的类,但是它是使用 synchronized 关键字来修饰一些操作。synchronized 锁住了一整个哈希表。导致同一时期只有一个线程可以进行对哈希表的操作。所以 HashTable 虽然线程安全但是它慢,一个人操作所有人等待,并发值就是1。ConcurrentHashMap在 JDK1.5 ~JDK1.7 中,ConcurrentHashMap 这个类它使用的是分段锁的机制来实现并发控制的。数据结构分段锁可以这原创 2022-01-24 21:24:19 · 1241 阅读 · 0 评论 -
ConcurrentHashMap的JDK1.8源码解析(含详细注释)
概述在 JDK1.7 中我们的 ConcurrentHashMap 是靠分段锁来实现并发环境下线程安全的,采用的是 数组 + 链表 的数据结构。在 JDK1.8 中我们的 ConcurrentHashMap 是靠 数组+链表+红黑树 的数据结构,用 CAS 操作来实现并发环境下的线程安全。数据结构采用 数组 + 链表 + 红黑树 的数据结构。总体上和 HashMap 没有什么区别,就是需要实现并发环境下的线程安全,所以源码中要考虑的比 HashMap 要多,结构会更复杂一点。|原创 2022-01-24 21:23:22 · 482 阅读 · 0 评论 -
HashMap的JDK1.7源码解析(含详细注释)
数据结构JDK1.7 中的 HashMap 的底层结构是数组加单向链表实现的。将 key的hash值 进行取模获取哈希表下标,既即将存放的元素的数组的位置,然后到对应的链表中进行 put 和 get 操作。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNs2ocrX-1643030061325)(C:\Users\noblegasesgoo\AppData\Roaming\Typora\typora-user-images\image-20211107125432原创 2022-01-24 21:15:34 · 386 阅读 · 0 评论 -
HashMap的JDK1.8源码解析(不含红黑树,含详细注释)
HashMap的源码总结(不含红黑树)1、属性总结1.1 总览属性名描述static final int MAXIMUM_CAPACITY = 1 << 30;哈希表的最大大小,绝对也是二的幂,这里 一左移三十位,就是 2^30。static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;哈希表的默认大小,绝对是二的幂,这里 一左移四位,就是 2^4 = 16。static final float D原创 2022-01-24 21:08:59 · 469 阅读 · 0 评论 -
LinkedList的源码解析(含详细注释)
1、今日阅读部分1.1 三个基本参数以及一个重要的节点内部类size 属性代表了 LinkedList 目前链表中元素的个数。头尾指针就是为了辨别链表哪是头哪是尾。这里用到了 transient 关键字,之前一直没用过这个关键字,查阅文档之后才知道被该关键字修饰的成员变量在保存对象时,该属性并不会被保存,也就是不能被序列化。// 被改关键字标注的属性不可被序列化 // 代表了 LinkedList 对象目前元素的个数。 transient int size = 0;原创 2022-01-24 21:04:11 · 396 阅读 · 0 评论 -
ArrayList的源码解析(含详细注释)
ArrayList的源码自学1、今日阅读部分1.1、五个重要参数DEFAULT_CAPACITY(集合默认容量大小)。EMPTY_ELEMENTDATA(用于空实例的共享空数组实例)。DEFAULTCAPACITY_EMPTY_ELEMENTDATA(共享的空数组实例用于默认大小的空实例)。elementData(arraylist 中存数据的地方)。size(数据元素个数)。 * Default initial capacity. * 集合的默认容量为10原创 2022-01-24 21:01:12 · 463 阅读 · 0 评论 -
Spring Cloud 学习笔记(持续更新)
1 微服务1.1 spring cloud 是什么他是一套分布式框架集合,基于 spring boot 开发的。他是一种规范。将不同公司生产的不同组件以 spring boot 的风格来集成。这样的话,开发者就不用关心组件之间的整合,开箱即用,需要哪个组件直接用 spring boot 整合进来。1.2 什么是 spring cloud alibaba在 spring cloud 规范下出现的具体一套解决方案。2 eureka 注册中心2.1如何在多个微服务中发送远程 http 请原创 2021-09-11 17:50:06 · 472 阅读 · 2 评论 -
Spring5知识点综合笔记
目录:1.初次使用spring5:maven配置如下第一步:创建名为applicationContext的资源文件,将资源文件的框架导入:第二步,开始写读取xml文件的核心代码:第三步,利用junit测试:番外:如何配置有参构造函数?总结:2、spring的配置2.1 别名(alias了解)2.2 Bean的配置(掌握)2.3 导入(import)3、依赖注入3.1 构造器注入3.2 Set方式注入==(重点)==4、Bean的作用域4.1 单例模式(spring的默认机制,单线程一般使用这个模式)4.2原创 2021-04-14 20:57:32 · 279 阅读 · 0 评论 -
JAVA学习日记:JDBC(7)
今日学习的主要内容有:1.数据库中事务的概念2.JDBC对事物的支持数据库中事务的概念: 定义: 它是数据库中的一个概念,就是一个独立的逻辑工作单元。它由一些特定的SQL语句来组成, 这些SQL语句会作为一个整体同时完成或者不完成某件事情。事务为数据库提供了读访问的 一致性。 特点: 原子性:事物要么全部成功完成,要么都不执行。 一致性:总会保持一致性的状态,数据库中的引用、约束条件在这些事物中也要得到满足。 隔离性:多事务处理操作相原创 2020-11-22 16:10:26 · 271 阅读 · 0 评论 -
JAVA学习日记:JDBC(6)
今天我的所学内容:1.元数据2.如何获取结果集以及数据库产品的元数据元数据: MetaData,定义数据的数据。 抽象出来就好比我们定义这个水果叫苹果,我们就是苹果的元数据。(只不过我们和苹果都不是数据罢了)。如何获取结果集以及数据库产品的元数据:DatabaseMetaData接口: 用于描述和封装数据库的元数据的接口。 它的对象由Connection接口中的getMetaData()方法获得。 方法: getDatabasePr原创 2020-11-21 17:20:27 · 162 阅读 · 0 评论 -
JAVA学习日记:JDBC(5)
本节课我学习的主要内容有:1.RowSet以及其子接口RowSet以及其子接口:RowSet: 行集的概念是JDBC3.0之后出现的概念。 行集能够对结果集进行包装的操作,继承自ResultSet接口。 行集包含了表格数据的对象。 它的子接口: JdbcRowSet: 它是一个持续保持连接的RowSet,他与一个具有ResultSet.TYPE_SCOLL_INSENSITIVE原创 2020-11-20 17:55:41 · 164 阅读 · 0 评论 -
JAVA学习日记:JDBC(4)
本节课我学习的主要内容有:1.PreparedStatement接口PreparedStatement接口: 该接口是Statement接口的子接口。 表示预处理的Statement封装语句,通过?来向sql语句传入参数。 允许传入不同的参数重复执行sql语句。 优点: 增加了预编译的功能,可以预防sql注入。 提高了语句执行速度。 可以设置参数。Test01类(测试传参之后的各种对接数据库的方法):package LessonFo原创 2020-11-18 21:47:15 · 159 阅读 · 0 评论 -
JAVA学习日记:JDBC(3)
本节课我学习的主要内容有:1.ResultSet接口ResultSet接口: 它的对象封装的是数据查询后的结果。 方法: first() 移动到第一行。 next() 游标后移一位。 previous() 游标前移一位。 getXXXX() 返回当前行的某一列数据。 updateXXXX() 更新当前行中的某一列数据。 absolute() 游标的绝对定位。 relative() 游标的相对定位。原创 2020-11-17 21:55:24 · 166 阅读 · 0 评论 -
JAVA学习日记:JDBC(2)
本节课我学习的主要内容有:1.Connection接口2.Statement接口Connection接口: Connection类型的接口对象表示一个数据库连接。 基本方法: setAutoCommit() 设置事务是否自动提交。默认自动提交。 commit() 提交事务。 rollback() 回滚事务。 getMetaData() 得到DatabaseMetaData实例,及其数据库的元数据。 creatStatement(原创 2020-11-16 14:21:56 · 145 阅读 · 1 评论 -
JAVA学习日记:JDBC(1)
本节课我学习的主要内容有:1.什么是JDBC(Java DataBase Connectivity)2.如何连接Oracle数据库什么是JDBC(Java DataBase Connectivity):java数据库连接,用于访问数据库的java应用程序API;可以使用它提供的语法对多种关系型数据库进行高效的访问,并且你不用担心不同数据库语言的差异。 它提供了标准的与具体数据库产品无关的接口以此与任何关系数据库来进行交互。通常用它来和java应用程序与数据库间的连接,操作数据库中的数据原创 2020-11-15 20:56:52 · 145 阅读 · 0 评论 -
JAVA学习日记:I/O流(6)
本节课我学习的主要内容有:1.什么是RandomAccessFile什么是RandomAccessFile: 它能够同时读写文件,有点c/c++那味,在特定情况下比较好用。 不属于Input/OutputStream结构层次的成员。 访问模式: r:以只读的模式打开文件。 rw:以读写模式打开文件,如果文件不存在,则创建该文件。 rws:对文件内容进行修改,元数据会立即写入存储设备之外,其余功能的基本与rw相同。一般有缓冲。 rwd原创 2020-11-14 19:30:00 · 153 阅读 · 0 评论 -
JAVA学习日记:I/O流(5)
本节课我学习的主要内容有:1.字符流2.Unicode编码字符流:字符流是可以直接操作Unicode字符数据的流,它读写的单位是字符,字符是有编码的、字符流自动进行字符集的转换: 默认情况下: 输入:是从OS操作系统字符集转换成Unicode字符集。 输出:是从Unicode字符集转化成OS操作系统默认字符集。 当需要处理字符组成的数据时,我们使用字符流会更方便。 字符流顶层结构是Reader和Writer。Unicode编码:Unicode编码是原创 2020-11-13 17:17:34 · 125 阅读 · 0 评论 -
JAVA学习日记:I/O流(4)
本节课我学习的主要内容有:1.如何去读写基本数据类型的数据2.什么是对象的序列化以及反序列化如何去读写基本数据类型的数据:相关的类: DataInputStream类: 初始化: DataInputStream(FileInputStream NAME); 以与机器无关的方式从输入流中读取基本数据类型数据,可以得到任意文件的数据。 DataOutputStream类: 初始化: DataOutputStream(FileOutputStream NAM原创 2020-11-12 21:37:00 · 129 阅读 · 0 评论 -
JAVA学习日记:新日期时间类
本节课我学习的主要内容有:1.新日期时间类与旧日期时间类的区别2.新日期时间类新日期时间类与旧日期时间类的区别: 过去版本日期时间API的局限性: 老版本的日期时间类是直接封装两部分内容:时间、日期。 封装的是一个距离1970年至今的毫秒数,应用不直观,不方便。 时间、日期数据操作起来相对繁琐、复杂。 它们不是线程安全的。 新版本日期时间API的局限性: 能够很好的区分处理计算机使用、人使用。 无缝支持老旧日期时间数据到新日期时间数据A转载 2020-11-10 19:37:25 · 215 阅读 · 0 评论 -
JAVA学习日记:I/O流(3)
本节课我学习的主要内容有:1.管道流管道流: 用于连接输入流和输出流。 一般运用在两个不同线程之间传输数据。 这里的input是对应从管道中得到数据并输入到别的地方。 output对应的是从别的地方得到数据并输出数据到管道中。PipedTest01类(测试管道类):package LessonForIO03;import java.io.*;public class PipedTest01 { //生产数据的方法,将数据写入管道。 public stat原创 2020-11-09 19:10:46 · 1337 阅读 · 6 评论 -
JAVA学习日记:I/O流(2)
本节课我学习的主要内容有:1.输入输出流的概念2.输入输出流的层次结构输入输出流的概念: date source -> input stream -> java program java program -> output stream -> date sink/disk 是根据java program的进还是出来判断输入输出流。输入输出流的层次结构: 字节流: 字节输入输出流的顶层类是InputStream和OutputStream。原创 2020-11-08 20:54:11 · 165 阅读 · 2 评论 -
JAVA学习日记:I/O流(1)
本节课我学习的主要内容有:1.I/O2.File类3.FileFilter接口I/O: I:Input O:Output 从一个数据源头读取数据并将数据写入目标地点。 数据源和目的地可以是文件、内存、网络等。File类: 属于java.io包。 它可以封装计算机中存在的或者不存在的文件。 构造方法: File(String pathname)//传入路径字符串 File(File parent, String ch原创 2020-11-07 21:42:21 · 193 阅读 · 0 评论 -
JAVA学习日记:Date和Calendar
本节课我学习的主要内容有:1.Date类2.Calendar类3.日期与时间的格式化方法SimpleDateFormat类Date类: 来自java.util包,它的对象代表的是即时时间。 体现的是从1970年01月01日00时00分00秒00毫秒距离当前时间的毫秒数。 Date不支持国际化的、并且很多方法已经过时、不推荐使用。 new Date()即可创建一个表示当前时间的Date对象。 getTime()得到1970年。。。到现在转载 2020-11-06 22:42:41 · 258 阅读 · 0 评论 -
JAVA学习日记:集合框架(6)
本节课我学习的主要内容有:1.Map接口2.HashMap类3.LinkedHashMap类4.SortedMap接口5.TreeMap类6.所有Map的遍历Map接口:属于java.util包 Java中的Map储存的是成对的对象组,对象组可以是一个元素也可以拆开来分成Map中不同元素 Map中每个元素都是有一个关键值(key)来一一对应的,key不可以重复,元素可以重复。 Map接口和Collection接口相互独立。 常用方法:原创 2020-11-03 20:30:45 · 226 阅读 · 2 评论 -
JAVA学习日记:集合框架(5)
本节课我学习的主要内容有:1.简单队列2.优先队列3.双端队列简单队列: 先进先出。 之前学过的LinkedList就实现了队列的接口。 方法: 以下方法都不会抛出异常。 offer();我认为是入队。 peek();检索队头。 poll();我认为是出队。 与上面对应的但是不同的方法: 以下方法都在一定条件下会抛出异常。 add();添加。 element();同样是检索。 remove();移除。原创 2020-11-02 17:56:14 · 151 阅读 · 0 评论 -
JAVA学习日记:集合框架(4)
本节课我学习的主要内容有:Set接口与它的实现类HashSet、LinkedHashSetSortedSet接口与TreeSet类Set接口与它的实现类HashSet、LinkedHashSet: Set接口: Set中不保证元素存放的顺序但是一定没有重复元素。 HashSet类: 元素不重复计算时调用的equals方法和hashCode方法都是按照 元素中重写过的,没有重写过的话就是Object类中的。来保证元素 不重复。 元素原创 2020-11-01 21:47:40 · 274 阅读 · 2 评论 -
JAVA学习日记:集合框架(3)
本节课我学习的主要内容有:List接口ArrayList类LinkedList类List接口:泛型接口 顺序存储结构,可以存放相同的元素,包括NULL 顺序表中存放的元素都对应的提供了一个整数索引值。 我们可以通过这个索引值来对数据进行一系列操作。 get(int index)得到index索引位置处的值。 indexOf(Object o)得到o在表中的位置。 add(int index,Object o)在索引为index的位置存原创 2020-10-31 19:37:44 · 215 阅读 · 2 评论 -
JAVA学习日记:Math类和Random类
本节课我学习的主要内容有:Math类 Random类Math类:Math类中常用的静态方法: static int abs(int a) 返回与a类型相同的a的绝对值。 static int max(int a,int b) 返回a、b中最大的那个。 static int min(int a,int b) 返回a、b中最小的那个。 以上方法与之对应的还有提供给double的。 static double ceil(double a) 返回原创 2020-10-30 22:15:04 · 156 阅读 · 1 评论 -
JAVA学习日记:集合框架(2)
本节课我学习的主要内容有:如何遍历元素如何遍历元素:方法: 使用Iterator迭代器 使用forEach方法 使用for-each循环。 Iterator迭代器: 第一步现判断容器是否还有元素。 第二步访问容器中下一个元素并且操作(可以是删除操作啥的)。 for-each循环: 前置:Collection接口继承Iterator接口。 遍历的顺序从第一个元素开始直至最后一个元素。 但是他在遍历的同时像迭代器那样删除元素会抛出异原创 2020-10-29 20:27:05 · 256 阅读 · 2 评论 -
JAVA学习日记:集合框架(1)
这节课内容是纯概念内容,所以我只记录了概念相关的东西,下一篇笔记会有实现的代码。 什么是集合: Collection<E>,Map<K,V> java中的集合是用来存放对象的对象,可以理解为容器类。属于java.util包中。 集合中容纳的每一个对象, 被称之为元素。 这个容器中的元素只能是引用类型的对象,不能是基本数据类型。 优点: 提供了编译时检查,对象可以使用索引来获取其中的元素值,同时也可以通过原创 2020-10-29 20:22:34 · 507 阅读 · 3 评论