自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浅谈栈(Stack)数据结构

一、概述:栈(stack):栈是一种线性的结构,这种数据结构仅限在线程表的一段进行插入和删除操作。其中线性表插入的和删除的一段称为栈顶(top),不循序插入和删除的一段称为栈底(bottom)。所以栈数据结构是遵循“后入先出”,也就是“LIFO”。二、栈的特征(1)栈也是一种线性的机构。(2)相比较数组,占对应的操作是数组的子集。(3)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶。(4)栈是一种后进先出的数据结构。称为:Liast In First Out(LIFO)

2021-04-28 15:27:00 1654

原创 自己封装实现一个的LinkedList集合类

一、LinkedList具体实现:我们先看一下,java为我们提供LinkedList是什么样子的:LinkedList是一种双向链表结构的集合,我们可以通过LinkedList提供的Node类可知,在Node中有三个成员变量(item、next和prev),item存储当前节点的值,next指向当前节点的下一个节点,prev指向当前节点的上一个节点,所以我们说LinkedList是一种双向链表。private static class Node<E> { E item;

2021-04-23 15:49:43 318

原创 封装一个自定义ArrayList

根据对ArrayList的理解封装一个指定的集合数组(CustomArray);CustomArray类:public class CustomArray<E> { //private int[] data; private E[] data; private int size; //构造函数,出入数组的容量capocity构造CustomArray public CustomArray(int capacity){ //d

2021-04-23 12:25:00 204

原创 线程启动详解

一、start()和run()这两个方法是在开发中实现多线时,最常接触的方法,start()是线程启动的方法,run()是线程中具体要实现的业务逻辑,这两个方法有直接的联系,但又是两个完全不同的方法,start()用来启动一个新的线程,而启动的新的线程主题逻辑就是run()。这两个方法不能孤立存在,只有start()不产生任何现实意义,只有run()不会创建新的线程。实例代码:public class StartAndRunMethod { public static void mai

2021-04-23 10:11:24 667

原创 实现多线程方法详解

一、多线程有多少种实现方式我们要了解多线程,首先就要知道多线程有多少种实现方式,这个问题的答案有许多中类,有说是3种的,有说是4种的,接下来我们就详细研究一下多线程到底有多少种实现方式;不卖关子,答案是:2种;我们可以直接去查询Oracle提供JDK API文档可知:There are two ways to create a new thread of execution;翻译过来就是,有两种方式可以创建新的执行线程,也都给出了实例程序。方法一:实现Runnable接口;方法二

2021-04-22 19:48:13 610

原创 什么是算法复杂度分析

什么是算法复杂度分析: 任何可以正常运行的程序都可以成为算法,那所谓的算法复杂度分析是什么呢?简而言之,所谓的算法复杂度分析就是用来表示算法的运行的性能。 在现实的工作中,同样的任务,我们可以通过不同的算法来完成,对于不同的算法来说,他们的时间的性能是有差异的,那就需要对各个算法的性能进行评估,我们可以通过使用一个或一组测试用例吧算法运行一下,然后比较一下性能的差异,但是这样的比较结果很多时候是有局限性的,因为严格来讲你需要保证不同算法的计算机,他们的性能是完全一致的,甚至计算机使用的系...

2021-04-13 20:16:05 539

原创 插入排序算法

概述:插入排序是一种最简单的排序方法之一,它的基本思想是将一个记录插入到已经排序号的有序表中,从而获得一个新的、记录数增1的有序列表。通过双城循环的方法进行实现,外层循环用来标志当前待排序的数组,内层循环用来查找当前数字在有序序列中的正确位置,并进行相应的移动。规定一个为i的指针,这个指针指向当前需要排序的序列中的值,当指向的这个值比它左侧的数据小的时候,将当前这个值,与其左侧的数字进行交换,再判断当前这个数字是否比其左侧的数字小,如果小再进行交换,不断的重复这个过程,直到左侧没有数据,或者左侧数据比

2021-04-13 19:36:34 199

原创 选择排序算法

所谓的选择排序算法,就是在待排序的数组中不断的去查找最小值的过程;首先,我们在待排序的数组中查找一个最小值,这个最小值要满足数组中的其他元素都要比它大,将查找到的这个最小值暂存到一个新的数组中;然后,再查找剩余数组中最小的一个值,不断的重复查询最小值,指定数组中没有值可查为止,将以此查询到的最小值存入到新的数组中,我们就得到了一个有序的数组。在开发中为了避免空间的浪费,我们不会new一个新数组,而是在原来的数组上实现上述步骤;实例代码:准备一个数组生成器:public class

2021-04-12 19:14:56 138

原创 线性查找法

所谓的线性查找法,就是在沿着一个固定的方向,挨个查找数组中的元素,直到这个查询询到目标元素或者遍历完数组为止。线性查找法主要有两部分组成:1>输入:数组和目标元素;2>输出:目标元素所在的索引;若不存在,返回-1;实例代码:public class LineTest { private LineTest() { } /** * 泛型只能接受类对象,不能接受基本类型的变量 * 不可以是基本数据类型,只能是类对象 ..

2021-04-07 11:34:18 205

原创 归并排序是什么?

归并排序(Merge Sort)是建立再归并操作上的一种有效的,稳定的排序算法,该算法是采用分治法(Divide and Conquer),将需要排序的数组通过递归的方式进行拆分成多层小的数组,对拆分后的子序列进行排序,再将已有的子序列合并,得到完全有序的子序列。也就是说,先将每个子序列有序,再使子序列间有序。分段可以理解为递归的拆分子序列的过程(递归的深度为:以2为底n的对数),将产生的若干子序列递归合并成一个真正的有序序列(递归深度同样为:以2为底n的对数)。...

2021-04-07 10:41:35 465

原创 浅谈java反射技术

一、概述:所谓的反射就是动态的获取类信息以及动态的调用对象,在java运行环境中,对于任何一个对象,都可以通过反射获取类的信息,知道这个类的属性和方法,实现动态的声明对象,并能够调用它的任意的方法和属性;动态的声明对象,所谓得动态声明对象,就是通过反射和xml,借助于类的全类名来生成新对象,将需要声明的对象类的全类名放到xml文档当中,通过DOM4J文件将这个文档解析出来,存入到集合当中,...

2021-04-06 19:09:34 123

原创 什么是快速排序算法?

快速排序算法是对冒泡排序算法的一种改进。它的基本思想就是:首先,在需要排序的序列中选取一个基准数,通过基准数将需要排序的数组分割成两个独立的部分,这两部分数据要满足其中的一部分数据中的所有数据要比另一部分的数据都要小,然后再按照这个方法对这两部分数据进行不断的分割,直到不能分割为止,整个过程可以通过递归的进行,以此达到整个数据达到有序序列。说白了,就是给基准数找到正确的索引位置的过程。如图表示,我们假设选取的这个基准数为数组的第一个数据,然后声明一个临时变量来存储这个基准数据(tmp = 34)

2021-04-06 15:18:21 865

原创 将字符串类型的数据反转输出

这是一个老面试题了,可能因为有段时间没写代码的原因吧,竟然被问懵逼了,真是可耻。String类型数据是java中最长使用的数据之一,区别去其他基础类型的数据(byte、short、int、long、float、double、char、boolean),String类型的数据是引用类型的。言归正传:public class FlashBackTest { public static void main(String[] args) { String val = meth

2021-03-29 19:20:02 1337 3

原创 lock锁—unlock源码解析(锁释放)

之前已经搬运过lock锁的获取,现在看一下lock锁的锁释放方法(unlock)的源码,正如unlock的语义一样,unlock方法是Lock接口中定义的解锁方法,释放线程获取的资源,并通知等待线程获取资源。/** * Attempts to release this lock. * * <p>If the current thread is the holder of this lock then the hold * count is decremented. If the

2021-03-18 14:59:21 1390

原创 Lock锁—lock方法源码分析(锁获取)

Lock锁是jdk1.5中引入的java线程安全与同步机制。java.util.concurrent.locks包下常用的类与接口 我们都知道java中锁的出现是为了解决多线程情况下,线程的安全与同步问题,所谓的“线程同步机制”就是一套哦用于协调线程间的数据访问(Data Access)和活动(Activity)的机制,该机制在保证线程安全的同时,实现这些线程的共同目标。 我们都知道在多个线程并发访问共享数据的时候会产生线程安全的问题,如何在多个线程并发的时候保证线程的安全的呢?...

2021-03-17 17:22:49 804 1

原创 Condition的分组机制

condition和Lock锁一样出现在jdk1.5中的,它的出现使用来替代传统的Object的wait()/notify()方法,配合Lock锁实现线程间的协作的。java.util.concurrent.locks包下常用的类与接口(jdk1.5中):Lock 和 Thread 三者之间的关系如下图:Condition中主要的方法包括:await()/signal(),它们分别对应Object中的wait()/notify()方法,Condition相比较Object方法提供了更安全

2021-03-15 18:44:13 342

原创 java多线程中wait方法要在while中调用而非if中

开门见山直说: 在java多线程情况下,当线程被wait后,又通过notify方法唤醒时,在if情况下被唤醒,程序从哪里wait的就从哪里继续执行,在while的情况下被唤醒,程序依旧会从哪里wait的继续往下执行,但是,在执行之前会先对循环条件进行判断,满足条件继续wait,不满足条件继续执行。而if语句不会再对条件进行判断,直接继续执行。所以在多线程情况下,可能会有多个线程再对资源进行修改,当被wait的线程被唤醒时,有其他线程已经将资源进行修改过了,导致wait的条件发生变化(不再满...

2021-03-15 15:56:45 293

原创 关于Set集合不安全问题的源码和解决分析

java中的Set集合和List集合一样都继承Collection的接口,Set集合是一个不包含重复元素的集合,主要包含三种存放数据类型的变量,分别是HashSet、LinkedHashSet和TreeSet,和List集合一样,Set集合也是不安全类,在并发情况修改下会报:java.util.ConcurrentModificationException(并发修改异常);/** * Adds the specified element to this set if it is not alr...

2021-03-02 16:38:12 222

原创 解决集合类不安全问题——写时复制

通过对ArrayList类中的Add方法的源码探究,我们发现ArrayList的Add方法并不是一个线程安全的方法,当对ArrayList进行add的高并发操作时,会报:java.util.ConcurrentModificationException(并发修改异常)错误,针对这种问题,我们可以通过写时复制的方式进行解决(CopyOnWriteArrayList)。/** * Appends the specified element to the end of this list. *...

2021-02-23 19:12:19 215 3

原创 ArrayList中add方法源码分析

当我们通过ArrayList的无参构造方法创建一个ArrayList对象时,ArrayList的无参构造方法会初始化一个数组类型的elementData成员变量,该成员变量就是ArrayList具体用来存放数据的变量,由此可知ArrayList是基于数组来实现的。 当程序调用add方法向我们新建的集合类添加值的时候,添加方法会先调用ensureCapacityInternal方法,对集合容量进行确认。ensureCapacityInternal方法用来对ArrayList进行扩...

2021-02-03 16:27:46 225

空空如也

空空如也

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

TA关注的人

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