java
文章平均质量分 78
斜阳雨陌
你有多努力,就有多特殊!
展开
-
后端进阶技术总结
一、基础技术知识(1)SDK与API的区别?SDK是Software Development Kit的缩写,即软件开发工具包。可以把SDK想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,通过接口联通外界,相应的接口就是API。JDK(Java Development Kit),即Java开发工具包,是针对Java开发者的产品,JDK是SDK的一个子集,JDK已经成为使用最广泛的JAVA SDK 。JDK是整个Java的核心,包括Java运行环境JRE、一堆Java原创 2022-05-25 16:22:53 · 850 阅读 · 2 评论 -
Java Agent
一、什么是 Java Agent ?笼统地来讲,Java Agent 是一个统称,该功能是 Java 虚拟机提供的一整套后门。通过这套后门可以对虚拟机方方面面进行监控与分析。甚至干预虚拟机的运行。Java Agent 又叫做 Java 探针,Java Agent 是在 JDK1.5 引入的,是一种可以动态修改 Java 字节码的技术。Java 类编译之后形成字节码被 JVM 执行,在 JVM 在执行这些字节码之前获取这些字节码信息,并且通过字节码转换器对这些字节码进行修改,来完成一些额外的功能,这种就是转载 2021-07-11 16:52:50 · 900 阅读 · 0 评论 -
java后端必会【基础知识点】
(一)Redis原创 2020-11-18 22:04:37 · 9040 阅读 · 2 评论 -
【精心总结】java内存模型和多线程必会知识
内存模型(1)java内存模型到底是个啥子东西?java内存模型是java虚拟机规范定义的一种特定模型,用以屏蔽不同硬件和操作系统内存访问差异,让java在不同平台中能达到一致的内存访问效果,是在特定的协议下对特定的内存或高速缓存进行读写访问的抽象。我来简单的总结成一句话就是:java内存模型是java定义的对计算机内存资源(包含寄存器、高速缓存、主存等)的读写方法和规则。 注意上面的这些定义...原创 2020-04-19 23:50:46 · 627 阅读 · 0 评论 -
Minor GC和Full GC
我们在日常开发中可能经常会听大家谈论GC,但是其实很多人对GC的种类其实并不是很了解,接下来我们简单介绍下Minor GC和Full GC及他们的区别。MinorGC:也可以叫作新生代GC,指的是发生在新生代的垃圾收集动作。因为新生代中对象大部分的生命周期都很短,都是朝生暮死,所以MinorGC十分频繁,但因为需要移动的对象比较少及采用了“复制”回收算法,所以回收速度非常快。FullGC:...原创 2020-04-12 16:28:19 · 760 阅读 · 0 评论 -
同步/异步&阻塞/非阻塞
平时开发中经常会听大家说到什么同步阻塞、异步非阻塞等等名词,这里我谈下自己对这两个名词的理解,仅仅是个人观点,并不一定正确。1.阻塞/非阻塞我认为判定阻塞还是非阻塞,取决于线程所做的操作是否需要将线程挂起等待。举个例子,我们都知道CAS是非阻塞的,而synchronized是阻塞的。为什么呢,因为CAS能快速返回一个获取锁成功或失败结果,线程可以在获取锁失败时再去做其他事情,而synchro...原创 2020-04-07 00:04:59 · 536 阅读 · 0 评论 -
从源码看ConcurrentHashMap
简介ConcurrentHashMap是线程安全且高效的HashMap实现。这里主要研究JDK8后的ConcurrentHashMap。下面是ConcurrentHashMap的简单结构:ConcurrentHashMap基于HashMap的基本逻辑,通过CAS + synchronized 来保证并发安全性。ConcurrentHashMap使用的数组及数组的每个节点都为volatile类型...原创 2020-03-28 21:50:46 · 400 阅读 · 0 评论 -
一起唠唠分布式锁
(1)分布式锁和分布式事务的区别1.分布式锁是在集群环境下,用来控制不同机器对全局共享资源的访问。2.分布式事务是在集群环境下,用来保证全局事务的一致性,保证多个数据库的数据整体上能正确的从一个一致性状态转到另一个一致性状态。(2)分布式锁应用场景在我们的某个jvm应用程序中,如果需要对某个共享变量进行多线程同步访问,可以使用java多线程的同步工具,例如ReentrantLock、Syn...原创 2020-03-26 23:18:57 · 1028 阅读 · 0 评论 -
java类加载顺序
在java中类的加载、连初始化都是在程序运行期完成的,虽然会稍微增加开销,但是却很大的增加了灵活性,我们可用在运行期间动态的去网络获取其他地方加载一个二进制流来作为程序代码的一部分。接下来我们简单介绍下java类的加载顺序。从上图中我们可以看到类的生命周期主要有7个过程,分别为加载、验证、准备、解析、初始化、使用、卸载。加载:这个过程很简单,就是通过ClassLoader去加载Class文...原创 2020-03-01 18:35:22 · 554 阅读 · 2 评论 -
java设计把两个字符串的值交换 而不使用中间变量
public class Test { public static void main(String[] args) { String s1 = "aaa"; String s2 = "cccx"; s1 = s1 + s2; s2 = s1.substring(0, s原创 2017-08-25 13:15:09 · 2717 阅读 · 0 评论 -
Spring事务那些事儿
(一)事务的隔离级别大家都知道事务有四个属性,即ACID(原子性、一致性、隔离性、持久性)。这四个里面稍微难理解点的是一致性和持久性。所谓的一致性是指:事务执行前后数据的一致性状态,例如事务执行前用户有1万元,事务回滚后用户仍应该有1万元。而这里的持久性指的是:事务在提交后结果是永久的,即使程序崩溃数据也能恢复,当然数据库的持久性指的是高可靠性,事务执行后数据保证一定写到了磁盘及备份日志,但并...原创 2020-02-19 23:07:14 · 406 阅读 · 0 评论 -
深入了解Spring IoC
IoC全称Inversion of Control即控制反转,它还有一个别名依赖注入。spring利用Ioc容器帮我们自动构建对象及注入依赖对象,减少了对象构建与业务代码的耦合,使得我们能够更加高效愉快的写bug????了( ̄▽ ̄)"。接下来我们详细介绍下这个spring Ioc吧。依赖注入原理1.三种依赖注入方式spring中有三种常见的依赖注入方式即:构造方法注入、setter方法注入、接口注...原创 2020-02-29 22:58:37 · 355 阅读 · 1 评论 -
from表单提交和JSON区别
form表单是“键值对”的数据格式,例如:a=1&b=2&c=3而json格式则与之不同,如下:{"a":1,"b":2,"c":3}传递的数据比较简单,那么两种方式基本上没什么大区别(当然后台接收数据的方式肯定是不同的),但是如果数据比较复杂,比如包含数组、对象等时,就只有json才能胜任了。此外,如果数据是通过表单提交的,那么当然使用默认的form即可,因为它会自动构建...转载 2018-05-22 11:33:51 · 24062 阅读 · 3 评论 -
使用fastjson进行json字符串和List的转换
使用fastjson进行自定义类的列表和字符串转换 1.环境 jdk1.8,fastjson 2.pom.xml[html] view plain copy<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:...转载 2018-03-15 10:30:07 · 24384 阅读 · 0 评论 -
如何使用log.debug()
log4j是一个开源的日志,共分为六个等级:LOG、DEBUG、INFO、WARN、ERROR、和FATAL。DEBUG是其中的一种日志级别。一般我们用这个方法的时候都是这样的:if(log.isDebugEnabled()){ log.debug("debug!"); } 意思是:如果log4j的配置中开启debug级别日志,那么我们就打印输出debug日志,其在输出日志中会...原创 2018-03-21 20:41:57 · 54436 阅读 · 7 评论 -
log 的 debug()、 error()、 info()方法的区别
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别: × Debug × Info × Warn × Error × Fatal 一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日...转载 2018-03-21 20:23:03 · 32118 阅读 · 3 评论 -
JPA @Id 和 @GeneratedValue 注解详解
@Id: @Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 @Id标注也可置于属性的getter方法之前。@GeneratedValue: @GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:Sql转载 2017-10-19 14:53:55 · 30983 阅读 · 0 评论 -
动态代理
动态代理是一种字节码生成技术,用来实现代理模式以对目标类或方法进行增强。这里的动态是相对我们自己手动编写的代理类而言的。动态代理依靠jvm或各种字节码类库在程序编译期或运行期间自动生成代理类。这些字节码类库中有些是我们比较常见和熟悉的,例如CGlib、Aspectj,以及jdk自带的。下面列出了这个类库的一些特性。类库织入时机操作对象优点缺点AspectJ编译期、加载...原创 2019-09-15 19:44:01 · 277 阅读 · 0 评论 -
Class.forName和ClassLoader
(1)ClassLoader使用来加载类数据的(加载的方式由具体的加载器决定)。类加载器根据类的全限定名加载类的二进制字节流,然后将字节流转换成jvm方法区中的运行时数据结构,并在方法区生成一个代表该类的Class对象作为访问入口(单例的)。(2)Class.forName方法会首先获取调用对象的类加载器,并利用该加载器根据类的全限定名加载类数据,并根据boolean initialize字段决...原创 2019-09-15 16:42:50 · 266 阅读 · 0 评论 -
依赖注入简介(二)
在上一篇中,我们已经介绍过了最基本的依赖注入,接下来我们来看如何对需要使用的类进行装配。通常应用程序的组件之间的关联是通过wiring,在Spring中同样有很多方式来装配。但是一个最通常我们使用的方法是利用XML。接下来我们来展示一个简单的Spring配置文件,knights.xml文件,它一起装配了BraveKnight,SlayDragonQuest和一个PrintStream。原创 2017-12-10 20:16:52 · 284 阅读 · 0 评论 -
依赖注入简介(一)
依赖注入(Injecting dependencies)经常听起来会让人感觉到很难以理解,会让大家感觉这是很复杂的编程技术,但是事实上并不是这样,依赖注入非常方便使用,它会让你的程序非常便于理解,同时也更容易进行测试。依赖注入的工作方式:任何好的程序都是由很多互相协作的类来实现复 杂的逻辑的。在传统的使用方法中,每个对象都会把自己的引用传递给它协作的对象,但是这样会造成对象间的高度原创 2017-12-09 19:50:32 · 829 阅读 · 0 评论 -
CAP原理简单理解
C:集群中所有机器状态是一致的。A:客户端访问集群中任意一个节点,总能得到"处理成功"的结果。假设有五个节点:n1~n5 ,出现网络分区被分成两组:[n1~n2]和[n3~n5],那么当n1出来客户端请求时(为了处理这种情况,也就是说"容忍网络分区",即支持 P):1:如果要保证C(一致性),那么它需要把消息复制到所有节点,但是网络分区导致无法成功复制到n3~n5,所以它只能返回"处理原创 2018-02-02 14:57:03 · 560 阅读 · 0 评论 -
java Exception
(1)异常类体系我们先来看下java异常类的体系结构:Java将java.lang.Throwable作为所有异常的超类。Throwable有两个重要的子类:Exception(异常)和 Error(错误)。Error:代表程序无法处理的异常,一般发生在严重故障时,通常都是jvm错误,例如OOM异常、线程死锁等。Exception:是程序可以处理的异常,应用程序可以通过try catch...原创 2020-02-05 17:54:16 · 338 阅读 · 0 评论 -
深入理解HashMap
1.HashMap的序列化HashMap中的数据主要存储在类型为Node<K,V>的table数组中。但是我们看下源码,却会发现table使用了transient修饰(即不参与序列化),那么问题来了:HashMap是如何实现序列化的呢?我们仔细翻下代码,可以看到HashMap自己实现了序列化/反序列化的函数writeObject和readObject。我们可以看到HashMap在...原创 2019-12-23 22:17:53 · 507 阅读 · 0 评论 -
红黑树和B+树
红黑树简介红黑树是一种自平衡二叉查找树,也被称为"对称二叉B树",它可以在O(logn)时间内利用 O(logn)的空间来完成查找、插入、删除操作。红黑树的读操作与普通二叉查找树相同,而插入和删除操作可能会破坏红黑树的规则,需要进行恢复操作。恢复红黑树的性质需要少量的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次),虽然插入和删除很复杂,但操作时间仍可以保持为O(logn)。...原创 2019-12-11 23:01:55 · 8651 阅读 · 3 评论 -
Thread.yield()和Thread.sleep(0)
关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述:重点在红框中,简而言之就是:sleep(0)和yield()的实现不需要任何可见的效果。那么在实现这两个函数的语义时就可以什么都不做,这取决于具体的JVM实现。后来再看java8的语言规范时发现红框内的提示被去掉了,官方给出了下面的解释:...原创 2019-12-07 22:26:18 · 5620 阅读 · 1 评论 -
java线程实现及线程池的使用
(一)Java线程实现线程把处理器的调度和资源分配分开,是cpu的最小调度单位。多个线程可以共享进程的内存资源,又可以独立调度。java线程关键方法都是通过高效的本地方法实现的。Java线程的主要实现方式有三种:内核实现、用户实现、内核用户混合实现。1.内核实现内核线程就是由内核调度、映射的线程。支持多线程的内核称为多线程内核。这种线程,所有操作都需要系统调度,需要在内核态和用户态切换,系统...原创 2019-12-01 23:14:24 · 417 阅读 · 0 评论 -
java transient关键字
transient是用在序列化中的,当我们序列化的过程中,如果我们不想序列化某个字段,那么我们就可以使用这个关键字。jvm就会在序列化的时候忽略这个字段的数值。transient主要有两个用途:1.保证数据的安全。在进行序列化时,可以将我们的私密数据隐藏起来,不对外暴露。2.减少无用数据的传输,提高数据传输效率。对于一些可以通过传输数据计算推导的冗余数据,我们可以使用该关键字,避免无用的网络...原创 2019-11-17 19:16:59 · 190 阅读 · 0 评论 -
JVM对象占用内存计算
大家都知道,jvm中对象实例存储在堆中,对象的引用存储在栈中,而对象的元数据(类型数据)存储在方法区。在我们进行内存优化的过程中经常需要了解每个对象占用的内存大小。接下来我将介绍对象占用内存大小的计算方式,首先从java对象模型说起。Java的对象模型java是面向对象的语言,每个对象都属于某个类。在HotSpot虚拟机中对象采用的是oop-klass模型。其实原理很简单:就是在方法区中生...原创 2019-11-05 22:31:34 · 1726 阅读 · 0 评论 -
占用较多堆外内存的区域
(1)Director Memory主要在nio中会使用,在内存不足时会抛出OOM或者OOM:Direct buffer memory。(2)线程堆栈为每个线程分配的栈空间,用于保存局部变量,执行程序代码。内存不足时可能抛出StackOverflowError或者OOM:unable to create new native thread(即没有足够空间建立新的线程)。(3)socket缓...原创 2019-10-19 16:41:35 · 456 阅读 · 0 评论 -
常用数据结构的一部分类
java学习时随手笔记 这篇主要几种不同类型的集合原创 2016-03-11 16:27:01 · 331 阅读 · 0 评论 -
CharSequence类
CharSequence是char类型的一个可读序列,它本身是一个接口,CharBuffer、String、StringBuffer、StringBuilder这个四个类实现了这个接口。此接口对于不同种类的char序列提供统一的只读访问以下是这个函数的API 它只定义了四个方法/** * This interface represents an ordered set of char原创 2016-03-16 20:46:02 · 1261 阅读 · 0 评论 -
String(byte[] bytes, int offset, int length)
public String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。参数: bytes:要解码为字符的 byte offset: 要解码的第一个 byte 的索引 length: 要解码的 byte 数 的长度原创 2016-04-06 09:55:01 · 10623 阅读 · 3 评论 -
Callable类
(一)Callable和Runnable比较相似,都可以用来实现线程任务。但callable使用了泛型设计,使用一个V类型值,能够在执行结束后返回一个V类型的值。而Runable只会返回一个void,不能够获得执行的结果。(二)使用Callable要和Future类或者Futuretask类搭配使用,他们类似一种对线程执行任务的返回数据的操作的封装类。使用方法1 Cal原创 2016-04-26 15:37:44 · 1278 阅读 · 0 评论 -
java中list()和listfile()
File f=new File("c:\\");String[] f1=f.list();File[] f2=f.listFiles();① list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 以C盘为例,返回的是c盘下文件夹名字的字符串数组,如[TEMP, Windows]②listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示原创 2017-03-14 11:07:22 · 891 阅读 · 0 评论 -
Java SE、Java EE、Java ME三者的区别
说得简单点Java SE 是做电脑上运行的软件。Java EE 是用来做网站的-(我们常见的JSP技术)Java ME 是做手机软件的。1. Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java原创 2017-04-03 10:51:45 · 220 阅读 · 0 评论 -
OOP
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。原创 2017-04-03 10:56:22 · 225 阅读 · 0 评论 -
public static void main(String[] args)的理解
public:权限修饰符,权限最大。static:随着MianDemo类的加载而加载,消失而消失。void: 没有返回值main: 函数名,jvm识别的特殊函数名(String[] args):定义了一个字符串数组参数。这个字符串数组是保存运行main函数时输入的参数的原创 2017-04-03 17:05:02 · 797 阅读 · 0 评论 -
throws Exception的意思
在方法声明部分使用,表示该方法可能产生此异常,如果在方法声明处使用了throws声明异常,则该方法产生异常也不必捕获,会直接把异常抛出到调用该方法的地方。原创 2017-04-03 17:59:26 · 12491 阅读 · 0 评论 -
Socket和ServerSocket
对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求。这会,Socket对于我们来说就非常实用了。下面是本次学习的笔记。主要分异常类型、交互原理、Socket、ServerSocket、多线程这几个方面阐述。 异常类型在了解Socket的内容之前,先要了解一下涉及到的一些异常类型。以下四种类型都是继承于IOException,所以很多之后直接弹出IO原创 2017-04-03 18:12:30 · 358 阅读 · 0 评论