自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 Xtend == 与 ===

Xtend “"与 "===”看了很多文章,结合自己的使用,在这里记下笔记。该篇内容也同样适用于kotlin(也是一门JVM语言)。1、== 相当于 java 中的调用 equals 方法,比较的是两个引用的相等性或者等同性,即对象的内容是否相同。2、=== 相当于 java 中的 ==,比较的是两个引用的同一性,即引用的地址是否相同。...

2021-02-18 19:57:58 145

原创 并发之基本的线程机制

并发并发是基于多核处理器编程的基本工具。通常是用来提高单处理器上的程序的性能。从性能的角度看,如果没有任务阻塞,单处理器机器上使用并发就没有什么意义。实现并发最简单的操作就是在系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。多任务操作系统通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个程序。java的并发系统会共享诸如内存和I/O这样的资源,因此并发最基本的困难在于协调不同进程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。java在顺序语

2020-08-30 17:04:12 123

原创 分库分表

分库分表什么是分库分表?为什么要分库分表?随着系统的不断运行和升级,存储在关系型数据库的数据量会越来越大,可能亿级,这会给数据库系统的访问带来了压力;而且此时,表的查询效率会很低。随着数据量增大,表索引的更新成本也越大,数据的写效率就会越低。什么是分库分表?其实就是数据切分,将表分成多张表,存储在同一个或者不同的数据库中来减少系统压力。数据的切分方式:水平切分:按照分片算法将表分成结构相同的多个表,分布在集群的不同节点上,从而缓解单个数据库的压力。垂直切分:按照列的关系密集度将表拆分成

2020-08-12 22:50:17 143

原创 MySQL的事务控制

MySQL的事务控制数据库的事务是指作为单个逻辑工作单元执行的一系列操作要么全部执行要么全部不执行。事务的概念事务:一组sql语句回退:撤销指定的sql语句提交:提交指定的SQL语句保留点:目的是为了支持不用全文回退,只要回退到保留点即可,savepoint 保留点名字。MySQL默认是执行自动提交的,如果需要显示的声明提交或者回退,是需要先明确事务管理的:start transaction事务的四个特性ACID原子性(Atomic):指对数据库的操作要么全部一起执行,要么全部不执

2020-08-12 21:46:37 123

原创 MySQL的数据库引擎

MySQL的数据库引擎InnoDB使用B+树作为底层数据结构:B+树的叶子节点存储的是每一条记录(主键索引或者聚簇索引),查询效率高,一次索引叶子节点存储的是主键的值,查询效率较高,但是因为涉及到回表,所以比聚簇索引慢。它先根据其他索引即聚簇索引获取到主键值,然后在根据主键值去获取整个完整的记录,这个过程就是回表。但是,如果覆盖索引的话就可以避免多次查询,这也是索引优化的方式之一。覆盖索引就是指你查询的数据全部包含在索引列中,也就是select语句后面的列全部包含在你where关键词后面的列中

2020-08-12 21:15:50 81

原创 B+树及索引

B+树B+树是基于B树和叶子节点顺序访问指针实现的。B树是一棵平衡查找树,其所有的叶子节点都在同一层。B+树的节点从左至右,非递减排序。即左指针指向的节点<=中间指针指向节点<=右指针指向节点。操作查找:从根节点进行二分递归查找,直至找到叶节点,然后在叶子节点上进行二分查找,直至确认元素位置插入:因为元素的插入会破坏B+树的平衡性,所以需要对树进行分裂、合并和旋转来维护平衡性特点B+树的有序性决定了它较快的查找速度,并且还适用于排序和分组。与红黑树进行比较红

2020-08-10 21:28:15 193

原创 Java之I/O系统

Java之I/O系统File类处理文件目录问题的工具类,可以代表一个特定文件的名称,也能代表一个目录下一组文件的名称。如果指的是一组文件集,可以对该集合调用list()方法,这个方法会返回一个字符数组。目录列表器list():不带参数的方法,可以获得该目录下所包含的全部列表list(FileNameFilter f):带目录过滤器作为参数,可以筛选获得我们想要的目录列表。需要实现一个实现了FileNameFilter接口的accept(File dir, String name)方法的类对

2020-08-10 20:11:00 73

原创 Fork/Join框架

Fork/Join框架java7提供的一个用于并行执行的框架,是一个把大任务拆分成若干个小任务,然后把小任务的结果汇总得到大任务结果的框架。工作窃取算法定义:指某个线程从其他队列里窃取任务来执行。因为fork会将大任务分成若干个小的任务,然后为了减少线程之间的竞争,会将这些子任务放入到不同的队列中,并为每个队列创建一个单独的线程来执行。当某线程的队列任务执行完时,可以去其他队列里窃取任务来处理。为了减少窃取任务线程和被窃取任务的线程之间的线程,任务队列一般采用双端队列的设计,被窃取任务线程从

