- 博客(45)
- 收藏
- 关注
原创 这个AI换衣项目也太惊艳了吧,看完我整个人都不好了!
以上老秦介绍了AI虚拟试衣技术和OOTDiffusion的本地部署,老秦之前就部署过,也踩了一些坑,所以这次部署比较顺利,如果大家遇到问题,可以加下老秦的AI闲聊群,有空可以帮大家看下问题。
2024-03-23 12:14:16 2624 1
原创 volatile底层实现原理
前言当共享变量被声明为volatile后,对这个变量的读/写操作都会很特别,下面我们就揭开volatile的神秘面纱。1.volatile的内存语义1.1 volatile的特性一个volatile变量自身具有以下三个特性:可见性:即当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。而普通变量是不能做到这一点的,普通变量的值在线程...
2019-09-02 22:37:53 1261 1
原创 JVM源码调试环境搭建
前言:上篇文章我们介绍了如何在Ubuntu中编译openjdk,包括hotspotJVM,编译完之后大家就要开始阅读jvm源码了,为了让大家能够流畅地阅读和调试jvm源码,这篇介绍下如何搭建jvm源码调试环境,使之能够在IDE中调试。1.笔者环境:源码:openjdk11-hotspotIDE:clion系统:Ubuntu19.042.搭建过程:2.1将源码载入到clion首先...
2019-09-02 21:22:05 1445
原创 Ubuntu下编译openjdk11
前言我的另一篇文章:Ubuntu下编译openjdk8 已经编译了openjdk8的版本,现在需要用到openjdk11的HotspotJVM,所以就编译一下openjdk11,把不同的部分记录下来,openjdk11的准备部分就不在赘述了,直接进入编译环节,需要准备环境的看我的编译openjdk8的文章,先把需要安装的工具安装了。1.笔者环境源码:openjdk11,大家可以...
2019-09-02 21:21:19 613
原创 Unsafe类源码解析
前言Unsafe,顾名思义,一个不安全的类,那么jdk的开发者为什么要设计一个不安全的类呢?这个类为什么会不安全呢?现在就让我们来揭开Unsafe类的神秘面纱。1.概述作为java开发者的我们都知道,java是没有指针的,默认是由JVM进行内存的分配与垃圾回收,那就意味着java不能直接操作内存了?其实不是的,Unsafe类通过JNI的方式访问本地的C++实现库从而使java具有了直接操...
2019-09-02 21:17:51 2531
原创 java中锁的分类
一、java中的锁从以下几个方面进行划分类别:1.线程是否要锁住同步资源:锁住:悲观锁不锁住: 乐观锁 CAS2.锁住同步资源失败,线程是否要阻塞:阻塞不阻塞:自旋锁适应性自旋锁3.多个线程竞争同步资源的流程细节有没有区别:不锁住资源,多个线程中只有一个能修改资源成功,其他线程会重试: 无锁同一个线程执行同步资源时自动获取资源: 偏...
2019-09-02 21:16:44 318
原创 CAS算法
前言CAS,即 Compare And Swap(比较与交换),是一种无锁算法,基于硬件原语实现,能够在不使用锁的情况下实现多线程之间的变量同步。jdk中的java.util.concurrent.atomic包中的原子类就是通过CAS来实现了乐观锁。CAS算法过程算法涉及到三个操作数:需要读写的内存位置V需要进行比较的预期值A需要写入的新值UCAS算法解析:CAS具体执行...
2019-09-02 21:15:51 244
原创 volatile底层实现原理
前言当共享变量被声明为volatile后,对这个变量的读/写操作都会很特别,下面我们就揭开volatile的神秘面纱。1.volatile的内存语义1.1 volatile的特性一个volatile变量自身具有以下三个特性:可见性:即当一个线程修改了声明为volatile变量的值,新值对于其他要读该变量的线程来说是立即可见的。而普通变量是不能做到这一点的,普通变量的值在线程间传递...
2019-09-02 19:52:55 10716
原创 Java内存模型详解
前言Java内存模型(Java Memory Model,简称JMM),即Java虚拟机定义的一种用来屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能够达到一致的内存访问效果的内存模型。本篇文章大致设涉及到五个要点:Java内存模型的基础,主要介绍JMM抽象结构;Java内存模型中内存屏障;Java内存模型中的重排序;happens-before原则;顺序一致性内存模...
2019-09-01 09:58:07 407
原创 Stream流
前言这篇详细介绍了Stream流的概念,创建方式,基本操作及部分源码分析。可能有点长哈,大家看起来比较费劲,我自己写的也比较累,光码字就码了很长时间,大家看得过程中可以停下来休息下,喝个茶,斗个地主接着再来看,就安利到这里了,我也该洗洗睡了(码字确实挺累的,写文章也是很累),最后在安利下哈,个人绝得很详细的,祝大家学习愉快哈,看完就可以找到心仪小姐姐(小哥哥)。1.流的概述及相关概念ja...
2019-08-24 17:12:39 279
原创 方法引用
1.什么是方法引用方法引用是java8中特定情况下简化lambada表达式的一种语法糖,这里的特定情况是指当调用现有的方法时可以用方法引用替代lambada表达式,其他情况下,则不可以替代。举个栗子:public class MethodReferenceTest { public static void main(String[] args) { List<St...
2019-08-24 16:30:08 4976
原创 函数式接口
概述java8中新增了 @FunctionalInterface 注解表示函数式接口,用注解@FunctionalInterface标识的接口都是函数式接口,函数式接口只能有一个抽象方法,但除了抽象方法,java8还允许接口中定义默认方法(声明为default的方法)和静态方法。如果一个接口只有一个抽象方法,即便我们并没有用 @FunctionalInterface 注解标注,编译器依然会将该接...
2019-08-24 16:14:12 281
原创 lambada表达式介绍
前言在其他语言中,函数式编程是很常见的,java8中为了支持函数式编程,新增了lambada表达式。lambada表达式其实是匿名内部类和闭包的一种符号表示,至于概念性的问题,大家不必深究,lambada表达式会用就可以了。1.为何需要lambada表达式在js中,函数的参数是另一个函数,返回值也是一个函数的情况是根常见的,因此js也是一门典型的函数式语言。而在java8以前的版本中,我...
2019-08-24 16:03:02 2619
原创 Ubuntu下编译openjdk8
一、笔者环境1.Ubuntu18.042.openjdk8u60二、源码下载由于openjdk使用mercurial版本管理工具构建的, 所以可以使用mercurial来下载源码,但是下载速度不敢恭维,我是在openjdk官网:http://hg.openjdk.java.net/jdk8u下载的openjdk8u60版本,我已上传到github,这里给出我的github地址:https:...
2019-08-04 09:34:22 667
原创 Spring源码调试环境搭建
一、实验环境1.jdk1.8.0_1712.gradle-5.3.1(Spring源码使用gradle构建的,关于gradle的安装和配置使用,请读者自行上网搜一下,这里不再赘述)3.IntelliJ IDEA 2019.24.Spring-5.0.x二、环境搭建1.进入到GitHub官网并搜索spirng,找到对应的spring-framework工程,点击链接进入,如下图:2....
2019-07-30 08:31:20 1428 1
原创 算法与数据结构系列之[图-概念]
前言前面我们介绍了线性表和树这两大类数据结构,线性表局限于一个直接前驱和一个直接后继,树也只能有一个直接前驱也就是父节点,当我们需要表示多对多的关系时就需要用到图这种数据结构,比如微博,微信互相关注,互加好友的社交关系就用图来表示。1.概述图(Graph)是一种数据结构,由结点和边组成,通常表示为G(V,E),其中G表示一个图,V是图G中结点的集合,结点也称顶点,可以具有零个或多个相邻元素,...
2019-07-09 21:59:34 310
原创 算法与数据结构系列之[哈希表]
前言前面我们介绍线性表的时候,如果要查找某个元素,比如key,就需要从表头开始,逐个比较记录a[i]和key的值是相等还是不相等,知道有相等才算查找成功,返回i。那么我们有没有一种方法不用逐个比较就能查找到要查询的元素呢?答案是肯定的,我们可以通过关键字key得到要查找记录的内存位置,这就是我们这篇要介绍的哈希表,其实哈希表算是线性存储结构的范畴,因为哈希表用到数组作为存储结构。1.什么是哈希...
2019-07-09 21:55:05 1390
原创 算法与数据结构系列之[红黑树-下]
上篇介绍了红黑树的概述,这篇贴出红黑树的java实现代码。public class RBTree<K extends Comparable<K>, V>{ private static final boolean RED = true; private static final boolean BLACK = false; private class...
2019-07-09 21:50:18 132
原创 算法与数据结构系列之[红黑树-上]
前言前面我们提到,为了解决二分搜索树有时候会退化成链表的问题,科学家们提出了平衡树的概念,最早发明的AVL树就是高度平衡(所有节点的左右子节点的高度差的绝对值不超过1)的二分搜索树,但实际开发中,AVL树并不常见,工程中,常用的平衡二分搜素树是这篇我们要介绍的红黑树。那到底什么是红黑树呢?我们在这篇文章中揭晓。为了便于理解红黑树,我们先来看一种绝对的平衡树–2-3树。所谓绝对平衡树就是所有节点...
2019-07-09 21:49:09 219
原创 算法与数据结构系列之[平衡二叉树-AVL树-下]
上篇介绍了AVL树的概述,这篇把AVL树的java代码实现贴出来public class AVLTree<K extends Comparable<K>, V> { private class Node{ public K key; public V value; public Node left, right; ...
2019-07-09 21:42:31 581
原创 算法与数据结构系列之[平衡二叉树-AVL树-上]
1.问题概述我们在介绍二分搜索树的时候提到时间复杂度为O(logn),但是这并不是绝对的,有些时候树可能退化为链表,时间复杂度回到O(n)级别,所以为了性能考虑,应尽量避免这种退化,这就用到了平衡树。2.什么是平衡二叉树平衡二叉树的定义是,对于任意一个节点,左子树和右子树的高度差不能超过1,且平衡二叉树的高度和节点的数量之间的关系一是O(logn)的。我们前面介绍的满二叉树、完全二叉树和线...
2019-07-09 21:41:18 549
原创 算法与数据结构系列之[并查集-下]
接着上篇介绍并查集的优化方法3.路径压缩上一篇介绍了基于rank的优化,但是依然有一定的问题需要解决,因为当我们的数据量越来越大时,树的高度可能也会随之变大,数据量小的时候影响不大,但当数据量很大时,树的高度比较高,查询数据就会变慢了,所以我们有必要通过减小树的高度而不破坏原先的连接关系的方法来解决以上问题。我们可以在每次查询时将树的高度缩减,这就是路径压缩。如上图,三个图表示的结果是相同...
2019-07-09 21:34:31 278
原创 算法与数据结构系列之[并查集-中]
上篇介绍了并查集的基本实现,这篇介绍几种并查集的优化方法。1.基于size优化:上一篇当中树实现并查集的方法中对要合并的两个元素所在的树的形状没有做任何的判断,合并的过程中可能不断增加树的高度,使查找的性能变差,甚至在极端情况下,极有可能使树退化成链表结构,使查询的时间复杂度退化到O(n)。那么该如何进行优化呢?首先我们维护一个数组,存放每棵树的元素的个数,每次合并时先将要合并的两个元素对...
2019-07-09 21:32:16 183
原创 算法与数据结构系列之[并查集-上]
1.概述并查集是一种树形的数据结构,但是这种树很特殊,每棵树都是从子节点指向父节点的,在使用中也常常以森林来表示,用于解决一些不相交集合的合并和查询问题。上面的概念有点抽象,其实并查集就是用来解决连接问题,并查集的查询其实就是判断两个元素是否属于同一个集合,两个元素属于同一个集合,那么他们就是连接的,否则不连接。并查集的并其实就是将不在同一个集合的两个元素合并,使其处于同一集合,在树中也就是表...
2019-07-09 21:28:52 148
原创 算法与数据结构系列之[字典树-Trie]
1.什么是字典树-Trie百科解释:(之所以引用百度百科的解释,是因为百科的解释概括性已经很好,也很全面,只需要少许补充即可)字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树...
2019-07-09 21:24:19 304
原创 算法与数据结构系列之[线段树]
1.什么是线段树百度百科解释:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。其实,线段树就是一棵平衡的二叉树,可以用数组来存储,把数组分成若干个...
2019-07-09 21:19:35 215
原创 算法与数据结构系列之[二分搜索树-下]
上篇贴出了二分搜索树的C语言代码,这篇贴出二分搜索树的java实现代码。public class BinarySearchTree<E extends Comparable<E>> { //一个泛型类型E需要实现一个接口的语法是使用extends关键字的 ...
2019-07-09 21:13:16 130
原创 算法与数据结构系列之[二分搜索树-中]
上篇介绍了二分搜索树的概念和基本操作,这篇贴出二分搜索树C语言实现代码。BinarySearchTree.c#include <stdlib.h>#include <stdio.h>typedef struct BinarySearchNode{ int e; struct BinarySearchNode *left,*right;}Binar...
2019-07-09 21:12:12 120
原创 算法与数据结构系列之[二分搜索树-上]
前几篇介绍了二叉树以及二叉树的遍历,接下来三篇介绍下二分搜索树。1.什么是二分搜索树二分搜索树(Binary Search Tree)是一种特殊的二叉树,也叫二叉排序树或二叉查找树,简称:BST。顾名思义,二分搜索树可以通过二分法快速实现元素的查找的,而且,二分搜索树插入和删除元素的效率也很高。二分搜索树或者树一棵空树,获取满足下面性质:若左子树不为空,则左子树上所有节点的值均小于其根节...
2019-07-09 21:09:42 183
原创 算法与数据结构系列之[优先队列]
前面我们介绍了队列这种数据结构,不过我们在前面所介绍的队列只是一种普通的队列,即元素先进先出,其实队列还可以分优先级,优先级高的元素先出,比如操作系统的调度,会将优先级高的任务先调度执行,这种队列就叫做优先队列。那么优先队列底层该如何实现呢?1.优先队列可以使用普通的线性结构,比如动态数组,入队时的时间复杂度为O(1),出队时需要遍历元素,找到优先级最大的元素出队,时间复杂度为O(n)。2....
2019-07-09 21:02:40 1520
原创 算法与数据结构系列之[最大堆-下]
上篇贴出了最大堆的C语言代码实现,这篇贴出最大堆的java代码实现:public class MaxHeap<E extends Comparable<E>> { private Array<E> data; public MaxHeap(int capacity){ data = new Array<>(cap...
2019-07-09 20:59:33 99
原创 算法与数据结构系列之[最大堆-中]
上篇介绍了最大堆的理论和重点操作的实现,这篇贴出最大堆的C语言代码实现:MaxHeap.c#include <stdlib.h>#include <stdio.h>#define INCREMENT 10 //数组扩容时的增量typedef struct MaxHeap{ int *data; //定义一个动态数组 int size; ...
2019-07-09 20:58:42 131
原创 算法与数据结构系列之[最大堆-上]
前面三篇我们介绍了二叉树以及二叉树的代码实现,这篇介绍一下堆这种数据结构,是对二叉树的一个应用,堆其实是用二叉树实现的,只不过堆用到的二叉树是一种特殊的完全二叉树,这里的特殊性体现在堆中的某个节点的值总是不大于或不小于其父节点的值。根节点最大的堆叫做最大堆或大顶堆,根节点最小的堆叫做最小堆或小顶堆。完全二叉树适合用数组来存储,所以堆一般用数组来顺序存储。下图列出了最大堆,并用数组存储的例子最...
2019-07-09 20:57:09 153
原创 算法与数据结构系列之[二叉树-下]
上篇贴出了二叉树的C语言代码实现,这篇贴出Java代码实现。public class BinaryTree{ private class Node{ public int e; public Node left; public Node right; public Node(int e){ this.e = e...
2019-07-09 20:54:15 93
原创 算法与数据结构系列之[二叉树-中]
上篇介绍了二叉树的理论部分,这篇贴出二叉树完整的C语言代码实现。BinaryTree.c#include <stdio.h>#include <stdlib.h>typedef int TElemTpye;typedef struct BinaryTreeNode{ TElemTpye data; struct BinaryTreeNode *...
2019-07-09 20:53:12 89
原创 算法与数据结构系列之[二叉树-上]
上篇从整体上介绍了树的一些基本概念,编程中我们用到的都是具体的树结构,比如二叉树。接下来我们用上、中、下三篇详细介绍二叉树,其中上篇为二叉树的理论部分,中篇为二叉树的C语言代码实现,下篇为二叉树的Java代码实现。前言现实中树的种类有很多种,数据结构中树的种类也不是单一的,有二叉树,B树,B+树,红黑树等,二叉树应该说是最常用的一种树形结构,这篇就重点介绍下二叉树。一、二叉树的定义:二叉树...
2019-07-09 20:51:06 326
原创 算法与数据结构系列之[树-概念]
在前面几篇介绍了线性数据结构,那么接下来几篇将会详细介绍下树这种数据结构。有了数组和链表等线性数据结构存储数据已经很方便了,那么为什么还需要树这种数据结构呢?当然是相较于数组和链表,树具有自己独特的有点,正好能够弥补数组和链表的缺点,我们先看下数组和链表的优缺点,也算是对前面内容的一个总结。数组通过下标方式访问元素,查询速度快,对于有序数组,还可以利用二分查找法提高检索速度。但是数组在查询某...
2019-06-08 10:57:44 489
原创 算法与数据结构系列之[队列]
上一篇介绍了栈这种数据结构,栈是从线性表的表尾进并从表尾出,即后进先出,先进后出,若是银行排队采用这种方式,估计先去的人都气死了。那么有没有先进先出,类似于银行排队这种方式的数据结构呢?答案是肯定的,队列就是这样先进先出(FIFO)的数据结构,只允许一端进行插入操作,另一端进行删除操作,允许插入的一端叫做队尾,删除操作的一端叫做队头。队列也有两种实现方式,可以采用动态数组实现,也可以使用单链表实...
2019-06-05 14:06:53 134
原创 算法与数据结构系列之[栈]
栈是一种限定仅在表尾进行插入和删除操作的线性表,其最大的特点就是后进先出(Last In First Out),简称LIFO结构。栈可以用动态数组实现,也可以使用链表实现。由于栈比较简单,这里不再详述,仅贴出代码。C语言代码:1.Stack.c#include <stdio.h>#include <stdlib.h>#define STACK_INIT_SIZ...
2019-06-04 21:57:04 149
原创 算法与数据结构系列之[链表]
上一篇介绍了线性表的顺序存储结构,顺序存储结构的最大缺点就是插入和删除时需要移除大量元素,如果要插入或删除的数据量很大的话,执行程序的时间就会很长,造成一定的性能消耗,且线性表的顺序存储结构如动态数组,栈和队列,底层依托静态数组,需要通过扩容解决固定容量问题。由于顺序结构的以上问题,链表的优势就凸显出来,链表是最简单的动态数据结构,不需要处理固定容量问题,且插入和删除元素,不需要移动其他元素,所...
2019-05-23 21:32:24 139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人