- 博客(237)
- 收藏
- 关注
原创 秋招后知识点查漏补缺
Java中object类中的常见方法hashCode()首先这个方法的返回值是int类型,所以hashcode算出来的hash值都是int范围内的值:-2^31 ~ 2^31 - 1默认的hashCode是将内存地址转换为hash值,重写过后才会是自定义的计算方式equals(Object obj)默认的equals方法和==的功能是一样的,==比较的是两个对象的地址是否相同。为什么要重写呢?因为如果不重写equals方法,当将自定义对象放到map或者set中时;如果这时两个对象的ha
2021-10-18 19:21:12
193
原创 了解gorm
认识orm语法可以代替SQL语句简化开发映射关系优缺点安装go get -u github.com/jinzhu/gorm连接MySQLgorm已经为我们包装了一些驱动程序,只需按下面方式导入即可。在本地MySQL创建一个数据库编写代码package mainimport ( "goLearn/src/github.com/jinzhu/gorm" _ "goLearn/src/github.com/jinzhu/gorm/dialects/mysql"
2021-07-09 10:49:19
242
原创 力扣-搜索旋转排序数组
public int search(int[] nums, int target) { if (nums.length == 0) { return -1; } if (nums.length == 1) { return target == nums[0]?0:-1; } int i = 0; int j = nums.length-1; wh..
2021-06-24 10:41:30
119
原创 力扣-括号生成
//括号生成 //回溯法 public List<String> generateParenthesis(int n) { List<String> result = new ArrayList<>(); if (n == 0) { return result; } backResult(result,new StringBuffer(),0,0,n); ..
2021-06-24 10:31:35
248
原创 力扣-电话号码的字母组合
//回溯法 public List<String> letterCombinations(String digits) { List<String> result = new ArrayList<>(); if (digits.length() == 0) { return result; } Map<Character,String> map = new Has.
2021-06-18 10:48:16
146
原创 力扣-三数之和
public static List<List<Integer>> threeSum2(int[] nums) { List<List<Integer>> result = new LinkedList<>(); if (nums == null||nums.length<3) { return result; } Arrays.sort(nums);..
2021-06-18 10:37:58
129
原创 力扣-盛最多水的容器
public int maxArea(int[] height) { //采用双指针,从最两边开始 int l = 0; int r = height.length-1; int max = 0; while (l<r) { //记录当前的一个容量然后用max记录当前最大值 int area = Math.min(height[l],height[r])*(r-l);...
2021-06-18 10:30:53
123
原创 力扣-最长回文子串
public boolean isPali(String s) { int i = 0; int j = s.length()-1; while (i<j) { if (s.charAt(i) != s.charAt(j)) { return false; } i++; j--; } ret..
2021-06-15 20:11:01
155
原创 力扣-无重复字符的最长子串
public int lengthOfLongestSubstring(String s) { if (s.length() == 0) { return 0; } Map<Character,Integer> map = new HashMap<>(); int max = 0; int left = 0; for (int i = 0;i<s.leng..
2021-06-15 20:04:43
143
原创 力扣-两数之和
第一种暴力解法,双重循环遍历找到答案然后返回 public int[] twoSum(int[] nums, int target) { int[] arr = new int[2]; for (int i = 0;i<nums.length;i++) { for (int j = i+1;j<nums.length;j++) { if (nums[i]+nums[j] == target) { .
2021-06-15 19:57:38
118
原创 go语言之基础数据类型和复合数据类型
基础数据类型整型Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整数类型,分别对应8、16、32、64bit大小的有符号整数,与此对应的是uint8、uint16、uint32和uint64四种无符号整数类型。Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可以互换使用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个
2021-06-08 16:58:15
315
原创 go入门和环境搭建~
下载在官网下载对应版本https://golang.org/doc/install安装完可以通过命令查看go version配置环境变量创建家目录下的go文件夹: mkdir ~/go然后创建一个 .bash_profile文件touch .bash_profile然后打开它open .bash_profile把下面内容弄进去export GOPATH=/Users/用户名/goexport GOBIN=$GOPATH/binexport PATH=$PATH:$
2021-06-04 10:07:05
147
原创 MySQL为什么推荐自增主键ID为主键及MySQL的调优
页的概念在计算机里,无论是内存还是磁盘,操作系统都是按页的大小进行读取的(页大小通常为 4 kb),磁盘每次读取都会预读,会提前将连续的数据读入内存中,这样就避免了多次 IO,这就是计算机中有名的局部性原理,即我用到一块数据,很大可能这块数据附近的数据也会被用到,干脆一起加载,省得多次 IO 拖慢速度, 这个连续数据有多大呢,必须是操作系统页大小的整数倍。所以MySQL 的页,默认值为 16 KB,也就是说对于 B+ 树的节点,最好设置成页的大小(16 KB),这样一个 B+ 树上的节点就只会有一次 I
2021-04-05 15:12:26
1951
2
原创 Java中的IO
概述Java 的 I/O 大概可以分成以下几类:磁盘操作:File字节操作:InputStream 和 OutputStream字符操作:Reader 和 Writer对象操作:Serializable网络操作:Socket新的输入/输出:NIO磁盘操作File 类可以用于表示文件和目录的信息,但是它不表示文件的内容。递归地列出一个目录下所有文件:public static void listAllFiles(File dir) { if (dir == null || !
2021-04-03 17:25:25
143
原创 Java并发扩充
实现接口 VS 继承 Thread实现接口会更好一些,因为:Java 不支持多重继承,因此继承了 Thread 类就无法继承其它类,但是可以实现多个接口;类可能只要求可执行就行,继承整个 Thread 类开销过大。Java 提供了两种锁机制来控制多个线程对共享资源的互斥访问,第一个是 JVM 实现的 synchronized,而另一个是 JDK 实现的 ReentrantLock。Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一..
2021-04-03 13:30:26
120
原创 Java基础扩充~
JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。new Integer(123) 每次都会新建一个对象;Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承)在 Java 8 中,String .
2021-04-02 12:18:54
120
原创 常见HTTP状态码
1XX 信息100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。2XX 成功200 OK204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。3XX 重定向301 Moved Permanently
2021-03-31 18:10:04
130
原创 操作系统常见调度算法一举拿下~
大纲进程调度算法(CPU调度算法)先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法页面置换算法最佳页面置换算法先进先出置换算法最近最久未使用的置换算法时钟页面置换算法最不常用置换算法磁盘调度算法先来先服务算法最短寻道时间优先算法扫描算法(电梯调度算法)循环扫描算法LOOK与C-LOOK算法进程调度算法(CPU调度算法)先来先服务调度算法每次从就绪队列选择最先进入队列的进程,然后一直运行,直到
2021-03-31 14:48:33
221
原创 进程间的通信方式
方式管道消息队列共享内存信号量信号socket每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。管道匿名管道$ ps auxf | grep mysql上面命令行里的「|」竖线就是一个管道,它的功能是将前一个命令(ps auxf)的输出,作为后一个命令(grep mysql)的输入,从这功能描述,可以看出管道传输数据是单向的,如果想相互通信,我们需要创建两个管道才行。命名管道管道还有另外一
2021-03-30 15:07:25
187
原创 TCP三次握手,四次挥手补充
概述TCP连接:用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。建立一个 TCP 连接是需要客户端与服务器端达成三个信息的共识。Socket:由 IP 地址和端口号组成序列号:用来解决乱序问题等窗口大小:用来做流量控制如何唯一确定一个 TCP 连接呢?四元组:源地址源端口目的地址目的端口TCP和UDP区别TCP面向连接。UDP不需要连接TCP是一对一两点服务,UDP支持一对一,一对多,
2021-03-30 13:33:57
175
2
原创 CMS和G1垃圾收集器
CMSCMS(Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集器。 目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上, 这类应用通常都会较为关注服务的响应速度, 希望系统停顿时间尽可能短, 以给用户带来良好的交互体验。 CMS收集器就非常符合这类应用的需求。从名字(包含“Mark Sweep”) 上就可以看出CMS收集器是基于标记-清除算法实现的, 它的运作过程相对于前面几种收集器来说要更复杂一些, 整个过程分为四个步骤, 包括:
2021-03-28 12:29:56
161
1
原创 Java中的反射及常见API
概述每个类都有一个 Class 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。主要用途反射最重要的用途就是开发各种通用框架。很多框架(比如
2021-03-27 18:08:42
1145
1
原创 Java中泛型常见面试题
Java中的泛型是什么 ? 使用泛型的好处是什么?在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。Java的泛型是如何工作的 ? 什么是类型擦除 ?泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。什么是泛型中的限定通配符和非限定通配符 ?限定通配符对类型进行了限制。有两种限定通配符,一种是.
2021-03-27 17:10:16
191
原创 cookie和session的区别
概述cookie机制采用的是在客户端保持状态的方案。而session机制采用的是一种在服务器端保持状态的解决方案。cookie是在服务器返回的HTTP响应的中的set-cookie字段中的,这时候浏览器会解析这个响应并把cookie存在一个本地文件。而session是在服务端,服务器使用一种类似散列表的结构来存储,当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过
2021-03-26 15:52:14
122
原创 线程池再理解
线程池参数corePoolSize:线程池的核心线程数量maximumPoolSize:线程池的最大线程数keepAliveTime:当线程数大于核心线程数时,多余的空闲线程存活的最长时间unit:时间单位workQueue:任务队列,用来储存等待执行任务的队列threadFactory:线程工厂,用来创建线程,一般默认即可-handler:拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务线程池工作原理在创建完线程池之后,默认情况下,线程池中并没有任何线程,等到
2021-03-26 12:58:07
122
原创 MySQL的MVCC和幻读解决策略
MVCCInnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的删除时间,并不是实际的时间,而是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号作比较,MVCC只在可重读读和提交读两种隔离级别下工作。可重复读下的MVCC的操作方法SELECTInnoDB会根据以下两个条件检查每行记录:1.InnoDB只查询版本早于当前事务版本的数据行(也就是,行的系统版本
2021-03-26 12:37:25
154
原创 数据库的事务隔离级别怎么实现的?
事务隔离级别针对四个锁带来的问题:脏读,不可重复读,丢失更新,幻读1.未提交读:四个问题都没有解决。他在读取数据时不会加锁,但是在更新数据时会对其加行级共享锁,事务结束后释放。例: 事务A读取某行记录时,事务B也能对这行记录读取更新,当事务B更新记录时,事务A读取到事务B修改的版本,即使事务B未提交。2.已提交读:解决了脏读问题。解决方法:给写数据加行级排它锁,事务结束释放,给读数据加行级共享锁,读完便会释放。例: 事务A负责读,事务B负责写,A读完数据后释放共享锁,B更新数据,事务还未结束,A再
2021-03-24 13:28:44
230
原创 ArrayList和LinkedList详解
ArrayListArrayList底层是用数组实现的存储。特点:查询效率高,增删效率低,线程不安全。使用频率很高。通过无参构造方法的方式ArrayList()初始化,则赋值底层数Object[] elementData为一个默认空数组Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}所以数组容量为0,只有真正对数据进行添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。扩容1.第一步他会重新定义一个
2021-03-23 19:45:30
380
原创 HashMap超详细介绍
概述HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。哈希冲突当遇到哈希冲突,可以使用链地址法:每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。哈希冲突时节点如何插入链表java8之前是头插法,就是说新来的值会取代原
2021-03-23 17:50:31
602
原创 Redis内存淘汰策略
Redis内存我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。通过在Redis安装目录下面的redis.conf配置文件中进行设置。如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存Redis内存淘汰当Redis内存用完的时候,再对其中添加数据不就没有内存了嘛?Redis提供了几种策略来处理这种情况:noeviction
2021-03-22 18:55:39
101
原创 Redis知识扩充
RDB持久化根据执行持久化的对象不同又分为SAVA和BGSAVA两种方式SAVA即让Redis服务进程来执行持久化,所以直到RDB持久化结束之前,Redis服务进程会一直处于阻塞状态,无法处理任何命令。BGSAVE则会通过fork()来创建一个子进程,然后让子进程来接管RDB持久化,而父进程继续处理命令请求为了保证文件的安全以及容量更小,RDB持续化所生成的RDB文件是一个经过压缩的二进制文件,通过这个文件就可以还原数据库的状态。由于命令太多时,时间消耗会更大,AOF引入了重写的机制,即..
2021-03-22 18:21:44
110
原创 Redis分布式事务和事务锁
分布式事务之前我们的一系列操作都是在一个应用的一个数据库中完成的,保证了事务ACID特性,在分布式中就会涉及跨应用,跨库的操作,就涉及到分布式事务。分布式事务锁原理分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性。核心思想在被保护的redis节点加一把锁, 让这把锁和被保护的redis节点建立直接映射在访问这个redis之前都去看看这把锁在不在如果不存在锁,说
2021-03-22 18:18:41
447
原创 Redis的集群
概述集群是Redis在3.0版本正式推出的分布式解决方案,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以得到有效解决,并且集群模式有效解决了哨兵模式中哨兵的消耗和哨兵工作的低效率性。集群服务是Redis多机运行的最完美的终极方案, 其完全抛弃了主从同步和哨兵模式, 真正实现了多主多从。分布式存储分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。假设有10万个用户在该网站登录, 如果要存储
2021-03-22 17:35:13
224
原创 Redis保证了ACID原则
原子性Redis中的事务,如果出现命令错误比如指令不存在,那么整个事务中的命令都不会被执行,但如果是语法性错误,那么除了错误指令抛出异常,其他指令正常执行。此外,Redis单条指令也是保证原子性的,比如添加多个元素,其中一个出现错误,那么都不会添加成功。一致性入队错误: 如果一个事务在入队命令的过程中,出现了命令不存在,或者命令的格式不正确等情况,那么Redis将拒绝执行这个事务执行错误: 即使在事务的执行过程中发生了错误,服务器也不会中断事务的执行,它会继续执行事务中余下的其他命令,并且已执行
2021-03-21 15:22:26
248
原创 Redis中的跳跃表详解
简介跳跃表(skiplist)是一种随机化的数据结构,是一种可以与平衡树媲美的层次化链表结构——查找、删除、添加等操作都可以在对数期望时间下完成。Redis 的五种基本结构中,有一个叫做 有序列表 zset 的数据结构,它类似于 Java 中的 SortedSet 和 HashMap 的结合体,一方面它是一个 set 保证了内部 value 的唯一性,另一方面又可以给每个 value 赋予一个排序的权重值 score,来达到 排序 的目的。它的内部实现就依赖了一种叫做 「跳跃列表」 的数据结构。本
2021-03-21 14:50:35
498
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人