2020-08-10 00:15:15 94

原创 Executor框架

Executor框架Executor框架的两级模型java的线程被一对一映射为本地操作系统的线程。当java线程启动时,会创建一个本地操作系统的线程,当该java线程终止时,本地操作系统的进程也会被回收。操作系统调度所有的线程并将他们分配给可用的CPU。上层:java多线程程序将应用分解成多个任务,然后由用户级的调度器Executor框架将这些任务映射为固定数量的线程下层:由操作系统的内核将这些线程映射到硬件处理器上。Executor框架的结构任务:包括被执行任务需要实现的接口:Run

2020-08-07 23:26:13 91

原创 java中的线程池

java中的线程池java并发编程中运用场景最多的框架,主要优点是: 1. 降低资源消耗:通过重复利用已创建的线程来减少线程创建和消耗的开销 2. 提高响应速度:当任务到达时,可以不用等待线程创建就能立即执行 3. 提高线程的可管理性:避免重复创建,可以对线程池内资源进行统一分配,调优和监控。线程池的实现原理ThreadPoolExecutor的execute()方法的工作步骤:当有一个新的任务被提交到线程池时,线程池先判断核心线程池内的线程是否都在执行任务,如果不是,创建一个新的工作

2020-08-07 21:15:17 93

原创 java的并发工具类

java的并发工具类CountDownLatch被用来同步一个或者多个任务,强制去等待其他线程完成操作。CountDownLatch c = new CountDownLatch(3);//初始化一个CountDownLatch的对象的计数器的值为3;任何调用c.await()的方法都被阻塞,直至这个计数值为0;其他的任务完成工作的时候可以调用c.countDown()来减小计数器的值。CountDownLatch对象只能被触发一次,它的计数器的值是不能被重置的。CyclicBarrier可

2020-08-07 15:15:54 140

原创 java中的阻塞和非阻塞队列

java中的阻塞和非阻塞队列实现一个队列的线程安全,有两种方式: 1)使用阻塞队列,即出队和入队共用一把锁或者各自使用一把锁来实现 2)非阻塞队列:可以利用循环CAS的方式实现java中的阻塞队列阻塞队列是一个支持两个附加操作的队列,即支持阻塞的插入和移除。 1. 阻塞的插入:当前队列已经满了的时候,队列会阻塞插入元素的线程,直到队列不满 2. 阻塞的移除:当前队列为空的时候,获取元素的队列会阻塞直到队列为非空。处理方式:抛出异常,返回特殊值,一直阻塞或者超时退出。经常用于生产者和消费者

2020-08-07 11:44:13 589

原创 hashmap、hashtable和concurrenthashmap

hashmap、hashtable和concurrenthashmaphashMap继承自AbstarctMap类底层数据结构是:数组+链表+红黑树key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。初始容量为16,扩容是乘以2。线程不安全的键值对存储结构,当有多线程同时修改的时候可能会形成环结构,从而造成死锁问题。为什么容量要总是2的次幂:用与运算代替取模运算,速度快为了散列更均匀,利用0&1 = 0, 1&1

2020-08-07 10:13:07 85

原创 Java并发编程的艺术(三)

Java并发编程的艺术(三)线程是如何进行通信的?通过共享内存:通过共享内存的读写操作进行隐式的通信通过消息传递:没有共享内存时,就需要显示的发送消息来进行通信线程是如何同步的呢?首先同步是指程序中用于控制不同线程间操作发生相对顺序的机制。通过共享内存:需要通过对共享内存加锁进行线程间互斥来显示地进行线程同步。通过消息传递:因为消息发送一定在消息接收之前,所以是隐式的进行了线程同步。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

2020-08-06 22:22:16 109

原创 垃圾收集器与内存分配策略

垃圾收集器与内存分配策略线程私有的程序计数器、虚拟机栈和本地方法栈的内存大小在编译期间可知,生命周期是随着线程或者方法的开始而开始,结束而结束。而线程共享的堆和方法区不一样,只有在程序执行期间才知道需要创建多少个对象以及一个方法不同分支的内存分配。问题:哪些内存需要回收什么时候回收怎么回收java引用:JDK1.2之后,java对引用的概念进行了扩充,分为强引用、软引用、弱引用和虚引用四种,引用强度逐渐减弱。强引用:程序代码中普遍存在的,比如Object a = new Ob

2020-08-06 21:55:34 76

原创 java和C++的编译器对比

java和C++的编译器对比也是java的即时编译器和C++的静态编译器之间的对比。1、即时编译器的运行占用的是用户程序的运行时间,具有很大的时间压力2、java的动态类型安全语言需要虚拟机确保程序不会违反语言语义或访问非结构化内存。也就是需要编译器不断进行类型检查,消耗时间。3、运行时多态性的特点使得编译器的优化难度大于C++的静态优化编译器。4、动态可扩展的语言特性使得程序可以在运行时加载新的类,从而可能会改变继承关系,影响全局优化,比如方法内联。5、java的对象在堆上分配,垃圾回收机制需

