自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 集合总结

Java 集合类简介1.1 集合概览Java 集合类主要都是从 Collection 和 Map 两个接口派生而成,其中 Collection 又包含 List、Set 和 Queue,如下图。Java 集合就像容器,能够将多个同类型的对象装进该容器中,所以又叫容器。其中各集合含义如下:Map:代表具有映射关系的集合,通过 key-value 存储,其中 key 是不可重复的,用于标识集合中的每项数据,每个 key 最多只能映射一个 value;List:代表有序、可重复的集合;Set:代表无.

2020-11-04 22:29:43 206

原创 mysql 事务相关总结

事务隔离级别(图文详解)什么是事务?事务的特性(ACID)并发事务带来的问题事务隔离级别实际情况演示脏读(读未提交)避免脏读(读已提交)不可重复读10.可重复读防止幻读(可重复读)什么是事务?事务是逻辑上的一组操作,要么都执行,要么都不执行。事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余.

2020-08-22 00:37:20 230

原创 字符串的最长公共子序列

审题最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套路,比如说编辑距离。而且,这个算法稍加改造就可以用于解决其他问题,所以说LCS算法是值得掌握的。所谓子序列,就是要保留原始顺序,但可以是不连续的。审题之后你可能会有疑问,这个问题为啥就是动态规划来解决呢?因为子序列类型的问题,穷举出所有可能的结果都不容易,而动态规划算法做的就是穷举 + 剪枝,它俩天生一对儿。所以可

2020-08-21 10:06:52 1202

原创 选择排序代码

/ 找到元素中最大的数 记录下标,与元素最后一个数交换;//找到剩下的元素中最大的数,记录下标,与倒数第二个元素交换 end -- (倒数第二)//依次按照上面的方法//最好最坏 时间复杂度o(n^2)public class xuanze { public static void main(String[] args) { int[] array = {56, 9, 0, 7, 23, 94, 28, 990, 56}; for (int end = a

2020-08-14 14:34:26 326

原创 插入排序代码

