自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringMVC执行过程

2021-06-14 00:27:47 101

原创 HashMap与Hashtable的区别

HashMap与Hashtable有什么区别??Hashtable线程安全,HashMap线程不安全,因为Hashtable源码中的所有方法都加了synchronized关键字,每个线程过来访问都需要进行排队,导致同步效率比较低,所以我们通常会使用ConcurrentHashMap,它不会把整个方法全部锁住,会采用分段锁的方式对数据进行锁定。继承的父类不一样。源码中Hashtable继承的是Dictionary,HashMap继承的是AbstractMapHas...

2021-06-14 00:05:59 75

原创 JDK是什么?JRE、JVM又是什么?JAVA为什么能跨平台?

JDK、JRE、JVM、JAVA跨平台我相信每个刚接触Java的小白都对JDK、JRE、JVM、JAVA跨平台都特别敏感,经常能听到这些专业名词,可又偏偏弄不懂这些到底是啥玩意,接下来就让我好好给你们分析分析,希望能给你们带来一些帮助,少走一些弯路! ^ _ ^一、首先我们先看看基本的官方介绍JDK是什么?JDK(Java Development Kit) 是 Java 语言的软件开发工具...

2019-10-30 22:41:44 1113

原创 BIO、NIO、AIO、Netty 学习笔记

首先了解一下什么是IO?Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化写入输出流。串行化就是数据要按顺序进行输入输出,也就是java通过io流方式和外部设备进行交互。比如程序从服务器上下载图片,就是通过流的方式从网络上以流的方式到程序中,再到硬盘中。同步与异步,阻塞与非阻塞的区别同步,一个任务的完成之前不能做其他操作,必须等待(等于在打电话)。异步,一个任务的完成之前,可以进行其他操作(等于在聊QQ)。阻塞,是相对于CPU来说的, 挂起当前线程,不能做其他操作只...

2021-08-08 22:59:10 289

