
Java
maercecd
学习可以消除心中的不安。
展开
-
HotSpot中的OopMap、Safe Point和Safe Region
1.OopMap在正式的GC之前,要进行可达性分析来标记出将来可能要宣告死亡的对象。如果每次GC的时候都要遍历所有的引用,这样的工作量是非常大的。因为在可达性分析的时候要保证期间不发生引用关系的变化,所有执行线程要停顿等待,称为“Stop The World”,程序中的线程需要停止来配合可达性分析。所以,每次直接遍历整个引用链肯定是不现实的。 为了应对这种尴尬的问题,最早有保守式GC和后来的准确式GC。这里准确式GC就会提到一个OopMap,用来保存类型的映射表。保守式GC...原创 2020-05-22 19:01:19 · 460 阅读 · 0 评论 -
引用计数算法和可达性分析算法
引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。引用计数算法(ReferenceCounting)的实现简单,判定效率也很高,但是在Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。比如俩个对象objA和objB都有字段i...原创 2020-04-06 15:28:38 · 867 阅读 · 0 评论 -
指针碰撞和空闲列表
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。假设Java堆中内存是绝对规整的,...原创 2020-03-25 20:07:24 · 6066 阅读 · 5 评论 -
使用SHA1withRSA算法进行签名和验签
package com.hhh.nnn.test;import org.apache.commons.codec.binary.Base64;import java.nio.charset.StandardCharsets;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.s...原创 2020-02-21 10:35:32 · 3373 阅读 · 2 评论 -
时间格式 YYYY-MM-dd 的 bug
前一阵子,我们项目中遇到了一个 bug,时间格式的bug,2019-12-31那天显示成了2020-12-31,在网上一搜,也有其他人遇到了同样的 bug,这里就对这个问题记录一下。一直以来使用yyyy 和 YYYY 结果都一样,也就没有去研究它们之间的区别,但是这次遇到了这个 bug,所以就去研究了一下。那么产生这个 bug 的原因是什么呢?其实很简单,就是把 yyyy-MM-dd 写成了...原创 2020-01-17 21:04:56 · 737 阅读 · 0 评论 -
MD5 加密结果
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。MD5加密是无法解密的,网上有一些在线工具解密,但这个解密并不是真正的解密,只是通过穷举法,明文密文对应查询数据库来达到解密的目的。MD5 加密后的位数有两种:16 位与 32 位。16 位实际上是从 32 位字符串中取中间的第 9 位到第 24 位的部分,用 Java 语言来说,即:...原创 2020-01-08 22:20:42 · 2071 阅读 · 0 评论 -
FastJson和Jackson对null的处理
一、fastJson1、fastJson在转换java对象为json的时候,默认是不序列化null值对应的key的。也就是说当对象里面的属性为空的时候,在转换成json时,不序列化那些为null值的属性。public static void main(String[] args) { Student student = new Student(); student.setName...原创 2019-12-11 20:08:56 · 1210 阅读 · 2 评论 -
Twitter雪花算法的java实现
概述SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法,它可以满足Twitter每秒上万条消息ID分配的请求,这些消息ID是唯一的且有大致的递增顺序。原理SnowFlake算法产生的ID是一个64位的整型,结构如下(每一部分用“-”符号分隔):0 - 0000000000 0000000000 0000000000 0000000000 0...原创 2019-12-05 21:27:21 · 253 阅读 · 1 评论 -
@JsonInclude - jackSon注解
使用jackSon序列化时,默认情况下,如果字段status为null,则序列化结果就为:{...,"status": null,...}那如果有好几个字段都是null,那序列化的结果就会有很多这样的null,这样就不太好了,而使用@JsonInclude注解就可以解决这个问题。下面详细说明。普通Java类(pojo):@JsonInclude(JsonInclu...原创 2019-11-27 19:55:39 · 1246 阅读 · 0 评论 -
IDEA远程调试Tomcat
一、linux环境修改tomcat配置vi tomcat8/bin/catalina.sh # Example (all one line)# LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManage##...原创 2019-11-22 19:33:42 · 180 阅读 · 0 评论 -
@Scheduled注解-springMVC中的定时任务
在日常开发中,有时候需要用到定时任务,而spring提供了一个简单的方式让我们来实现定时任务,一个简单的注解@Scheduled即可实现。配置:要使用@Scheduled注解,我们需要在applicationContext.xml中配置如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www...原创 2019-11-06 19:37:37 · 604 阅读 · 0 评论 -
策略模式—设计模式
设计模式中的策略模式下面是某个市场人员接到单后的报价策略,报价策略很复杂,可以简单作如下分类:普通客户小批量,不打折普通客户大 批量,打9折老 客户小批量,打8.5折老 客户大批量,打8折我们通常可以适用条件语句进行处理,代码如下:public class Test { public double getPrice(String type ,double price )...原创 2019-10-24 22:43:49 · 100 阅读 · 0 评论 -
关于Integer和int
int和Integer的区别int是java的一种基本数据类型,Integer是int的包装类 Integer变量必须实例化后才能使用,而int变量不需要 Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 Integer的默认值是null,int的默认值是01、由于Integer变量实际上是对一个Intege...原创 2019-06-29 20:12:45 · 1411 阅读 · 0 评论 -
可重入锁
在JAVA中,内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。new Thread() { @Override public void run() { // 第一次获得锁 synchroniz...原创 2019-09-03 19:32:57 · 176 阅读 · 0 评论 -
logback日志配置
logback.xml配置简单输出到控制台:<?xml version="1.0" encoding="UTF-8"?><configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are ass...原创 2019-09-15 15:38:38 · 801 阅读 · 0 评论 -
mybatis中一级缓存和二级缓存
MyBatis的缓存分为两种:一级缓存,一级缓存是SqlSession级别的缓存,对于相同的查询,会从缓存中返回结果而不是查询数据库 二级缓存,二级缓存是Mapper级别的缓存,定义在Mapper文件的<cache>标签中并需要开启此缓存,多个Mapper文件可以共用一个缓存,依赖<cache-ref>标签配置mybatis的一级缓存: MyBatis会在表示会...原创 2019-09-18 22:52:12 · 233 阅读 · 0 评论 -
适配器模式—设计模式
设计模式中的适配器模式适配器模式,把一个类接口变化成客户端所期待的另一个类的接口,使原来因接口不匹配而无法一起工作的类能够一起工作。Java源码中的例子:如Java IO中的java.io.InputStreamReader(InputStream) 和java.io.OutputStreamWriter(OutputStream)就是典型的适配器模式,通过InputStreamReader、...原创 2019-10-11 19:39:03 · 169 阅读 · 0 评论 -
fastJson的@JSONField和jackson的@JsonProperty
在开发当中经常用到fastJson或jackson进行序列化和反序列化。下面分别介绍jackson@JsonProperty注解和fastJson的@JSONField注解。一、jackson的@JsonProperty使用<dependency> <groupId>com.fasterxml.jackson.core</groupId> ...原创 2019-08-18 11:59:33 · 5281 阅读 · 0 评论 -
spring注解@Configuration
@Configuration的作用@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。一、@Conf...原创 2019-08-18 09:43:29 · 1064 阅读 · 0 评论 -
工厂模式—设计模式
设计模式中的工厂模式工厂模式分为三种: ①.普通工厂模式 ②.多个工厂方法模式 ③.静态工厂方法模式一、普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。举例如下:(我们举一个发送邮件和短信的例子)public interface Sender { public void Send(); } p...原创 2019-08-13 21:48:57 · 880 阅读 · 0 评论 -
设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是可复用面向对象软件的基础。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中...原创 2019-08-13 21:35:24 · 886 阅读 · 0 评论 -
mybatis的配置和使用
什么是 MyBatis?MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。Java中...原创 2019-06-30 11:21:37 · 1960 阅读 · 0 评论 -
jdbc--Statement和PreparedStatment以及事务
1.什么是JDBC JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。2.数据库驱动 我们安装好数据库之后,我们的应用程序也是不能直...原创 2019-06-29 19:05:16 · 2405 阅读 · 0 评论 -
synchronized锁
synchronized关键字是Java锁的一种方式。被synchronized修饰的方法或者代码块称为同步方法或同步代码块,synchronized可以保证方法或代码块在运行时,同一时刻只有一个线程可以执行同步方法或者同步代码块(互斥性),同时它还保证了共享变量的内存可见性。Java的每一个对象都可以作为一个锁,不管是实例对象还是class对象。synchronized根据使用的...原创 2019-06-26 19:00:24 · 1432 阅读 · 0 评论 -
Iterator使用于List等集合
迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一...原创 2019-06-28 20:12:31 · 2019 阅读 · 2 评论 -
http协议介绍
HTTP 简介HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从网络应用服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP 工作原理HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器...原创 2019-06-28 19:19:55 · 468 阅读 · 0 评论 -
原码、反码和补码以及为什么设计出反码和补码
一、java中为什么byte的取值范围是-128到+127概念:java中用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数;正数补码为其本身;负数补码为其绝对值各位取反加1;例如:+21,其二进制表示形式是00010101,则其补码同样为00010101;-21,按照概念其绝对值为00010101,各位取反为11101010...原创 2019-06-21 19:30:51 · 1608 阅读 · 0 评论 -
单例模式—设计模式
设计模式中的单例模式单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。比如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。常见的两种单例模式: ①.懒汉模式 ②.饿汉模式一、懒汉模式:...原创 2019-08-13 21:59:05 · 863 阅读 · 0 评论 -
建造者模式—设计模式
设计模式中的建造者模式一、场景当需要生产一辆汽车时,我们需要为其装配发动机、轮胎、座椅等等部件,这个装配过程是比较复杂的而且也需要较高的组装技术。而建造者模式(Builder Pattern)就是为了将部件与组装分离开。二、 概念将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用...原创 2019-08-14 18:53:15 · 796 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor
线程池的使用使用线程池管理线程可以最大程度的利用线程,节省资源消耗,它通过利用已有的线程多次循环执行多个任务从而提高系统的处理能力。我们可以通过java.util.concurrent.ThreadPoolExecutor类来创建线程池。但是除了使用ThreadPoolExecutor,还可以使用Executors中相应的便捷方法来创建线程池,比如Executors.newFixedThr...原创 2019-08-17 10:21:26 · 1019 阅读 · 0 评论 -
观察者模式—设计模式
设计模式中的观察者模式观察者模式定义了一个一对多的依赖关系,让多个观察者对象同时监听同一个主题对象。当这个主题状态发生改变时,会通知所有观察者对象,让它们自动更新自己。模型结构:① 抽象主题角色(Subject): 把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。② 具...原创 2019-08-14 21:56:49 · 867 阅读 · 0 评论 -
模板方法模式—设计模式
设计模式中的模板方法模式模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。模...原创 2019-08-14 21:40:51 · 851 阅读 · 0 评论 -
代理模式—设计模式
设计模式中的代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤、将请求分配给委托类处理、以及委托类处理完请求的后续处理。代理模式分为两种: ①.静态代理 ②.动态代理一、静态代理由程序员创建或工具生成代理类的源码,再编译代理类。...原创 2019-08-14 21:03:37 · 879 阅读 · 0 评论 -
装饰者模式—设计模式
设计模式中的装饰者模式装饰(Decorate)模式又称为包装(Wrapper)模式。可以动态的为一个对象增加新的功能。装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。举一个简单的汽车例子,创造每一种功能的汽车都需要继承车的父类进行实现,那么当我们需要既能路上行驶又能水上行驶的车又得继续继承父类拓展...原创 2019-08-14 20:08:00 · 863 阅读 · 0 评论 -
BigDecimal精确计算
在开发过程中经常会遇到精确计算,比如金额相关的计算,如果出现了精度丢失那肯定是不行了,所以就需要用到BigDecimal来进行相关的计算。下面分别对普通的Java计算以及两种不同的BigDecimal初始化方式进行介绍。 普通的Java计算 package test;public class NormalCalculate { public static void ma...原创 2019-06-19 22:21:08 · 2350 阅读 · 1 评论