- 博客(70)
- 资源 (2)
- 收藏
- 关注
原创 几种常见的阻塞队列
ArrayBlockingQueue底层维护了一个定长的数组,在生产者生产数据和消费者消费消费数据,共用同一个锁对象。LinkedBlockingQueue底层维护了一个链表,当生产者线程往队列中生产数据时,消费者线程同时消费队列中的数据,原因就是生产者和消费者采用了额独立的锁来控制数据的同步。关于ArrayBlockingQueue和LinkedBlockingQueue的异同,请移步我的另一篇博客:https://blog.youkuaiyun.com/weixin_43729854/art...
2020-08-22 20:31:37
494
原创 ArrayBlockingQueue和LinkedBlockingQueue的区别与联系
目录相同点不同点1、由上图可以看出,他们的锁机制不同2、他们的底层实现机制也不同3、构造时的区别4、统计元素的个数其他问题5、LinkedBlockingQueue双锁带来的好处?6、为何ArrayBlockingQueue无法实现锁分离机制?相同点1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的.
2020-08-08 18:11:30
2490
2
原创 Java--List接口总结
目录一.ArrayList1.概述2.扩容二.LinkedList1.概述2.属性三.Vector1.概述2.成员变量四.Stack1.概述2.常用方法一.ArrayList1.概述 ArrayList是实现List接口的动态数组,所谓动态就是它的大小是可变的。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小,允许插入数据为null。...
2020-08-06 12:49:27
261
原创 合并两个有序链表(递归)--java实现
问题:代码:class ListNode{ int val; ListNode next; ListNode(int x){ val = x; }}public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode
2020-07-29 12:19:05
581
原创 TCP协议如何保证数据可靠性
为什么TCP协议是可靠的?TCP协议是怎么保证数据的可靠的?答:能够保证TCP协议可靠的算法有检验和,连接管理机制,ACK应答机制,快速重传和超时重传机制,滑动窗口机制,拥塞控制机制,这些机制共同保证TCP协议的可靠性。检验和:TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法
2020-07-28 12:47:47
2311
原创 内核态与用户态
最近学多线程,接触操作系统的东西比较多,这个内核态和用户态还是需要明确一下的。内核态:CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序用户态:只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取为什么要有用户态和内核态由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 --用户态和...
2020-07-26 15:07:32
139
原创 Java多线程之中的synchronized关键字
目录一.存在的意义二.如何使用1.同步方法2.同步代码块三.底层实现原理以及锁升级机制1.markword2.monitor一.存在的意义我们都知道并发编程需要具有:原子性 :原子操作是不可分割的操作,一个原子操作是不会被其他线程打断的。 可见性 :当一个线程对共享变量进行了修改,那么其他线程可以立即看到修改后的最新值。 有序性 :程序代码在执行过程中的先后顺序 Java编译器会在运行期优化代码的执行顺序,导致了代码的执行顺序未必就是开发者编写代码时的顺序...
2020-07-25 19:59:56
278
原创 浅谈java中的CAS
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。独占锁是一种悲观锁,synchronized就是一种独占
2020-07-25 18:36:58
138
原创 StringBuffer和StringBuilder的区别
类结构和继承关系他们都继承了一个抽象的字符串父类:AbstractStringBuilder区别1:线程安全StringBuffer:线程安全StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。StringBuffer:@Overridepublic synchronized StringBuffer append(Strin
2020-07-22 12:41:55
140
原创 矩阵最小路径和-动态规划(Java实现)
问题描述:有一个矩阵map,它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。给定一个矩阵map及它的行数n和列数m,请返回最小路径和。保证行列数均小于等于100.测试样例:[[1,2,3],[1,1,1]],2,3返回:4代码及思路:public class shortestWay { public static int minPathSum(int [][]m){
2020-07-20 18:10:18
651
原创 Java多线程基础总结
目录一.线程和进程1.进程的特点2.并行与并发3.线程和进程的渊源4.线程的特点5.线程和JVM的关系二.线程的创建方式1.继承Thread类创建线程类2.实现Runnable接口创建线程3.通过Callable和Future接口创建线程三.线程的七种状态以及相互之间的转换四.线程中常用的方法一.线程和进程进程是指处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配和调度的一个单位。当程序进入内存运行时,即为线程。1.进程的特点
2020-07-17 18:29:23
166
原创 Java8特性-Stream
目录Stream介绍Stream操作步骤数据准备创建StreamStream操作数据终止StreamJava8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream。如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中。这篇文章由简入繁逐步介绍StreamStream介绍Stream是一个流,在Java.util.Stream包路径下,他的主要作用就是对集合数据进行查找过滤等操作。通俗解释就是一种高效且易用的数据处理方式。
2020-07-08 11:36:19
257
原创 Java单例模式的7种实现方式
目录一.饿汉式二.懒汉式三.全局锁式四.静态代码块式五.双重校验锁式六.静态内部类式七.枚举方式一.饿汉式 单例实现-饿汉式: 1为什么方法是静态的: 不能new对象却想调用类中方法,方法必然是静态的, 静态方法只能调用静态成员,所以对象也是静态的。 2.为什么对象的访问修饰符是private,不能是public 吗? 不能,如果访问修饰符是Public,则Single.s也可以得到该类对象, 这样就造成了不可控。 .
2020-06-30 21:48:27
590
2
原创 N后问题详解(回溯法)--Java实现
目录一.问题描述二.求解思路三.代码实现一.问题描述N皇后问题:在N*N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?二.求解思路运用回溯法形成解空间树来求解该问题。下面给出一个3后的解空间树:核心算法(具体怎么判断新加入的皇后和之前的皇后冲突与否):由于N皇后问题不允许两个皇后在同一行,所以,可用一维数组X表示N皇后问题的解,i表示当前规划的皇后在第几行,X[i]表示第i行的皇...
2020-06-20 13:57:01
2019
1
原创 内聚和耦合的具体概念
内聚(Cohesion)是一个模块内部各成分之间相关联程度的度量。 耦合(Coupling)是模块之间依赖程度的度量。内聚和耦合是密切相关的,与其它模块存在强耦合的模块通常意味着弱内聚,而强内聚的模块通常意味着与其它模块之间存在弱耦合。模块设计追求强内聚,弱耦合。一、内聚强度内聚按强度从低到高有以下几种类型:(1) 偶然内聚。如果一个模块的各成分之间毫无关系,则称为偶然内聚。(2) 逻辑内聚。几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。如一个模块读取各种不同类型外设的输入。尽管逻辑内聚比
2020-06-11 18:39:12
7734
原创 并查集_数据结构--java实现
一.定义简而言之就是有“合并集合”和“查找集合中的元素”两种操作的关于数据结构的一种算法。连接两个对象 判断是否这两个对象是连接的上例中,0,7是没有路径的;8,9之间有一条可达路径,因此就算是连接的。(学过图论的人应该不难理解)二.数学模型等价性: p连接到p,每个对象都能连接到自己 对称性: p连接到q;等价于q连接到p 传递性: 如果p连接到q,q连接到r,那么,p连接到r。三.快速查找1.数据结构这里用到的数据结构是数组。对象索引整数数组,用索引来表示N个.
2020-06-06 17:49:54
250
原创 BIO,NIO,AIO的区别
在进行网络编程的时候,我们需要搞清楚BIO,NIO,AIO三者之间的区别。BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。 NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。 AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。 BIO (Blocking I..
2020-06-05 10:29:27
222
原创 Mysql和Oracle以及SqlServer的分页查询如何实现
一、MySql中的limitSELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT #
2020-06-04 17:44:24
293
原创 详解ArrayDeque_一个Collection接口下的万金油容器
目录一、概述二、底层实现三、具体使用一、概述ArrayDeque是Collection接口下Deque接口的一个实现,使用了可变数组,所以没有容量上的限制。同时,ArrayDeque是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用。ArrayDeque是Deque的实现类,可以作为栈来使用,效率高于Stack;也可以作为队列来使用,效率高于LinkedList。需要注意的是,ArrayDeque不支持null值。ArrayDeque也可以使...
2020-06-03 18:38:19
455
原创 TreeMap集合下常用的方法总结
一、找到第一个比指定的key小的Entrymap.lowerEntry()二、找到第一个比指定的key小的keymap.lowerKey()三、找到第一个小于或等于指定key的Entrymap.floorEntry()四、找到第一个小于或等于指定key的keymap.floorKey()五、找到第一个大于或等于指定key的Entrymap.ceilingEntry()六、找到第一个大于指定key的Entrymap.higherEntry()七、获取
2020-06-03 08:49:37
2802
原创 Map接口下集合的要点总结
一.Map接口下的集合的特点1.存储的集合都是双值,即都为key-value结构。2.无序(TreeMap可以排序),键不能重复,值可以重复,没有继承Collection接口。HashMap 异步 线程不安全只允许一条记录的键为NULL Hashtable 同步 线程安全 key和value不可以为空 TreeMap 可以排序 不允许键为NULL 二、哈希由于Map接口下所有元素存放的位置都是由key决定的,那么通过...
2020-06-02 18:20:14
336
原创 InputStream和OutputStream到底什么时候用?
读文件BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("infilename")));不管你从磁盘读,从网络读,或者从键盘读,读到内存,就是InputStream。写文件BufferedWriterout= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("outfilename")));不管你写到..
2020-05-31 10:22:58
484
原创 0-1背包问题(动态规划)--java实现
动态规划适用动态规划的问题必须满足最优化原理、无后效性和重叠性。 1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。 2.无后效性 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过
2020-05-30 11:19:27
1361
原创 非递归实现归并排序--Java实现
非递归实现归并排序的划分函数Merge和递归的归并排序是一样的,但是使用了一种较为巧妙的方法来代替递归过程,具体过程都注释在代码中了,代码如下:/** * 非递归实现归并排序 */public class NiceMergeSort { //划分函数,一定程度上的排序,并排不完,需要递归调用来完成归并排序,相当于把问题分而治之 public static void Merge(int []dsi,int []src,int left ,int m, int right)
2020-05-27 09:11:21
399
原创 JVM_JAVA中的强软弱虚引用
java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的:1. 是可以让程序员通过代码的方式决定某些对象的生命周期;2. 是有利于JVM进行垃圾回收。 一、 强引用(StrongReference)强引用是使用最普遍的引用。只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会
2020-05-27 09:02:26
263
原创 破坏双亲委派模型(利用线程上下文类加载器)
这里就用JDBC为例来探索一下为何,如何利用 线程上下文类加载器 破坏双亲委派模型。java给数据库操作提供了一个Driver接口:public interface Driver { Connection connect(String url, java.util.Properties info) throws SQLException; boolean acceptsURL(String url) throws SQLException; Dri
2020-05-21 20:06:18
811
1
原创 HashMap相关知识总结
目录一.数据结构和节点类型二.hash值的计算方法三.解决哈希冲突的链地址法四.扩容五.重写equals()方法,必须重写hashcode()方法HashMap继承自AbstractMap接口,是Java中常用的集合之一,对于<key,value>这样的键值对数据,存储起来十分方便。这里我就结合源码,总结一下HashMap的相关知识。一.数据结构和节点类型HashMap是由一个 由链表组成的数组 构成的,图示如下:源码中的节点类型定义如下: tr
2020-05-20 13:38:56
164
原创 List接口下的各个集合的特点
目录ArrayListLinkedListVectorStack数组与集合的区别ArrayList特点:继承于AbstractList,它还实现了RandomAccess, Cloneable, java.io.Serializable等接口。public class ArrayList<E> extends AbstractList<E>...
2020-05-06 10:31:55
255
1
原创 JDBC中的Statement和preparedStatement
preparedStatement是预编译的,先编译无参数的sql,再提交参数,然后再执行对于批量处理可以大大提高效率.,也叫JDBC存储过程。 使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。 Statement每次执行sql语句,...
2020-04-15 11:33:47
320
原创 Mysql事务(附MVCC机制举例详解)
1.什么是事务一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,具有原子性。只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。set autocommit 开启事务,一旦开启事务就不是按下回车就会造成持久性修改执行sql语句 1执行sql...
2020-04-15 10:03:18
871
原创 Redis主从复制
目录主从复制是什么能做什么如何使用常用部署模式一主二仆薪火相传反客为主复制原理哨兵模式如何使用主从复制是什么主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点(mas...
2020-04-05 13:00:18
335
原创 JVM垃圾回收机制
目录一.GC原理(垃圾回收)二.对象被标记为垃圾的方法(一)引用计数(二)可达性分析三.垃圾回收算法(一)标记-清除算法(二)标记-整理算法(三)复制算法(四)分代回收算法新生代回收:老年代回收:四.垃圾回收器相关概念:(一)Serial 收集器(二)ParNew收集器(三)Parallel Scavenge 收集器(四)Ser...
2020-03-30 20:59:53
159
原创 JVM基本结构和工作过程
一.JVM的基本结构首先要说明的,jvm是运行在操作系统之上的,与硬件系统没有直接的交互。1.1 程序计数器在CPU的寄存器中只有一个pc寄存器,存放下一条指令地址。每一条线程都有一个独立的程序计数器,Java虚拟机中的程序计数器指向正在执行的字节码地址,而不是下一条。1.2 虚拟机栈虚拟机栈是线程私有的,每个方法执行的时候都会创建一个栈帧,用于存放局部变量表,操作数栈...
2020-03-24 10:54:37
208
原创 Redis持久化-RDB&AOF
RDB做什么:在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进行持久化,会将数据写入到一个临时文件中(dump.rdb),等持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的的性能。当然,如果需要进行大规模数据的恢复,且对于数据恢复的...
2020-03-21 21:57:20
146
原创 判断一颗二叉树是否是完全二叉树--java实现
完全二叉树:对于一个树高为h的二叉树,如果其第0层至第h-1层的节点都满。如果最下面一层节点不满,则所有的节点在左边的连续排列,空位都在右边。这样的二叉树就是一棵完全二叉树。思路:任何一个结点如果右孩子不为空,左孩子却是空,则一定不是完全二叉树 当一个结点出现右孩子为空时候,判断该结点的层次遍历后继结点是否为叶子节点,如果全部都是叶子节点,则是完全二叉树,如果存在任何一个结点不是叶...
2020-03-21 18:16:40
727
1
原创 快速排序详解--java实现
高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放...
2020-03-18 11:51:23
289
原创 归并排序--Java实现
思想:归并排序是利用归并的思想实现的排序方法,采用分治策略,将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。再详细看一下治阶段的详细操作:比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],是如下图这般的步骤实现的:这里我们用递归来实现代...
2020-03-11 21:11:00
137
1
原创 寻找旋转排序数组中的最小值 leetcode--Java实现
问题描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7]在4处旋转可变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1-------------------------------------------示例 2:输...
2020-03-07 20:35:26
178
原创 贪吃的小Q--java实现
问题描述小Q的父母要出差N天,走之前给小Q留下了M块奶糖。小Q决定每天吃的奶糖数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有奶糖吃,请问他第一天最多能吃多少块奶糖?输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。输出描述:输出一个数...
2020-03-07 20:03:28
438
原创 希尔排序的原理及实现--Java实现
首先呢,希尔排序又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的优化。希尔排序都对插入排序做了哪些优化呢?如下:希尔排序在排序前:将一个序列分成了好几个序列 在第一趟排序时:将这几个序列做插入排序。排序后,部分较大的数字往后靠,部分较小的数字往前靠 在第二趟排序时:将这个序列又分了好几个序列做插入排序(但比第一次分的数要少,ps:如果第一次...
2020-03-04 21:25:32
180
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人