- 博客(44)
- 收藏
- 关注
原创 java中String和StringBuilder的replace方法
String类主要有三种:(1) replace(char oldChar, char newChar):将所有与oldChar相同的字符替换为newChar,返回新的字符串,原字符串不改变。(2) replaceAll(String regex, String replacement) :将所有与regex相同的字符串替换为replacement,返回新的字符串,原字符串不改变。(3) replaceFirst(String regex, String replacement):将第一个与re..
2020-05-26 09:47:58
10400
原创 OSI参考模型
应用层所有能产生网络流量的程序。表示层在传输之前是否进行加密 或 压缩 处理,二进制或ASCII码表示,网页乱码就是表示层的问题。会话层可用命令netstat -n查看已经建立的会话。查木马,看需求端和网站之间的连接传输层可靠传输,流量控制,不可靠传输(一个数据包即可,不需要建立会话,例如向DNS查询网站IP地址)网络层负责选择最佳路径,规划IP地址(ipv4和ipv6变化只会影响网络层)数据链路层帧的开始和结束,还有透明传输,差错校验(纠错由传输层解决)..
2020-05-22 17:17:43
152
原创 局域网、广域网、Internet
局域网:覆盖范围小、固定带宽(10M,100M,100M)、自己维护,距离不超过100米。广域网:距离较远、超过100米、花钱买带宽。Internet:由ISP组成,对网民提供internet连接。注:局域网和广域网的定义不只是看距离,也许要看走的链路,走局域网链路则为局域网,走广域网链路则为广域网。两个距离相近的电脑进行通信走的可能是广域网链路,这时候不能说两台电脑在同一个局域网环境下。...
2020-05-22 16:12:44
919
原创 事务并发带来的问题
脏读事务A对某个数据进行修改,但是还没提交到数据库中;此时事务B对这个数据进行访问,我们把B事务访问到的这个未提交的数据称为“脏数据”。事务B的这种行为称为“脏读”。丢失修改事务A和事务B同时对某一个数据进行访问,且此时A修改了数据如a=a-1,B同时也对a进行修改,a=a+1,此时A的修改结果将会被丢失。这种情况称为“丢失修改”。不可重复读事务A执行期间对某一个数据进行多次读取,另一个事务B对此数据进行了修改,导致事务A多次读取的结果不一致。这种情况称为不了重复读。幻读事务A..
2020-05-22 10:03:58
216
原创 事务的隔离级别
有以下4种:读取未提交(read-uncommitted)允许事务读取其他事务未提交的数据,可能会发生脏读、不可重复读和幻读。读取已提交(read-committed)允许事务读取已经提交的数据,可以避免脏读,但不可避免不可重复读和幻读可重复读(repeatable-read)某一个事务对同一字段的多次读取结果都是一样的,除非数据被事物本身所修改。可避免脏读、不可重复读,但有可能出现幻读。可串行化(serializable)多个事物之间串行执行,不会产生干扰,可以避免脏读、幻读以及不可重复
2020-05-22 09:47:16
89
原创 覆盖索引
定义:一个索引包含我们需要查询的所有字段,则称此索引为覆盖索引。使用覆盖索引的好处:在innodb搜索引擎中,非主键索引叶子节点中存储的是主键和索引列对应的值,若我们查询的列不在索引列中,则需要利用主键通过主键索引再查一次表;如果是覆盖索引,则不用进行第二次查表。...
2020-05-21 16:08:19
137
原创 sql语句执行很慢的原因
分两种情况讨论:偶尔慢原因有二:(1)数据库在刷新脏页。(2)执行的时候遇到锁需要等待。一直都很慢原因有二:(1)没有使用索引;索引失效。(2)数据库选错索引。
2020-05-21 15:25:35
156
原创 shiro中自定义Realm里的两个复写方法doGetAuthenticationInfo与doGetAuthorizationInfo执行时机
doGetAuthenticationInfo(认证)执行以下语句的时候: Subject subject = SecurityUtils.getSubject(); subject.login(token);doGetAuthorizationInfo(授权)需要判断是否有访问某个资源的权限的时候:subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):自己去调用这个是否有什么角色或者是否有什么权限的时候;@Requir.
2020-05-20 17:39:05
1127
原创 TCP三次握手和四次挥手
三次握手:如下图所示:刚开始时,服务器处于监听状态。第一次握手:首先客户端向服务端发起请求,报文收不同部位SYN=1,并且选择初始序列号,seq=x,此时客户端进入SYN-SENT状态。需要消耗yige第二次握手:服务器接到客户端连接请求后,若同意连接,则发送确认报文。ACK=1,SYN=1且确认号acq=x+1,并且给定一个初始序号,服务器进入SYN-RCVD状态。第三次握手:客户端发送确认报文,ACK=1,seq=x+1,ack=y+1,客户端进入ESTABLISHED状态。服务器收到确认报
2020-05-12 22:14:39
86
原创 匿名内部类
匿名内部类的定义语法格式:实现接口:new 实现接口(){ //匿名内部类类体部分}继承类:new 父类构造器(实参列表){ //匿名内部类类体部分}对于实现接口,由于接口是没有构造函数的,注意这里一定是空参数。第二种是调用父类的构造器,注意此处可以是空参数,也可以传入参数。...
2020-05-11 22:11:55
149
1
原创 IO模型
linux中总共有5种IO模型,分别是阻塞IO模型、非阻塞IO模型、信号驱动IO模型、IO复用模型、异步IO模型。阻塞IO模型最简单的IO模型,线程或进程一直等待某个条件,条件满足才进行下一步操作,否则一直等待。非阻塞IO模型应用进程与内核进行交互,没有获取到数据也直接返回,然后通过轮训的方式询问内核是否已经准备好数据。如果某一次轮训发现数据已经准备好,则将数据拷贝到用户空间中。信号驱动IO模型应用进程预先向内核注册一个信号处理函数,然后进程返回,当数据准备好时内核会向进程发送一个信
2020-05-11 21:29:42
143
1
原创 类加载过程
类加载过程总过分为三步:加载、连接、初始化,连接又分为三个过程:验证、准备、解析,如下图所示:图片来源:https://www.jianshu.com/p/dd39654231e0加载将class文件加载到内存中,将类信息、静态变量、常量、静态代码块等转换成方法区中的运行时数据(jdk1.7后常量池放在堆中,类信息等放在替代方法区的元空间中),在堆中生成一个代表这个类的Class对象作为方法区数据的访问入口。验证确保加载的类信息符合jvm的规范,没有安全问题存在。准备为类变量在方
2020-05-10 17:52:50
104
原创 类加载器
jvm有三个重要的内置加载器,分别是:BootstrapClassLoader、ExtensionClassLoader、AppClassLoader,除BootstrapClassLoader外均由java实现且继承java.lang.Classloader类:BootstrapClassLoader:启动类加载器,最顶层的类加载器,由c++实现,负责加载%JAVA_HOME%/lib目录下的jar包和类以及-Xbootclasspath参数指定路径下的所有类。ExtensionClassLoade
2020-05-10 17:17:12
125
原创 垃圾回收算法
标记-清除两个阶段,首先对可回收对象进行标记,然后再清除。是最基础的垃圾回收算法,有两个问题:1、效率问题;2.标记清除后会产生大量不连续碎片。复制算法将内存平分为两块,对象只存放在其中一块,当一块内存使用完后,将还存活的对象移动到另外一块内存中,使用的那一块内容全部清理。这种算法适用于每次收集都有大量对象死去的情况,比如说新生代。标记-整理首先将要被回收的对象标记,然后将存活下来的对象移到一端,然后清理段边界以外的对象。分代回收算法当前虚拟机采用的均是这种分类算法,将内..
2020-05-10 11:32:28
168
原创 判断一个类是无用的类
方法区中主要回收无用的类。同时满足一下3个条件,才能说一个类是无用的类。java堆中已没有该类的实例。该类的类加载器已经被回收。该类对应的java.lang.Class对象没有在任何地方被引用,无法通过反射访问该类的任何方法。满足以上3个条件便可以对无用类进行回收,但并非一定会回收。...
2020-05-10 10:53:04
152
原创 jvm判断对象是否死亡
方法有两种:引用计数法和可达性分析算法引用计数法 在对象中添加一个引用计数器,每有一个地方引用它,引用计时器就加一。当引用计数器为0,即没有引用指向该对象的时候,就表示对象死亡。目前主流的虚拟机均没有采用这个算法来管理内存,因为它不能解决对象循环引用的问题,比如说:对象A和B相互引用着对方,但是再没有其它引用指向它们。所以它们的引用计数器值一直为1。垃圾回收器就无法回收它们。可达性分析算法 算法的思
2020-05-10 10:47:03
105
原创 java中引用类型
java中引用类型分为4种,分别为强引用、软引用、弱引用、虚引用。强引用具有强引用的对象类似于“必不可少的生活用品”,当一个对象具有强引用时,垃圾回收器绝对不会回收它,即使内存空间不足,也宁愿抛出内存溢出的异常来终止程序,而不会通过回收强引用对象解决内存不足问题。我们使用的大部分引用是强引用。软引用只具有强引用的对象类似于“可有可无的生活用品”。如果内存空间足够,垃圾回收器就不会回收它。内存不足时,就会进行回收。没有被回收的弱引用对象可以被程序使用。软引用可以用来实现内存敏感的高速缓存。
2020-05-10 10:06:17
105
原创 jvm内存分配与回收
概述: Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。java堆是垃圾收集器管理的主要区域,现在垃圾收集器大多采用分代垃圾回收算法。所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。  
2020-05-10 01:35:51
103
原创 java对象的访问方式
Java对象的访问方式有两种:句柄和直接指针。句柄:java堆中会分出一块区域来作为句柄池。栈中的reference指向堆3中的句柄,句柄中存储的是指向堆中示例数据的地址以及指向方法区中对象实例类型的地址。直接指针:reference直接指向堆中对象,Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改
2020-05-09 23:56:16
435
1
原创 java对象的创建
java对象的创建总共分五步进行,如下图:以下全部图片来源:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F.md类加载检查当虚拟机遇到一条new指令时,首先去常量池中检查是否有这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析以及初始化过。否则先必须执行类加载过程。内存分配内存分配有两种方式:指针碰撞和空闲列表
2020-05-09 23:19:40
110
原创 java运行时数据区
概述: jdk1.8之前,java运行时数据区总共分为5个区域,分别是堆、方法区、虚拟机栈、本地方法栈、程序计数器;1.8之后去掉了方法区,取代方法区的是元空间,但元空间不属于运行时数据区,直接内存区域中的一块区域。其中堆和方法区是线程共享的;虚拟机栈、本地方法栈、程序计数器是线程私有的。图片来源:https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/j
2020-05-09 18:39:40
137
原创 jdk1.6之后对synchronized的底层优化
jdk1.6之后对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、自适应自旋锁、锁清除,锁粗化。偏向锁。偏向锁会“偏向”第一个获取到它的线程。在接下来的执行中,如果该锁没有被其他线程获取,则该拥有该锁的线程会直接不进行同步操作。但对于资源竞争比较激烈的场景,偏向锁就会失效,偏向锁失效后会升级为轻量级锁。轻量级锁。 轻量级锁的本意是,在没有多线程竞争的情况下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗,轻量级锁不足要申请互斥量,同步操作使用的是CAS。但是,在多线程竞争激烈的情况下,轻量级
2020-05-09 10:01:41
312
原创 ThreadPoolExecutor 饱和策略
对于ThreadPoolExecutor 饱和策略的解释可以参考以下文章:https://blog.csdn.net/w605283073/article/details/89930154
2020-05-08 21:54:26
382
原创 ConcurrentHashMap和HashTable的区别
底层数据结构上的不同:jdk1.7之前ConcurrentHashMap采用的是分段数组+链表的数据结构,jdk1.8采用的数据结构跟jdk1.8的HashMap数据结构一样,都是数组+链表/红黑二叉树的。HashTable和jdk1.8之前的HashMap的数据结构一样,都是数组+链表的数据结构。实现线程安全方式的不同:jdk1.8之前ConcurrentHashMap采用分段锁的形式实现线...
2020-05-08 12:38:24
469
原创 volatile关键字的作用
两个作用:在当前的java内存模型下,线程可以把变量保存在本地内存中,比如说机器的寄存器,而不单单是在主内存中进行读写,所以有可能出现这样的情况:一个线程在主存中更改了一个变量的值,另外一个线程在本地内存中读取了这个变量值的旧值,这就造成的数据的不一致。而将变量声明为volatile则是告诉jvm这个变量是不稳定的没每次都要从主存中读取。可以防止指令的重排。看个例子:多线程下单例模式的线...
2020-05-07 11:10:35
79
原创 静态内部类与非静态内部类的区别
静态内部类与非静态内部类的一个最大区别就是非静态内部类会默认创建一个指向外围类的引用,而静态内部类则不会,这就意味着:静态内部类不能访问其所在外部类的非静态成员变量和成员方法;它的创建不依赖外围类的创建。https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/final,static,this,super.m...
2020-05-05 19:41:38
128
原创 Comparable 和 Comparator接口
两者都是用于比较数据的大小,实现Comparable 需要重写compareTo()方法;实现Comparator需要重写compare()方法。Compareble接口使用示例:如下代码所示,使用Compareble实现数据的比较需要在类中实现compareTo()方法。Java的很多类已经实现了Comparable接口,比如说String,Integer等类。class Test { ...
2020-05-05 19:35:14
267
原创 list遍历方式选择
实现了 RandomAccess 接口的list,优先选择普通 for 循环 ,其次 foreach。未实现 RandomAccess接口的list,优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万不要使用普通for循环。说明:RandomAccess只是一个标识接口,里面没有具体需要实现的方法;实现RandomAcces...
2020-05-05 09:48:44
203
原创 Java 中只有值传递
对于基本类型来说,传递的是内容的拷贝,方法中对方法参数的改变不会影响到方法调用时传递的参数变量。对于引用类型来说,实际上也是值传递的方式,但传递的是对象的地址。...
2020-05-03 13:18:37
51
原创 java中为什么重写 equals 时必须重写 hashCode 方法
两个原因:为了提高效率,两个对象的比较首先比较hashCode是否相等,若不相等则对象不相等;若相等则继续调用equals方法比较。这样不必每次比较都要调用equals方法,提高效率。为了保证使用equals方法比较相等的情况下hashCode也相等,不会出现equals相等,而hashCode不相等的情况。...
2020-05-03 13:00:13
95
原创 java接口和抽象类的区别
接口的方法默认是public,jdk1.8开始接口的方法 可以有默认实现。抽象类可以有非抽象的方法。接口中成员变量必须是public static final修饰;而抽象类中则不一定。原因:接口是规范,所以应该是public公用的;而接口可以多继承,使用statis是为了保证接口不会声明相同的变量,但是继承接口的类不知道使用哪个接口的变量;final是保证接口中变量不可修改,因为接口是...
2020-05-03 12:04:12
69
原创 java中Object类的所有方法
getClass()获取对象的运行时类型toString()返回一个String对象,用来标识对象本身,一般需要重写clone()浅拷贝,复制出来的引用类型变量和被复制对象的变量指向同一个对象,即复制的是对象的地址。finalize()垃圾回首之前会执行finalize()方法wait()notify()notifyAll()equals()hashCode()...
2020-05-03 10:04:37
377
原创 原码、反码和补码互相转换
负数原码与反码互相转换:符号位不变,其余位置取反;负数原码与补码相互转换:符号位不变,其余位置取反加1;负数反码与补码相互转换:反码转补码:符号位不变,其余位置+1;补码转反码:符号位不变,其余位置-1;机器中数字以补码的形式存储,补码比原码和反码能多表示一位,比如32位int的值域为[-2147483648,2147483647]。机器中求相反数的方式为:补码包括符号位在内按位取...
2020-04-30 14:37:38
334
原创 马戏团人塔
题目描述:有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。示例:输入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110]输出:6解释:从上往下数,叠罗汉最多能叠 6 层:(56...
2020-04-19 23:23:02
441
原创 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-increasing-subsequence==================...
2020-04-19 18:27:36
95
原创 java中获取数组最大(最小)值的三种方式
三种方式先排序,后取最大最小值Collections.min()和Collections.max()方法Arrays.stream(arr).min().getAsInt()和Arrays.stream(arr).max().getAsInt()代码如下: int[] arr = { 8, 2, 7, 1, 4, 9, 5}; int len = arr...
2020-04-19 16:00:13
9358
原创 跳跃游戏
题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样...
2020-04-19 11:41:52
249
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人