- 博客(53)
- 收藏
- 关注
原创 java并发编程(七)Java线程池
java并发编程(七)Java线程池在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。那么,我...
2019-08-28 14:38:16
304
原创 java并发编程(六)抽象同步队列AQS+Semaphore+CountDownLatch+CyclicBarrier
java并发编程(六)抽象同步队列AQS+Semaphore+CountDownLatch+CyclicBarrierAbstractQueuedSynchronizer 抽象同步队列简称 AQS,它是实现同步器的基础组件, 并发包中锁的底层就是使用 AQS 实现的,这个类在java.util.concurrent.locks包下面AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地...
2019-08-12 17:45:18
348
原创 java并发编程(五)并发中的锁
java并发编程(五)并发中的锁1乐观锁和悲观锁1.1悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchron...
2019-08-12 15:56:15
313
原创 java并发编程(四)synchronized 关键字+volatile关键字
java并发编程(四)synchronized 关键字+volatile关键字在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,...
2019-08-12 13:05:36
355
原创 java并发编程(三)并发基础进阶
java并发编程(三)并发基础进阶什么是多线程并发编程首先要澄清并发和并行的概念,并发是指同一个时间段内多个任务同时都在执行,并 且都没有执行结束,而并行是说在单位时间 内多个任务同时在执行。 并发任务强调在一个 时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单 位时间内不一定同时在执行。为什么要进行多线程并发编程多核 CPU 时代的到来打破了单核 CPU 对...
2019-08-12 11:55:55
180
原创 java并发编程(二)ThreadLocal
java并发编程(二)ThreadLocal多钱程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个 共享变量进行写入时。 为了保证线程安全,一般使用者在访问共享变量时需要进行适当的 同步。同步的措施一般是加锁,这就需要使用者对锁有一定的了解, 这显然加重了使用者的 负担。 那么有没有一种方式可以做到,当创建一个变量后, 每个线程对其进行访问的时候 访问的是自己线程的变量呢?...
2019-08-12 11:47:32
172
原创 java并发编程(一)并发基础
java并发编程(一)并发基础何为进程?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。何为线程?线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的...
2019-08-12 11:12:50
194
原创 深入理解JVM虚拟机(八)类加载器
深入理解JVM虚拟机(八)类加载器类加载器所有的类都由类加载器加载,加载的作用就是将 .class文件加载到内存。JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader:BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现...
2019-08-12 10:41:00
207
原创 深入理解JVM虚拟机(七)类加载过程
深入理解JVM虚拟机(七)类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?系统加载 Class 类型的文件主要五步:加载->连接->初始化->使用->卸载。连接过程又可分为三步:验证->准备->解析。加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字...
2019-08-12 10:29:01
248
原创 深入理解JVM虚拟机(六)类文件结构
深入理解JVM虚拟机(六)类文件结构一 概述在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新...
2019-08-12 10:14:04
189
转载 深入理解JVM虚拟机(三)垃圾收集器与内存分配
深入理解JVM虚拟机(三)垃圾收集器与内存分配概述垃圾收集器并不是Java伴随出来的,而是在1960年的lisp上运用,比Java要早很多当时思考的是:哪些垃圾需要被回收,什么时候回收,怎么回收1.堆空间的结构图所示的 eden 区、s0(“From”) 区、s1(“To”) 区都属于新生代,tentired 区属于老年代。大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃...
2019-07-18 17:48:10
189
转载 深入理解JVM虚拟机(二)Java内存区域
深入理解JVM虚拟机(二)Java内存区域一 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一...
2019-07-18 17:12:56
216
原创 JAVA数据结构与算法(九)HashMap源码
JAVA数据结构与算法(九)HashMap源码HashMap概述HashMap是一种基于哈希表实现的Map,它通过键的hashCode来快速的存取元素HashMap允许插入null键和null值,允许多条记录的值为null,但只允许一条记录的键为nullHashMap不是线程安全的,在并发环境下,可能会引起死循环HashMap中的元素是无序的,无法保证遍历时的顺序是固定不变的Hash...
2019-06-16 16:07:28
202
原创 JAVA数据结构与算法(八)java实现红黑树
JAVA数据结构与算法(八)java实现红黑树红黑树的性质红黑树是一种自平衡二叉树,红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。红黑树需要满足的五条性质:性质一:节点是红色或者是黑色;在树里面的节点不是红色的就是黑色的,没有其他颜色。性质二:根节点是黑色;根节点总是黑色的。它不能为红。性质三:每个叶子节点是黑色。 [注意:这里叶子节点,是指为空...
2019-06-12 20:02:00
3311
1
原创 JAVA数据结构与算法(七)java实现AVL树
JAVA数据结构与算法(七)java实现AVL树1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡。而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1。2,为什么需要AVL树呢?在二叉查找树中最坏情况下查找某个元素的时间复杂度为O(n),而AVL树能保证查找操作的时间复杂度总为O(logn)。对于...
2019-06-10 20:29:40
315
原创 每日算法(四十五)-java找出topK的值
每日算法(四十五)-java找出topK的值这里用的方法的堆排序的思想(如果堆排序不是很清楚可以看之前的排序算法里的堆排序),构造容量位K的小顶堆,即数组前K个元素构造出的堆,堆积为最小值,之后将堆顶分别于剩下的所有元素依次进行比较,比堆顶大则交换,再进行调整,代码如下public class TopK {public int findTopK(int arr[] ,int k){ //构...
2019-06-10 19:58:52
1220
原创 排序算法(四):java实现冒泡排序
排序算法(四):java实现冒泡排序冒泡排序比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。代码如下:public class BubbleSort { public...
2019-06-10 19:46:28
224
原创 排序算法(四):java实现归选择排序
排序算法(四):java实现归选择排序选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。直接是双重循环,第一个循环从第一个元素开始,第二个循环从i+1开始,比较其中的值,记录下更小的元素的...
2019-06-10 19:29:13
183
原创 排序算法(三):java实现快速排序
排序算法(三):java实现归快速排序快速排序(QuiclSort)采用分治思想分解(divide):数组A[p…r]被划分为两个(可能为空)子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],而A[q]也小于等于A[q+1…r]中的每个元素。其中,计算下标q也是划分过程的一部分。解决(Conquer):通过递归调用快速排序,对子数组A[p…q-1...
2019-06-10 19:21:04
249
原创 排序算法(二):java实现归并排序
排序算法(二):java实现归并排序算法思路:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作第三, 合并: 合并两个排好序的子序列,生成排序结果.这里核心的是每次的两两合并,依次从两个子序列...
2019-06-10 19:09:03
553
原创 排序算法(一):java实现堆排序
排序算法(一):java实现堆排序堆排序的基本思想堆排序就是利用堆(假设进行升序,也就是使用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将其与堆数组的末尾元素交换,此时末尾元素就是最大值,然后将剩余的 n - 1 个序列重新构造成一个堆,这样就得到 n - 1个元素中的次大值。如此反复执行, 便能得到一个有序序列了 。这里...
2019-06-10 18:53:44
306
原创 每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。
每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。为了更改的规划城市,需要统计楼栋数目信息。方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示。如果楼栋的楼顶出现在了格子里,那么此格子就被设置为1,出现在相邻格子里的楼顶被记为同一座楼栋,若是斜邻的则记为不同的楼栋。求一张图里的楼栋总数目。例如,输入{{0,0,0,0,0},{0,1,1,0,0...
2019-06-10 18:31:01
524
原创 每日算法(四十二)-java输入两个数字a、b,随后一行输入a个数字,从a个数字中选取b个数字进行组合
每日算法(四十二)-java输入两个数字a、b,随后一行输入a个数字,从a个数字中选取b个数字进行组合输入两个数字a、b,随后一行输入a个数字,从a个数字中选取b个数字进行组合,判断有几组数据之和为素数。例如:输入:4 33 7 12 19输出:1循环遍历每次取三个数,分别是i,i+1,i+2,当超过长度就取模,求和之后进行素数判断这里判断素数是将小于2,2,能被2整除的先...
2019-06-06 21:43:06
1157
原创 JAVA数据结构与算法(六)java实现图
JAVA数据结构与算法(六)java实现图图的定义图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合。无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示。有向图:若从顶点Vi到Vj的边是有方向的,则成这条边为有向边,也称为弧(Arc)。用有序对(Vi,Vj)标...
2019-06-06 21:35:34
601
原创 每日算法(三十九)-java回溯法解决八皇后
java回溯法解决八皇后该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列。直到所有皇后都放完,或者放哪都不行。详细一点说,第一个皇后先放第一行第一列,然后第二个...
2019-06-06 18:11:33
469
原创 每日算法(三十八)-java分治算法(归并排序,快速排序)
每日算法(三十八)-java分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求...
2019-06-05 19:53:51
1074
1
原创 每日算法(三十六)-java递归
每日算法(三十六)-java递归递归(recursion):程序调用自身的编程技巧。递归满足2个条件:1)有反复执行的过程(调用自身)2)有跳出反复执行过程的条件(递归出口)递归与栈的关系下面演示的是求n的阶乘int Factorial(int n){ if (n == 0) return 1; return n * Factorial(n -...
2019-06-05 19:23:07
234
原创 JAVA数据结构与算法(五)搜索二叉树(bst)的CURD操作
JAVA数据结构与算法(五)搜索二叉树(bst)的CURD操作它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。查找时,从根节点与要查的数对比,大则在右子树查找,小则在左子树查找添加时类似上面查找删除是考虑三种情况,1.如果是叶...
2019-06-01 17:22:56
196
原创 每日算法(二十六)-java求数组种最小的n个不重复的数是多少
每日算法(二十六)-java求数组种最小的n个不重复的数是多少先用map来存数组,key存元素,value代表它出现的次数,重新自定义sort里的compare方法进行排序代码如下public static List<Integer> result(int arr[],int k){ List<Integer> result=new ArrayList<>...
2019-06-01 17:05:56
401
原创 每日算法(二十五)-java求单链表的倒数第n个元素的值
每日算法(二十四)-java求单链表的倒数第n个元素的值求单链表的倒数第n个元素的值比如1-2-3-4-5-6求倒数第3个元素 是 4 …建立两个指针,一开始都指向第一个数,然后将第二个指针先跑到倒数第n-1数的位置,当第二个指针的下个节点不为空时,两个指针依次往后走,当为空时,第一个指针指向的位置就刚好是倒数第n个数public static int getbackward(Lis...
2019-06-01 16:57:15
1581
原创 每日算法(二十四)-java找到两个数组的公共部分
每日算法(二十四)-java找到两个数组的公共部分找到两个数组的公共部分Example 1:Input: nums1 = [1,2,2,1], nums2 = [2,2]Output: [2,2]Example 2:Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]Output: [4,9]这里直接双重遍历,两个数组都是从第一个元素开始,当左边数...
2019-06-01 16:51:23
1556
原创 每日算法(二十二)-java判断字符串内容是否符合某种条件
每日算法(二十二)-java判断字符串内容是否符合某种条件Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.Input: “()”Output: trueExample 2:Input: “()[]{}”...
2019-06-01 16:44:09
1727
原创 每日算法(二十一)-java给定一个数组,求是否存在数组里的两个元素相加等于目标数并求出下标(三种方法)
标题每日算法(二十一)-java给定一个数组,求是否存在数组里的两个元素相加等于目标数并求出下标(三种方法)第一种方法,直接双遍历,想等就输出public static void twosum(int arr[], int target){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ ...
2019-06-01 16:37:14
1619
原创 每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数
每日算法(二十)-java给定一个数组,求是否存在数组里的四个元素相加等于目标数结果可能不止一个,每个可能里面又包含了四个元素,所以这里用链表来存最先确定第一个数和第二个数,就是普通循环确定,然后根据先两个数找出来了,再利用二分查找去找后两个数,代码如下public static List<List<Integer>> fourSum(int arr[],int ta...
2019-06-01 16:30:04
605
原创 每日算法(十八)-java求组合 输入两个参数 参数1 小球的个数 参数2 取多少个 输出 一共有多少种取法
每日算法(十八)-java求组合 输入两个参数 参数1 小球的个数 参数2 取多少个 输出 一共有多少种取法求组合输入两个参数 参数1 小球的个数 参数2 取多少个输出 一共有多少种取法比如 f(5,2) 表示从5个球中取2个这里的两个我们可以把他看作是特殊球,比如一共五个球,有两个特殊球,每次依次去取,每次取出只有两种情况,一种是取到了特殊球,一种是没取到特殊球,所有情况...
2019-05-31 09:53:36
355
原创 每日算法(十七)-java求有序不重复数组的全排列 ,长度为n的数组 全排列应该有n! 个
每日算法(十七)-java求有序不重复数组的全排列 ,长度为n的数组 全排列应该有n! 个输入 { 1, 2, 3, 4 }输出[1, 2, 3, 4] [1, 2, 4, 3] [1, 3, 2, 4] [1, 3, 4, 2] [1, 4, 3, 2] [1, 4, 2, 3][2, 1, 3, 4] [2, 1, 4, 3] [2, 3, 1, 4] [2, 3, 4, 1] [2,...
2019-05-31 09:43:34
699
原创 JAVA数据结构与算法(四)树
JAVA数据结构与算法(三)树定义树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。特别地,不含任何结点(即n=0)的树,称为空树。树的术语1.结点:包含...
2019-05-19 18:56:44
304
原创 java基础(三)java中String类的作用及常用方法,StringBuffer与StringBuilder的使用理解与String类的区别
java基础(三)java中String类的作用及常用方法,StringBuffer与StringBuilder的使用理解与String类的区别先看String类的源码public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** Th...
2019-05-19 17:59:35
379
原创 java基础(二)java中Object类的作用,Object类中常用方法
java基础(二)java中Object类的作用,Object类中常用方法作用:Object类是一个特殊的类,是所有类的父类即直接或间接的继承java.lang.Object类。,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类下面介绍其中的常用方法1.toString()方法方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此...
2019-05-19 14:03:06
469
原创 JAVA数据结构与算法(三)栈
JAVA数据结构与算法(三)栈栈是一种只能在一端进行插入和删除操作的特殊线性表。其中,允许插入和删除的一端称为栈顶,另一端称为栈底。通常,将栈的插入操作称为入栈,删除操作称为出栈。入栈时元素总是放在栈底,而出栈的总是栈顶元素。因此,栈中元素采用的是“后进先出”的方式。创建一个栈public class MyStack <T> {private int top;private...
2019-05-12 15:41:16
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人