public class charu { //从第一值向前插入,后面的数字在向前面插入的时候, // 前面的数字一定已经排序好了,找一个位置将这个放入正确的位置 public static void main(String[] args) { int [] ar ={19,3,6,8,219,57,2,6,3,8}; for (int i = 0; i <ar.length ; i++) {//将a【i] 向前移动,移动到前面一个值比它小,或.

2020-08-14 14:33:28 354

原创 冒泡排序代码

public class Mapao { //优化 如果提前有序 可以终止 public static void main(String[] args) { int [] array ={56,9,0,7,23,94,28}; for(int end=array.length-1;end>0;end--){ // boolean sorted =true;// 每趟扫描都假定有序 for(int begin

2020-08-14 09:32:35 213

原创 如何实现三个窗口并发卖票安全

public class MyRunnable implements Runnable { private int tickets=100; private Object obj=new Object (); @Override public void run() { while (true){ synchronized (obj){ if(tickets>0){ tr

2020-08-10 22:50:59 166

原创 Hashmap map的遍历方式

map的遍历第一种:KeySet()将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key 。取到的结果会乱序,是因为取得数据行主键的时候,使用了HashMap.keySet()方法,而这个方法返回的Set结果,里面的数据是乱序排放的。public class Test1 { public static void main(String[] args) {

2020-08-10 20:39:05 140

原创 String StringBuffer StringBuilder 的区别及应用场景

面试中经常会问到他们三个的区别,我也被面到过,只讲出了其中的一些,今天做个笔记再次温故一下他们一般都是从区别说起,首先呢 String 是一个不可变量:字符串常量。StringBuffer 和StingBuilder 都是字符串变量对于三者使用的总结: 1.如果要操作少量的数据用 String 2.单线程操作字符串缓冲区 下操作大量数据用StringBuilder 3.多线程操作字符串缓冲区 下操作大量数据 用StringBufferStringBuffers 是线程安全的,只是Stri

2020-08-06 23:33:58 327

原创 大白话讲hashmap的hash值计算和扩容

hashmap hash计算 和扩容首先算得key得hashcode值,然后跟数组的长度-1做一次“与”运算(&)。看上去很简单,其实比较有玄机。比如数组的长度是2的4次方,那么hashcode就会和2的4次方-1做“与”运算。很多人都有这个疑问,为什么hashmap的数组初始化大小都是2的次方大小时,hashmap的效率最高,我以2的4次方举例,来解释一下为什么数组大小为2的幂时hashmap访问的性能最高。看上图,左边两组是数组长度为16(2的4次方),右边两组是数组长度为15。两组的ha

2020-07-29 22:28:26 2053

原创 hashma的put 方法总结

Hashmap put 方法流程图HashMap的put方法流程总结1、put(key, value)中直接调用了内部的putVal方法,并且先对key进行了hash操作;2、putVal方法中,先检查HashMap数据结构中的索引数组表是否位空,如果是的话则进行一次resize操作;3、以HashMap索引数组表的长度减一与key的hash值进行与运算,得出在数组中的索引,如果索引指定的位置值为空,则新建一个k-v的新节点;4、如果不满足的3的条件,则说明索引指定的数组位置的已经存在内容,这个

2020-07-25 21:01:16 1947

原创 双遍循环法实现快速排序

1)选定基准元素pivot,并且设置两个指针left和right,指向数列的最左和最右边两个元素。(2)接下来进行第一次循环,从right指针开始,让指针所指向元素和基准元素做比较。如果大于或者等于pivot,则指针向左移动;如果小于pivot,则right指针停止移动,切换到left指针。(3)left指针移动时,让指针所指向的元素和基准元素作比较。如果小于或等于pivot,则指针向右移动;如果大于pivot,则left指针停止移动。(4)直到left指针和right指针重合,将基准元素pivot与

2020-07-23 00:47:47 520

原创 Leetcode 最长回文子串第5题 用动态规划的解法

最长回文子串题目给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。第 1 步:定义状态dp[i][j] 表示子串 s[i…j] 是否为回文子串,这里子串 s[i…j] 定义为左闭右闭区间,可以取到 s[i] 和 s[j]。第 2 步:思考状态转移方程在这一步分类讨论(根据头尾字符是否相等),根据上面的分析得到:dp[i][j] = (s[i] == s[j])

2020-07-20 01:00:51 171

原创 删除链表的节点

删除值为 val 的节点可分为两步:定位节点、修改引用。定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。算法流程:1 .特例处理: 当应删除头节点 head 时,直接返回 head.next 即可。2.初始化: pre = head , cur = head.next 。3 . 定位节点: 当 c

2020-07-14 23:29:11 191

原创 redis 面试整理

redis和DB的数据一致性怎么保证更新的时候,先删除缓存,然后再更新数据库。读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。redis数据类型1、String:key-valueredis命令不区分大小写,但是key区分的2、Hash: key-field-value相当于一个key 对应一个map (map中又是key- value),应用于归类3、ListList是有顺序可重复(数据结构中的:双链表,队列)可作为链表 ,从左添加元素 也可以从右添加元

2020-07-12 17:26:42 147

原创 多线程和高并发的常见面试题整理

1.线程实现方式1继承Thread类定义Thread类的子类,并重写Thread类的run()方法,创建子类对象(即线程对象),调用线程对象的start()方法来启动该线程2.实现Runnable接口并重写该接口的run()方法,该run()方法同样是该线程的执行体。创建该Runnable实现类的实例,并将此实例作为Thread的target(即构造函数中的参数)来创建Thread对象(该Thread对象才是真正的线程对象,只是该Thread对象负责执行其target的run()方法)。最后调用线程

2020-07-12 11:46:03 7725

原创 浅谈String、StringBuffer与StringBuilder之间区别

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情.

2020-07-11 21:00:56 219

原创 浅谈快速入门JVM

JVM的位置首先我们来看看 JVM 在我们整个系统的位置:JVM体系结构图如果你不能够闭着眼睛画出 JVM 的体系结构图,说明你还没有入门 JVM:类加载器ClassLoader我们先来看看一个类加载到 JVM 的一个基本结构:类的加载、连接与初始化在Java代码中,Class的加载、连接与初始化过程都是在程序运行期间完成的。Runtime!类的加载类的加载指的是将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区内的方法区内,然后再内存中创建一个 java.lan

2020-07-11 17:47:14 643

原创 单例模式模式的几种写法

1.单例模式的定义单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。2.单例模式的特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。3.单例模式的应用在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统

2020-07-11 15:12:34 129

原创 TCP和Udp的区别是什么?

OSI 和 TCP/IP 模型在传输层定义两种传输协议:TCP(或传输控制协议)和 UDP(或用户数据报协议)。UDP:UDP 与 TCP 的主要区别在于 UDP 不一定提供可靠的数据传输。事实上,该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时(其中任意给定数据的重要性相对较低),可使用 UDP。ICQ 短消息使用 UDP 协议发送消息。TCP:TCP的目的是提供可靠的数据传输,并在相互进行通信的设备或服务之间保持一个虚拟连接。TC.

2020-07-11 08:54:20 656

原创 产生死锁的原因和必要条件 解决死锁的方法

死锁:指多个进程因竞争共享资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。安全状态与不安全状态:安全状态指系统能按某种进程顺序来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺利完成。若系统不存在这样一个序列, 则称系统处于不安全状态。产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当产生死锁的必要条件:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥

2020-07-11 07:52:11 389

原创 CAS原理分析及ABA问题解决方法

什么是CASCAS即Compare And Swap的缩写,翻译成中文就是比较并交换,其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是原子性的操作(读和写两者同时具有原子性),其实现方式是通过借助C/C++调用CPU指令完成的,所以效率很高。CAS的原理很简单,这里使用一段Java代码来描述public boolean compareAndSwap(int value, int expect, int update) {//

2020-07-11 00:32:58 604

原创 进程间通信和线程间通信方式

进程和线程的区别:对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品。而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数据,而且拥有自己的栈空间,拥有独立序列。共同点: 它们都能提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点。 线程执行开销比较小,但不利于资源的管理和保护,而进程相反。同时,线程适合在SMP机器上运行,而进程可以跨机器迁移。他们之间根本区别在于 多进程中每个进程有自己的地址空间,线

2020-07-11 00:02:10 287

转载 常见的微服务面试题

1、什么是微服务?微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来

2020-07-10 10:48:52 2552

原创 关于Mac mysql my.cnf 配置文件方法

使用Mac的小伙伴在安装配置mysql的时候可能会遇到需要配置my.cnf配置文件的情况1.如果你只是想确认mysql加载的是哪个配置文件那你可以使用以下方法进行确认。mysql --verbose --help | grep my.cnf会得到类似以下的几个地址,默认是在/etc/下的my.cnf。打开my.cnf 文件:sudo vim /etc/my.cnf输入:# Example MySQL config file for medium systems. # #

2020-07-08 01:30:13 3940

原创 Starting MySQLERROR! The server quit without updating PID file (/usr/local/mysql/data/xxx)遇到的坑

mysql 好好的突然出现了问题,在网上看了很多种解决方案也没解决了。自己弄了一上午,也没弄好。今天晚上看了一下自己的 my.cnf文件是空的,原来是mysql在新版中去掉了默认配置文件my.cnf如果需要可以手动创建。可以通过命令: mysql --verbose --help | grep my.cnf找到文件 :sudo vim /etc/my.cnf写入内容:# Example MySQL config file for medium systems. # # Th.

2020-07-08 01:19:12 4892 2

原创 [oh-my-zsh] 提示检测到不安全的完成相关目录的问题解决

问题运行命令时,[oh-my-zsh] 冒出下面一大堆提示:解决问题的描述中,其实已经给了我们解决方法:翻译:要修复权限,可以通过禁用“group”和“others”的写入权限并确保这些目录的所有者是root用户或当前用户来修复权限。以下命令可能有所帮助:compaudit | xargs chmod g-w,o-w如果上面没有帮助,或者你想跳过不安全目录的验证,你可以在你的zshrc文件中找到oh-my-zsh之前将变量ZSH_DISABLE_COMPFIX设置为“true”。第一种

2020-07-08 00:39:34 1137 1

原创 Java基础面试题部分整理

原文链接:https://blog.csdn.net/qq_41701956/article/details/86773940面向对象的三个特征封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象.多态的好处允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用).主要有以下优点:可替换性:多态对已存在代码具有可替换性.可扩充性:增加新的子类不影响已经存在的类结构.接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善

2020-07-06 22:44:02 156

原创 JMM volatile

问题:请你谈谈你对volatile的理解volitile 是 Java 虚拟机提供的轻量级的同步机制,三大特性:1、保证可见性2、不保证原子性3、禁止指令重排什么是JMMJMM规定了内存主要划分为主内存和工作内存两种。此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,如果非要对应起来,主内存对应的是Java堆中的对象实例部分,工作内存对应的是栈中的部分区域,从更底层的来说,主内存对应的是硬件的物理内存,工作内存对应的是寄存器和高速缓存。volatilevolat

2020-07-05 21:01:15 270

原创 2020.1 idea maven 不自动导入解决办法

更新了2020 版的idea maven 导入出现了问题,之前只要点击右下角的自动导入就行了现在出现了问题。看来网上,知道了解决办法问题idea 升级到 2020.x 版后,变更 MAVEN 不会自动更新依赖、也没有设置选项。解决通用方案当我们修改了 maven 依赖以后,当前 pom 文件的右上角会出现一个 maven 的小图标,点一下就可以更新依赖了。快捷键方案将鼠标放到 maven 图标上后,会出现快捷键提示。MAC Shift + Command + IWindows:Ctrl

2020-06-19 21:11:33 9506 8

原创 SpringBoot项目 IDEA控制台log 颜色显示

当控制台INFO没有颜色显示时,看着不舒服在Run/Debug Configurations 添加相关参数VM options:-Dspring.output.ansi.enabled=ALWAYS这样就显示了

2020-06-17 11:33:54 2958 6

原创 IDEA,MAVEN项目导入后依赖出现红色波浪线

导入项目是时,maven 出现爆红,pom 文件正常,如图解决办法打开setting——>Compiler——>勾选Build Project automatically重启idea 就可以了

2020-06-17 11:15:23 2244

原创 线程池

池化技术程序的运行,其本质上,是对系统资源(CPU、内存、磁盘、网络等等)的使用。如何高效的使用这些资源是我们编程优化演进的一个方向。今天说的线程池就是一种对CPU利用的优化手段。通过学习线程池原理,明白所有池化技术的基本设计思路。遇到其他相似问题可以解决。1 池化技术前面提到一个名词——池化技术,那么到底什么是池化技术呢 ?池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。在编程领域,比较典型的池化技术有:线程

2020-06-08 22:04:57 244

原创 阻塞队列和SynchronousQueue 同步队列

阻塞:必须要阻塞、不得不阻塞阻塞队列是一个队列,在数据结构中起的作用如下图:当队列是空的,从队列中获取元素的操作将会被阻塞。当队列是满的,从队列中添加元素的操作将会被阻塞。试图从空的队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素。阻塞队列的用处:在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤起。为什么需要 BlockingQueue?好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切Blockin

2020-06-08 19:02:22 962

原创 Condition 实现精准通知唤醒

精确通知顺序访问package juc;//多线程之间按顺序调用import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class C { public static void main(String[] args) { Data3 data =ne

2020-06-05 18:27:41 709

原创 生产者和消费者

生产者和消费者 synchroinzed 版package juc;/* 线程之间的通信问题: 生产者消费者问题! 等待唤醒,通知唤醒 线程交替执行 A B 操作同一变量 num=0A num+1B num-1* */public class A { public static void main(String[] args) { Data data = new Data(); new Thread(()->{ for (i

2020-06-05 17:50:37 66

原创 synchronized 和 lock 区别

传统的 synchronized题目:三个售票员 卖出 30张票 : 1. 在高内聚低耦合的前提下, 线程 操作(对外暴露的调用方法) 资源类传统的 synchronizedpackage juc;public class SaleTicketDemo1 { public static void main(String[] args) { Ticket ticket=new Ticket(); new Thread(()->{

2020-06-05 16:44:42 115

原创 mac os中try catch快捷键

option+command+t

2020-06-05 16:24:44 695

原创 进程 / 线程 并发 / 并行

进程 / 线程是什么?进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程 :通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义,线程可以利用进程所有拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高

2020-06-05 15:54:53 168

原创 多线程

多线程学习1.线程简介 线程实现(重点)2. 线程状态 线程同步(重点)01线程简介: 任务,进程,线程,多线程线程就是独立的执行路径;在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;umain()称之为主线程,为系统的入口,用于执行整个程序;在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能认为的干预的。对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;u线程会带来额外的开销,如cpu调度时间,并

2020-06-05 10:43:26 102

空空如也

空空如也

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

TA关注的人

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