原创 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。import java.util.*;public class Solution { /** * @param str string字符串 输入字符串 * @param k int整型 左移位数

2021-08-08 15:19:07 549

原创 Ribbon负载均衡算法都有哪几种?随机策略工作原理并实现

RoundRobinRule:轮询的方式 默认 RandomRule:随机方式 WeightedResponseTimeRule:加权策略,根据响应时间分配权重的方式,响应越快分配的值越大。 BestAvailableRule:请求数最少策略,选择并发量最小的服务器分配。 RetryRule:在配置时间段内选择server不成功,使用subRule方式选择可用的Server。 ZoneAvoidanceRule:根据服务器的性能和可用性来选择。 AvailabilityFilteringRule

2021-06-21 23:48:04 383

原创 观察者模式

对象间存在一对多关系时,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会自动通知依赖它的观察者对象,使它们能自动更新。

2021-06-20 17:54:45 148

原创 发布订阅模式

发布/订阅是一种消息范式,消息发布者(Publisher)不会将消息直接发送给订阅者(Subscriber),而是通过消息通道(Event Channel)广播出去,让订阅者收到。1.发布者接口public interface Publisher { public void publish(Channel channel ,String msg);}2.订阅者接口public interface Subcriber { public void subcrib...

2021-06-20 17:36:12 221

原创 单链表的选择排序

描述给定一个无序单链表,实现单链表的选择排序(按升序排序)。要求:额外空间复杂度是O(1)。

2021-06-18 21:12:38 650 2

原创 在链表中删除指定值的节点(两种解决方法)

描述给出一个链表和一个整数num,输出删除链表中节点值等于num的节点之后的链表。示例1输入:4 1 2 3 43输出:1 2 4

2021-06-18 16:51:06 1520 1

原创 删除无序链表中值重复出现的节点(两种解决方法)

描述给定一个无序链表,删除其中值重复出现的节点(保留当中顺序遍历第一个出现的节点)。示例1输入:51 3 2 3 1输出:1 3 2

2021-06-18 15:58:51 1071

原创 合并两个有序的单链表

描述给定两个升序的单链表的头节点head1和head2,请合并两个升序链表,合并后的链表依然升序,并返回合并后链表的头节点。

2021-06-18 11:55:20 337 1

原创 两个链表生成相加链表

描述假设链表中每一个节点的值都在 0 - 9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。例如:链表 1为 9->3->7,链表 2为 6->3,最后生成新的结果链表为 1->0->0->0,937+63=1000。方法一:解题思路:利用两个栈,先将每个链表各自压入栈,链表 1为9->3->7压入s1栈就变成自顶向下7,3,9 链表 2为 6->3压入s2栈就变成自顶...

2021-06-18 01:01:42 346 1

原创 反转部分单向链表

描述给定一个单链表,在链表中把第L个节点到第 R 个节点这一部分进行反转。示例1输入:51 2 3 4 51 3输出:3 2 1 4 5

2021-06-17 22:50:38 416

原创 反转单向链表和双向链表

描述实现反转单向链表和双向链表的函数。如 1->2->3 反转后变成 3->2->1。示例1输入:31 2 341 2 3 4输出:3 2 14 3 2 1

2021-06-17 20:28:28 245

原创 输出链表中倒数最后k个结点

描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入:{1,2,3,4,5},1 返回值:{5} ...

2021-06-17 01:05:38 262

原创 删除链表第 K 个节点

描述给定一个链表,实现删除链表第K个节点的函数。输入描述:n 表示链表的长度。m 表示删除链表第几个节点。val 表示链表节点的值。输出描述:在给定的函数中返回链表的头指针。示例1输入:5 31 2 3 4 5输出:1 2 4 5...

2021-06-17 00:30:16 929

原创 在链表中删除倒数第K个节点

描述给出一个单链表,返回删除单链表的倒数第 K 个节点的链表。输入描述:n 表示链表的长度。val 表示链表中节点的值。输出描述:在给定的函数内返回链表的头指针。示例1输入:5 41 2 3 4 5输出:1 3 4 5...

2021-06-16 22:10:13 229

原创 打印两个升序链表的公共部分

描述给定两个升序链表,打印两个升序链表的公共部分。输入描述:第一个链表的长度为 n。第二个链表的长度为 m。链表结点的值为 val。输出描述:输出一行整数表示两个升序链表的公共部分的值 (按升序输出)。示例1输入:41 2 3 451 2 3 5 6输出:1 2 3...

2021-06-16 18:26:38 155

原创 用一个栈实现另一个栈的排序

import java.util.Scanner;import java.util.Stack;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main { public static void sortStackByStack(Stack<Integer> stack){ Stack<Integer> help =new Stack<Integer>(); ...

2021-06-16 00:12:04 143

原创 猫狗队列实现

描述实现一种猫狗队列的结构,要求如下:1.用户可以调用add方法将cat或者dog 放入队列中2.用户可以调用pollAll方法将队列中的cat和dog按照进队列的先后顺序依次弹出3.用户可以调用pollDog方法将队列中的dog按照进队列的先后顺序依次弹出4.用户可以调用pollCat方法将队列中的cat按照进队列的先后顺序依次弹出5.用户可以调用isEmpty方法检查队列中是否还有dog或cat6.用户可以调用is...

2021-06-15 23:36:16 254

原创 用递归函数和栈逆序一个栈

描述一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。输入描述:输入数据第一行一个整数N为栈中元素的个数。接下来一行N个整数XiX_iXi​表示从栈顶依次到栈底的每个元素。输出描述:输出一行表示栈中元素逆序后的每个元素示例1输入:51 2 3 4 5输出:5 4 3 2 1...

2021-06-15 16:23:52 164

原创 用两个栈实现队列,支持队列的基本操作。

描述用两个栈实现队列,支持队列的基本操作。输入描述:第一行输入一个整数N,表示对队列进行的操作总数。下面N行每行输入一个字符串S,表示操作的种类。如果S为"add",则后面还有一个整数X表示向队列尾部加入整数X。如果S为"poll",则表示弹出队列头部操作。如果S为"peek",则表示询问当前队列中头部元素是多少。输出描述:对于每一个为"peek"的操作,输出一行表示当前队列中头部元素是多少。示例1输入:6add 1add 2add 3peekpollp

2021-06-15 14:18:44 316

原创 设计getMin功能的栈

描述实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。输入描述:第一行输入一个整数N,表示对栈进行的操作总数。下面N行每行输入一个字符串S,表示操作的种类。如果S为"push",则后面还有一个整数X表示向栈里压入整数X。如果S为"pop",则表示弹出栈顶操作。如果S为"getMin",则表示询问当前栈中的最小元素是多少。输出描述:对于每个getMin操作,输出一行表示当前栈中的最小元素是多少。...

2021-06-15 01:10:42 189 1

原创 HTTP、HTTPS、tcp

HTTP协议

2021-06-14 00:21:23 93

原创 类加载器学习

类加载器学习学习网址:https://blog.csdn.net/weixin_37766296/article/details/80545283?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7E

2021-06-14 00:19:19 1098 1

原创 引用类型 String 学习

String 3大特性不变性:是一个immutable模式的对象,不变模式的主要作用是当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。 常量池优化: String 对象创建之后,会在字符串常量池中进行缓存,下次创建同样的对象时,会直接返回缓存的引用。 final: String 类不可被继承,提高了系统的安全性。String不是基本数据类型是引用类型String实例化直接赋值:String str1=”Hello” 存放在常量池中。通过构造方法:String str2

2021-06-14 00:12:45 150

原创 Java 反射机制

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射...

2021-06-14 00:11:29 1082 1

原创 JMM多线程内存模型

多核并发缓存JMM多线程内存模型volatile 能保证数据的可见性volatile的作用可以强制线程从公共内存中读取变量的值,而不是从工作内存中读取8大原子操作:用于开发jvm时规范不同公司版本的统一操作缓存一致性协议(MESI)当多个cpu从主内存读取同一个数据到各自的高速缓存一旦开启了MESI,某个工作内存中修改完的值立马同步到主内存中!也就是马上进行store和write原子操作,将这个工作内存的值赋值给主内存! 打开cp

2021-06-14 00:09:00 122

原创 HashMap的问答总结

关于Hash的14问Q0:HashMap是如何定位下标的?A:先获取Key,然后对Key进行hash,获取一个hash值,然后用hash值对HashMap的容量进行取余(实际上不是真的取余,而是使用按位与操作,原因参考Q6),最后得到下标。Q1:HashMap由什么组成?A:数组+单链表,jdk1.8以后又加了红黑树,当链表节点个数超过8个(m默认值)以后,开始使用红黑树,使用红黑树一个综合取优的选择,相对于其他数据结构,红黑树的查询和插入效率都比较高。而当红黑树的节点个数小于6个(默.

2021-06-14 00:03:32 258

原创 HashMap源码学习笔记

jdk1.7的HashMap底层原理简单理解一遍jdk1.7的HashMap底层原理数组中的每一个位置都有一个entry对象的引用地址一个entry对应一个key对应一个index????这个index是通过hashcode为什么hashcode取余不可以当index?如果 346546464%8 ------0~7的数就会出现相同的index,都要存在这个数组的同一个位置这就是哈希冲突!!产生哈希冲突的解决办法?数组加链表的方式,每一个数组位...

2021-06-13 23:53:16 176

原创 二分法(折半查找法)查找第一个大于等于给定值的元素

在arr数组上,找满足>=value的最左位置带有对数器的二分查找1、查找第一个大于等于给定值的元素public class Code05_BSNearLeft { //在arr上,找满足>=value的最左位置 O(logn) public static int nearestIndex(int[] arr,int value){ int L=0; int R=arr.length-1; int index = -

2021-06-13 23:36:12 3449

原创 二分法(折半查找法)存在性问题

利用二分法(折半查找法)判断一个有序数组是否存在某个值O(logn) 惊人的查找速度假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。二分查找应用场景的局限性(只是在查找上)首先,二分查找依赖的是顺序表结构,简单点说就是数组。其次,二分查找针对的是有序数据。再次,数据量太小不适合二分查找。最后,数据量太大也不适合二分查找。public class Code04_BSExit { // 利用二分法(折半查找法)

2021-06-13 23:26:35 728

原创 二分法(折半查找法)局部最小问题

局部最小问题,无序数组中找到一个局部最小即可分为三种情况 0<1 小/ N-1>N \ \ 先降后升,中间必定存在局部最小 /只要具有排他性的问题都可以用二分public class Code07_BSAwesome { //局部最小问题,无序数组中找到一个局部最小即可 //arr是无序数组 public static int getLessIndex(int[]arr){ if(arr==null||arr.length=..

2021-06-13 23:19:20 418

原创 桶排序

package sorts;public class BucketSort { /** * 桶排序 * * @param arr 数组 * @param bucketSize 桶容量 */ public static void bucketSort(int[] arr, int bucketSize) { if (arr.length < 2) { return; } .

2021-03-07 23:01:55 108

原创 几种常见排序(冒泡排序、插入排序、选择排序)

有序度逆序度 = 满有序度 - 有序度。我们排序的过程就是一种增加有序度,减少逆序度的过程,最后达到满有序度,就说明排序完成了。我还是拿前面举的那个冒泡排序的例子来说明。要排序的数组的初始状态是 4,5,6,3,2,1 ,其中,有序元素对有 (4,5) (4,6)(5,6),所以有序度是 3。n=6,所以排序完成之后终态的满有序度为 n*(n-1)/2=15。冒泡排序包含两个操作原子,比较和交换。每交换一次,有序度就加 1。不管算法怎么改进,交换次数总是确定的,即为逆序度,也就是n*(n

2021-03-06 17:15:50 364

原创 栈(为什么栈功能少,限制多,但还这么受欢迎?)

什么是栈?那就是后进者先出,先进者后出。为什么栈结构受限制,功能少,还这么受欢迎?从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。我第一次接触这种数据结构的时候,就对它存在的意义产生了很大的疑惑。因为我觉得,相比数组和链表,栈带给我的只有限制,并没有任何优势。那我直接使用数组或者链表不就好了吗?为什么还要用这个“操作受限”的“栈”呢?事实上,从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多

2021-03-05 21:41:34 474 1

原创 链表(快速写代码)

链表的代码写起来是不是很费劲?想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转、有序链表合并等,写的时候非常容易出错。技巧一:理解指针或引用的含义指针的定义:将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。p->next=q。这行代码是说,p 结点中的 next 指针存储了 q 结点的内存地址,也就是p指向q链表。p->next=p->next-&

2021-03-04 22:31:55 179 1

原创 链表(快速懂原理)

什么是链表?链表是通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。链表与数组的区别数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我

2021-03-04 21:20:30 1832 1

原创 数组

什么是数组?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。1、线性表(Linear List)。线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。如图所示:非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。2、连续的内存空间和相同类型的数据正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”

2021-03-03 18:50:57 3185 1

空空如也

空空如也

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

TA关注的人

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