java
文章平均质量分 50
java
谢小鱼
不后悔过去,不怀疑未来
展开
-
阿里0325笔试第一题(动态规划)
1:题目描述链接:https://www.nowcoder.com/discuss/391530?type=post&order=time&pos=&page=1来源:牛客网第一题,给定一个数组n,比如5 10 5 4 41 7 8 4 03 4 9 0 3从每一列选择一个数,求出后一列减去前一列的绝对值的和的最小值比如这里就是3 4 5 4 4,所以输出是32:解题思路本地我们经过分析,可以明确发现本列最短路径和上一列最短路径之间有很大的关系,我们可原创 2021-08-08 23:30:17 · 270 阅读 · 0 评论 -
启动Rocket MQ
在bin目录下第一步,start start mqnamesrv.cmd第二步,start mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true原创 2021-08-02 17:51:20 · 121 阅读 · 0 评论 -
用java模拟环形队列的实现(java)
环形队列介绍:队列是一个有序列表,可以用数组或者链表来实现;遵循先入先出的原则,即:先存入队列的数据,先取出,后存入的后取出;即先进先出原则。队列空间可以循环使用示意图实现思路:代码实现:package com.xrw.queue;import java.util.Scanner;/** * @program: DataStructures * @description: 用数组实现环形队列:队列的特点:先进先出,后进后出; * 实现思路:1、定义属性,队列的大小maxS原创 2021-04-01 22:26:59 · 918 阅读 · 0 评论 -
用java模拟队列的实现(java)
队列介绍:队列是一个有序列表,可以用数组或者链表来实现;遵循先入先出的原则,即:先存入队列的数据,先取出,后存入的后取出;即先进先出原则。示意图:实现思路:代码实现:package com.xrw.queue;import java.util.Scanner;/** * @program: DataStructures * @description: 用数组实现队列:队列的特点:先进先出,后进后出; * 实现思路:1、定义属性,队列的大小maxSize,队列的头部front原创 2021-03-31 22:28:00 · 789 阅读 · 1 评论 -
五子棋--java数组实现稀疏数组保存棋盘
在五子棋游戏中,我们用一个二维数组来保存数据,然后将数据保存到本地文件,需要的时候恢复出来因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,故将二维数组转换成稀疏数组,再保存到文档中。可以看到,转换之后,数组的大小由7x7=49变成了9x3=27实现思路:1、保存棋盘时,将二维数组转换成稀疏数组,将稀疏数组存入文件中;2、恢复棋盘时,从文件中读出稀疏数组,再将稀疏数组转换为二维数组。代码实现:package com.xrw.sparsearray;import java原创 2021-03-23 20:58:20 · 560 阅读 · 0 评论 -
用java数组实现顺序表
一、要求:清除顺序表中的重复数据元素。如顺序表(2,3,3,4,3,5,4)清除后变为(2,3,4, 5)二、实现思路:写一个算法实现上面的操作在主程序中创建一个空的顺序表将(2,3,3,4,3,5,4)依次加入到空的顺序表中输出该顺序表调用清除重复元素这个算法,清除重复元素输出清除后的顺序表三、代码package com.xrw.ex2;import java.util.Arrays;/** * @program: courseExperiment原创 2021-03-23 20:28:53 · 470 阅读 · 0 评论 -
java实现三子棋小游戏
三子棋是一个很古老的民间传统游戏,玩起来也非常便捷。三子棋也叫做OOXX棋,井字棋等,用“井”字分出3×3的格子,双方轮流下棋子(可以用O或者X来区别),只要将自己的棋子连成直线(一行、一列或者对角线)就赢了,如果所有棋子都占满空格,没有任何一方成直线,则为平局。实现思路:a、程序提示第一个游戏者放置一个X棋子,然后提示第二个游戏者放置一个O棋子。每当游戏者放置一个棋子后,在屏幕显示棋盘状态,并判断棋局状态(胜、平、尚未结束)b、为放置一个棋子,程序应提示用户输入棋子的行号和列号。代码:impo原创 2021-03-15 20:40:18 · 1653 阅读 · 8 评论 -
手写Ribbon负载均衡算法
Ribbon有哪些自带的负载均衡算法默认出厂设置用的是轮询算法,就是每个服务列表按顺序依次访问;怎么替换默认的负载均衡算法首先注意一点,算法配置文件不能处于@ComponentScan注解所在的包及其子包下,原因就不说了,自己百度去。所以第一步,新建一个包com.xiexiaoyu.ribbon,然后新建一个配置类@Configurationpublic class MySelfRule{ @Bean public IRule myRule() { r原创 2020-10-29 23:37:45 · 459 阅读 · 0 评论 -
Java 设计模式看这一篇就够了
下面是自己学习设计模式的时候做的总结,有些是自己的原创文章,有些是网上写的比较好的文章,保存下来细细消化吧!系列文章推荐:https://design-patterns.readthedocs.io/zh_CN/latest/index.html创建型模式创建型模式概述创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离...原创 2020-04-03 18:16:31 · 223 阅读 · 0 评论 -
类加载过程
类的生命周期一个类的完整生命周期如下:类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字节流所代表...原创 2020-04-03 18:02:04 · 206 阅读 · 0 评论 -
JVM 垃圾回收
目录引言1 揭开 JVM 内存分配与回收的神秘面纱1.1 对象优先在 eden 区分配1.2 大对象直接进入老年代1.3 长期存活的对象将进入老年代1.4 动态对象年龄判定2 对象已经死亡?2.1 引用计数法2.2 可达性分析算法2.3 再谈引用2.4 不可达的对象并非“非死不可”2.5 如何判断一个常量是废弃常量2.6 如何判断一个类是无用的类3 垃圾收集算法3.1 标记-清除算法3.2 复制...原创 2020-04-03 17:52:09 · 523 阅读 · 0 评论 -
Java 内存区域详解
如果没有特殊说明,都是针对的是 HotSpot 虚拟机。一 概述对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那...原创 2020-04-03 17:46:16 · 203 阅读 · 0 评论 -
悲观锁与乐观锁
何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它...原创 2020-04-03 17:37:03 · 129 阅读 · 0 评论 -
Java线程池学习总结
这里很多地方引用了百度、平时收集的文章,出处找不到了目录一 使用线程池的好处二 Executor 框架2.1 简介2.2 Executor 框架结构(主要由三大部分组成)1) 任务(`Runnable` /`Callable`)2) 任务的执行(`Executor`)3) 异步计算的结果(`Future`)2.3 Executor 框架的使用示意图三 (重要)ThreadPoolExecut...原创 2020-04-03 17:34:39 · 831 阅读 · 0 评论 -
并发容器总结
目录一 JDK 提供的并发容器总结二 ConcurrentHashMap三 CopyOnWriteArrayList3.1 CopyOnWriteArrayList 简介3.2 CopyOnWriteArrayList 是如何做到的?3.3 CopyOnWriteArrayList 读取和写入源码简单分析3.3.1 CopyOnWriteArrayList 读取操作的实现3.3.2 CopyOnW...原创 2020-04-03 17:26:38 · 119 阅读 · 0 评论 -
AQS
1. AQS 介绍AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQu...转载 2020-04-03 17:19:25 · 224 阅读 · 0 评论 -
Java8新特性之Annotations(注解)
在Java 8中支持多重注解了,先看个例子来理解一下是什么意思。首先定义一个包装类Hints注解用来放置一组具体的Hint注解:@interface Hints { Hint[] value();}@Repeatable(Hints.class)@interface Hint { String value();}Java 8允许我们把同一个类型的注解使用多次,只需要...原创 2020-04-03 16:55:48 · 627 阅读 · 0 评论 -
Java8新特性之Date API(日期相关API)
Java 8在 java.time 包下包含一个全新的日期和时间API。新的Date API与Joda-Time库相似,但它们不一样。以下示例涵盖了此新 API 的最重要部分。译者对这部分内容参考相关书籍做了大部分修改。(总结):Clock 类提供了访问当前日期和时间的方法,Clock 是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某...原创 2020-04-03 16:52:21 · 700 阅读 · 0 评论 -
Java8新特性之Maps的一些新增方法
Map 类型不支持 streams,不过Map提供了一些新的有用的方法来处理一些日常任务。Map接口本身没有可用的 stream()方法,但是你可以在键,值上创建专门的流或者通过 map.keySet().stream(),map.values().stream()和map.entrySet().stream()。此外,Maps 支持各种新的和有用的方法来执行常见任务。Map<Integ...原创 2020-04-03 16:37:21 · 2667 阅读 · 0 评论 -
Java8新特性之Optionals
Optionals不是函数式接口,而是用于防止 NullPointerException 的漂亮工具。Optional 是一个简单的容器,其值可能是null或者不是null。在Java 8之前一般某个函数应该返回非空对象但是有时却什么也没有返回,而在Java 8中,你应该返回 Optional 而不是 null。//of():为非null的值创建一个OptionalOptional<S...原创 2020-04-02 17:44:22 · 1001 阅读 · 0 评论 -
Java8新特性之Lambda表达式(Lambda expressions)
目录一、Lambda表达式二、函数式接口(Functional Interfaces)三、方法和构造函数引用(Method and Constructor References)四、Lamda 表达式作用域(Lambda Scopes)访问局部变量访问字段和静态变量访问默认接口方法五、内置函数式接口(Built-in Functional Interfaces)PredicatesFunction...原创 2020-04-02 17:42:40 · 705 阅读 · 0 评论 -
Java8新特性之接口的默认方法(Default Methods for Interfaces)
Java 8使我们能够通过使用 default 关键字向接口添加非抽象方法实现。 此功能也称为虚拟扩展方法。第一个例子:interface Formula{ double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }}Formula 接口中除了抽象方...原创 2020-04-02 17:36:22 · 270 阅读 · 0 评论 -
Java8新特性之Streams和Parallel Streams
一、Streams(流)java.util.Stream 表示能应用在一组元素上一次执行的操作序列。Stream 操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样你就可以将多个操作依次串起来。Stream 的创建需要指定一个数据源,比如java.util.Collection 的子类,List 或者 Set, Map 不支持。Stream ...原创 2020-04-02 17:21:44 · 1513 阅读 · 0 评论 -
Java线程池
1.1. 为什么要用线程池?池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通...原创 2020-03-31 14:48:01 · 144 阅读 · 0 评论 -
ThreadLocal
1.1. ThreadLocal简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个Thre...原创 2020-03-31 14:41:18 · 113 阅读 · 0 评论 -
synchronized 关键字和 volatile 关键字的区别
volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 syn...原创 2020-03-31 14:30:47 · 365 阅读 · 0 评论 -
synchronized 关键字
1.1. 对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线...原创 2020-03-31 14:02:04 · 143 阅读 · 0 评论 -
为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
new 一个 Thread,线程进入了新建状态;调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。...原创 2020-03-31 11:34:31 · 1150 阅读 · 0 评论 -
sleep() 方法和 wait() 方法区别和共同点
两者最主要的区别在于:sleep 方法没有释放锁,而 wait 方法释放了锁 。两者都可以暂停线程的执行。Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用 wait(long t...原创 2020-03-31 11:22:37 · 944 阅读 · 0 评论 -
什么是上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时...原创 2020-03-31 11:15:23 · 3074 阅读 · 1 评论 -
线程的生命周期和状态
Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态(图源《Java 并发编程艺术》4.1.4 节)。线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示(图源《Java 并发编程艺术》4.1.4 节):由上图可以看出:线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行...原创 2020-03-31 11:10:50 · 296 阅读 · 0 评论 -
为什么要使用多线程?
先从总体上来说:从计算机底层来说: 线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。从当代互联网发展趋势来说: 现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。再深入到计...原创 2020-03-31 11:08:44 · 1212 阅读 · 0 评论 -
什么是线程和进程?
1.1. 何为进程?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行...原创 2020-03-31 11:06:22 · 286 阅读 · 0 评论 -
comparable 和 Comparator的区别
comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()方法或compare()方法,当我们需要对某一个集...原创 2020-03-31 10:10:12 · 102 阅读 · 0 评论 -
ConcurrentHashMap线程安全的具体实现方式/底层具体实现
JDK1.7首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。st...原创 2020-03-31 10:05:29 · 556 阅读 · 0 评论 -
ConcurrentHashMap 和 Hashtable 的区别
出处不明,在此记录ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都...原创 2020-03-31 10:02:25 · 494 阅读 · 0 评论 -
HashMap 的长度为什么是2的幂次方
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位...原创 2020-03-31 09:59:17 · 150 阅读 · 0 评论 -
HashMap的底层实现
JDK1.8之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相...原创 2020-03-31 09:56:36 · 146 阅读 · 0 评论 -
HashSet如何检查重复
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。(摘自我...原创 2020-03-31 09:51:51 · 1149 阅读 · 0 评论 -
HashMap 和 HashSet区别
如果看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone()、writeObject()、readObject()是 HashSet 自己不得不实现之外,其他方法都是直接调用 HashMap 中的方法。HashMapHashSet实现了Map接口实现Set接口存储键值对...原创 2020-03-31 09:50:30 · 134 阅读 · 0 评论