
Java
文章平均质量分 93
Evensen
这个作者很懒,什么都没留下…
展开
-
选择排序(Java实现)
选择排序假如我们现在需要将一个数组内的元素进行从小到大排序,数组如下:{ 12, 32, 4, 78, 1, 14, 78, 51, 13, 98, 10, 64, 101, 3}我们需要对这个数组进行排序,介绍第一种排序算法,即选择排序。核心思想:选择排序是从数组的第一个元素,即下标为 0 的元素开始,不断和后面的元素进行比较,如果后面的元素比第一个元素小,那么我们就把第一...原创 2019-09-29 14:58:59 · 350 阅读 · 0 评论 -
多线程(Java)之死锁
多线程之死锁死锁,是指有多个线程和多把锁,而造成的某个线程持有另外一个线程的锁,另外线程也持有此线程的锁,而造成的假死状态。比如我们有A,B两个线程,有A,B两把锁A线程进入到了B锁的同步代码块,持有了B锁,现在要进入A锁的同步代码块B线程进入到了A锁的同步代码块,持有了A锁,现在要进入B锁的同步代码块这个时候双方都持有对象想要的那把锁,而不肯放手。因此造成了死锁的假死状态。...原创 2019-10-05 13:53:13 · 287 阅读 · 0 评论 -
集合框架(Java)之ArrayList
ArrayList详解集合就是一个容器,在Java中提供了很多容器API,而数组就是最基础的容器。Java中的集合框架分为3大部分,即List、Set、Map今天先来看List体系下的一个基于数组的容器,ArrayList。ArrayList的数据结构基于数组。我们翻看ArrayList的源码,先查看它的成员变量。public class ArrayList&l...原创 2019-10-06 07:29:29 · 177 阅读 · 0 评论 -
集合框架(Java)之LinkedList
LinkedListLinkedList是List下的一个集合子类,数据结构是基于双向链表。双向链表的意思就是元素一个接一个的链接上去,例如有一个LinkedList, 有3个元素,第一个元素记录第二个和第四个元素的内存地址,第二个元素记录第一个和第三个元素的内存地址,第三个元素记录第一个元素的内存地址。就这样我们称之为双向链表。看一下LinkedList的成员变量 t...原创 2019-10-06 10:05:04 · 141 阅读 · 0 评论 -
集合框架(Java)之Iterator和ListIterator
Iterator和ListIterator在上两篇文章中,我们介绍了ArrayList和LinkedListArrayList是基于数组的数据结构,增删改查都依赖Index去完成。因此修改和查看效率高,增删涉及到数组的扩容,因此效率较低。LinkedList是基于双向链表的数据结构,增删特别快,但改和查每次都需要遍历整个链表,因此效率低。ArrayList的遍历package...原创 2019-10-06 10:34:02 · 300 阅读 · 0 评论 -
集合框架(Java)之HashMap
HashMapHashMap也是一种容器,是数组 + 单向链表的数据结构。HashMap能够存放键值对,即 Key - Value 的存储方式。package com.evan.hash_map;import java.util.HashMap;import java.util.Map.Entry;import java.util.Set;public class Dem...原创 2019-10-06 13:31:41 · 148 阅读 · 0 评论 -
集合框架(Java)之LinkedHashMap
LinkedHashMap在上一篇文章中,介绍了HashMap的数据结构,是由数组 + 单向链表构成的,那么HashMap的这种散列元素的数据结构,也就注定它是无序的,因为每次算出的Index,都不是连续的,而是随机的,所以注定在迭代元素的时候,元素的取出顺序和存放顺序,是无序的。LinkedHashMap则是解决无序的这个问题的。LinkedHashMap继承自HashMap,并且内...原创 2019-10-09 07:42:01 · 167 阅读 · 0 评论 -
集合框架(Java)之TreeMap
TreeMapTreeMap是Map框架下的最后一个Map。他的数据结构为平衡二叉树(也叫平衡红黑树)。TreeMap是一个可以保持key高有序性的容器,他存储的也是键值对。底层是平衡二叉树结构。二叉树,有左右两个子节点,在根节点的左边,都是小于根节点的节点,而根节点的右边都是大于根节点的节点,因此保持了有序性。而平衡二叉树的意思,就是说,在根节点的左右两边都尽量保持相同数量的节点...原创 2019-10-09 11:18:14 · 212 阅读 · 0 评论 -
集合框架(Java)之Map的迭代以及性能对比
Map的迭代以及性能对比上三篇文章分析了三种Map的数据结构和增加删除操作。HashMap是基于 数组 + 单向链表的数据结构,通过hash算法算出Index位置,如果没有旧元素直接存储,如果有,则进行hashCode比较和equals比较,如果一样覆盖久值,不一致则链表链接下一个元素。LinkedHashMap是基于 数组 + 单向链表的数据结构,并且又维护了一个双向链表来保证元素的...原创 2019-10-09 11:29:30 · 406 阅读 · 0 评论 -
集合框架(Java)之Set
SetHashSet内部维护的其实就是一个HashMap,只是只存储key值,而没有value。因此也是基于 数组 + 单向链表的结构。 LinkedHashSet内部维护的其实是一个LinkedHashMap,因此是数组 + 单向链表 + 双向链表的结构。 TreeSet内部维护的其实是一个TreeMap,因此是平衡二叉树的数据结构。...原创 2019-10-09 11:34:39 · 112 阅读 · 0 评论 -
多线程(Java)利用Lock接口实现多生产者多消费者
利用Lock接口实现多生产者多消费者在上一篇文章中,我们介绍了等待唤醒机制里的notifyAll方法,并编写了多生产者和多消费者的代码示例。但有一点,因为我们在使用wait()方法后,将4条线程睡眠,我们在生产完毕后,需要使用notifyAll()方法,来唤醒所有的线程,因为notify()方法是唤醒当前对象池子里随机一条线程,我们无法保证唤醒消费者线程的其中一个。本篇文章,我们介绍利...原创 2019-10-05 13:40:03 · 236 阅读 · 0 评论 -
多线程(Java)等待唤醒机制之多生产者与多消费者示例
多线程之多生产者与多消费者在上一篇文章里,我们介绍了线程的等待唤醒机制,并用单生产者和单消费者来演示了notify() 和 wait() 等待唤醒相关方法。这篇文章我们来通过多生产者和多消费者来演示notifyAll()的方法。我们要实现的效果原理为上图,我们有两个生产者线程,在isProduce = false时,在P1和P2线程中随机一条线程来进行生产商品,生产完毕后,再在C1...原创 2019-10-05 13:16:12 · 275 阅读 · 0 评论 -
冒泡排序(Java实现)
冒泡排序假如我们要将以下数组有小到大进行排序:int[] array = {12, 32, 4, 78, 1, 14, 78, 51, 13, 98, 10, 64, 101, 3};介绍第二种排序算法 ---》冒泡排序原理讲解:我们拿数组中的第一个元素(0角标上的元素),依次和之后的元素进行比较,如果第二个元素比第一个元素大,那我们就换位,然后再拿第二个元素和第三个元素进行比...原创 2019-09-29 16:13:28 · 262 阅读 · 0 评论 -
快速排序(Java实现)
快速排序我们要对下面这个数组进行从小到大排序数组如下:{12, 32, 4, 78, 1, 14, 78, 51, 13, 98, 10, 64, 101, 3}介绍第三种排序算法,快速排序。核心思想:我们先拿角标 0 上的元素作为基准数,然后从右边开始像左边检索,发现一个比基准数小的元素后,将角标停下来,然后再从左边开始向右边检索,发现一个比基准书大的元素,将角标停下,然...原创 2019-09-29 16:39:08 · 363 阅读 · 0 评论 -
插入排序(JAVA实现)
插入排序假如我们要对以下数组进行排序:{3, 2, 1, 52, 67, 21, 5}介绍第四种排序算法,插入排序。核心思想:我们将这个数组看成两部分,从Index 1作为分割线,左边是有序部分,右边是无序部分。 我们从Index 1,开始,将元素拿出来,然后逐个和左边的元素进行对比、排序。 例如上面的数组,我们将元素2拿出来,用一个temp变量记录,然后和左边Index ...原创 2019-10-02 13:29:11 · 193 阅读 · 0 评论 -
归并排序(Java实现)
归并排序假如我们有两个有序数组,我们需要合并到一个数组里,并且重新进行排序。A数组: [1, 23, 5, 37, 9, 99, 201]B数组: [12, 4, 6, 18, 100]介绍第五种排序算法:归并排序前提:两个数组必须有序。核心思想:创建一个新数组,容量为两个数组的长度和。 遍历A,B两个数组中的元素,进行比较,较小的先放入新数组中,较大的后...原创 2019-10-02 16:29:17 · 241 阅读 · 0 评论 -
二分查找(Java实现)
二分查找概念:二分查找是一个可以快速查找出目标元素的算法。前提:二分查找需要在有序数组中使用。核心思想:先找到数组中中间的元素,如果要查找的元素比中间元素小,则排除中间元素右侧的所有元素,如果比中间元素大,则排除左侧所有元素。 然后递归再对剩下的元素进行二分查找。示例代码:package com.evan.binary_search;import java.util....原创 2019-10-02 16:42:03 · 2098 阅读 · 1 评论 -
多线程(Java)
多线程概念: 1. 进程 ---> 指编写好的程序,在设备中运行起来后,所属的那片内存空间。 2. 线程 ---> 指程序运行时,负责执行指令的执行器。package com.evan.counter;public class Test { public static void main(String[] a......原创 2019-10-04 17:27:43 · 358 阅读 · 0 评论 -
多线程(Java)之Lock接口
多线程之Lock接口上一篇文章讲述了多线程的概念和同步代码块来解决多线程造成的问题。https://mp.youkuaiyun.com/postedit/102060855如果想要解决多线程访问多行代码涉及操作同一变脸造成的问题时,在JDK1.5之后推出了新的API来解决这个问题。就是Lock接口将上一篇文章里的synchronize替换为Lockpackage com.evan.c...原创 2019-10-04 19:47:15 · 175 阅读 · 0 评论 -
多线程(Java)之volatile关键字
多线程之volitile关键字先来看一段测试代码。package com.evan.counter;public class Test { public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); Thread t1 = new Thread(runnable); ...原创 2019-10-05 11:09:26 · 199 阅读 · 0 评论 -
多线程(Java)等待唤醒机制之消费者生产者示例
多线程之等待唤醒机制前面多线程的文章中,我们提到了线程状态,有一个状态是WAITING状态,也就是等待状态。这个状态是指调用了Thread.wait(); 方法后线程失去CPU的执行资格,CPU就算做着随机切换,也不会切换到该线程,只有使用了notify() 方法唤醒了此线程,该线程才能重新获得CPU的执行资格。而wait() notify() notifyAll() 其实是Objec...原创 2019-10-05 12:32:20 · 284 阅读 · 0 评论 -
线程池(Java)
线程池线程池,其实就是一个线程的缓冲池。它可以有效的降低创建、销毁线程的开销。维护一些线程在线程池内,方便使用。线程池的核心参数:int corePoolSize 线程池核心线程数量 int maximumPoolSize 线程池最大线程数量 long keepAliveTime 临时线程运行完毕后的存活时间 TimeUnit unit 存活时间单位 BlockingQueue...原创 2019-10-09 16:46:09 · 211 阅读 · 0 评论