2020-08-06 00:50:37 263

原创 JVM之代码优化

JVM之代码优化java的编译分为 1. 前端编译器:将.java文件编译成字节码文件, javac 2. 运行时编译JIT:将字节码文件转换成机器指令文件。Hotspot VM的C1、C2编译器 3. 静态提前编译AOT:直接将.java文件转换成机器指令文件。早期编译优化 javac编译器是使用java语言实现的编译器。 因为虚拟机规范了class文件的格式,但并没有严格规定如何从.java文件编译成class文件,因此class文件的编译某种程度上与JDK相关联。 编译过程分为:

2020-08-06 00:40:21 203

原创 Java之解语法糖

java的语法糖语法糖不会改变程序的实质性功能,但能提高效率,减少代码出错的机会。泛型与类型擦除泛型:JDK1.5引入的,本质是参数化类型的应用,即所操作的数据类型被指定为一个参数。这种参数被用在类、接口、方法上,又分别称为:泛型类、泛型接口、泛型参数。与c#的泛型不同的是,前者的泛型在程序源码,编译后的中间语言,或者运行期间的CLR中都是存在的,是真泛型;而java的泛型在编译期的语法分析阶段会被擦除为原生类型,并且在相应的地方添加了强制性类型转换,伪泛型。类型擦除只是在字节码的Code属

2020-08-05 23:15:12 221

原创 并发之共享资源

并发之共享资源不正确的资源访问:一个线程可能会在另一个线程读写数据的时候也进行了读写解决资源共享竞争: 基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案。即给定时刻,只有一个任务能访问共享资源。 共享资源一般是以对象的形式存在的内存片段,但也可以是文件、输入/输出端口、或者是打印机。加锁:锁语句产生了一种互相排斥的效果,又称为互斥量Mutex。synchronized:java的关键字,重量级锁。要控制对共享资源的访问,首先得将它包装进一个对象。然后把所有要访问

2020-08-05 08:04:49 762

原创 Java容器类

java的容器类java的容器类可以自动调节大小,用来保存对象,主要分为:1. Collection:独立元素的序列,所有的Collection都可以使用for-each语法。2. Map:存储键值对。for-each语法:java SE5引入的更高效的用于数组和容器的for语法,不必创建int变量去对由访问项构成的序列进行计数,for-each将自动产生每一项。任何返回一个数组的方法都可以使用for-each,并且还可以用于任何Iterable对象。Collection1. List

2020-08-02 23:15:08 86

原创 设计模式之享元模式

享元设计模式结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。背景:程序中大量对象的创建可能会造成内存溢出。因此,可以通过把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。应用实例: 1、反复创建同一个值相同的包装类型是没有必要的。以Integer为例,如果我们通过Integer.valueOf()这个静态工厂方法创建Integer实例,当传入的int范围在-128~+127之间时,会直接返回缓存的Integer实例。(因此,享元模式就是通过工

2020-08-02 17:04:07 63

原创 红黑树结构复习

1、红黑树是一棵非严格的自平衡的二叉搜索树,在插入和删除树节点的同时通过特定算法来保持二叉查找树的平衡。若一棵二叉查找树是红黑树,则它的任一子树必为红黑树。2、红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。除需满足二叉查找树的要求之外,对于任何有效的红黑树还需满足如下要求:* 节点是红色或黑色。* 根节点是黑色的* 所有叶子都是黑色且为null。* 每个红色节点的两个子节点都是黑色。(即从每个叶子到根的所有路径上不能有两个连续的红色节点)* 从任一节点到其每个叶子的所有路径都

2020-08-01 18:02:56 93

原创 JVM学习笔记之内存区域

JVM学习笔记之内存区域运行时数据区:java虚拟机在执行java程序的过程中把它所管理的内存划分为若干个不同的数据区域,用于不同的用途,并具有不同的创建和销毁时间。程序计数器:当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变该计数器的值来选取下一条即将执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖该计数器。java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间来实现的。因此每个线程都需要有一个独立的程序计数器,互不干扰,即线程私有的内存。如果执行的

2020-07-28 19:55:22 76

原创 Java学习之MySQL(一)

@MySQLJava学习之MySQL(一)SQL(Structured Query Language):结构化查询语言,是使用所有关系模型的数据库语言。SQL分类DDL(数据定义语言) ,用于定义不同的数据段、数据库、表、列、索引等数据库对象,常用的关键字包括:create, drop, alert等;DML(数据操纵语言) ,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用关键字包括:insert、delete、update、select等;DCL(数据控制语言),用于定义数据库

2020-07-27 22:10:30 80

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除