![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 64
pbxs
这个作者很懒,什么都没留下…
展开
-
HttpServletRequest获取POST请求的参数
除了@RequestBody方式外,我们还可以通过HttpServletRequest方式获取参数。比如参数是:{ "code": "xxx"}获取方式:import cn.hutool.json.JSONObject;import cn.hutool.json.JSONUtil;import javax.servlet.http.HttpServletRequest;import java.io.BufferedReader;import java.io.IOException;原创 2021-04-29 18:38:04 · 11141 阅读 · 0 评论 -
HTTPS是怎么防止劫持的
HTTP是明文传输的,如果想密文传输就需要HTTPS(HTTP+SSL),三次握手之后再建立SSL连接。那么HTTPS是怎么防止劫持的?在HTTP请求时,常见的劫持有DNS劫持和传输内容被劫持,我们从这两个劫持来看看HTTPS是怎么解决的。怎么防止DNS劫持什么是DNS劫持?比如用户想访问知乎,在浏览器输入如下域名https:// www.zhihu.com要打开这个网站,首先要解析域名www.zhihu.com,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果用户的浏览器和黑客的私原创 2021-01-04 13:00:40 · 1611 阅读 · 0 评论 -
Java网络编程基础
目录计算机网络体系结构OSI 七层模型TCP/IP 模型TCP/IP协议族TCP的基本特性TCP建立连接的3次握手TCP的洪泛攻击TCP断开连接的4次挥手常用的网络工具HTTP协议一次完整的HTTP请求的过程HTTP协议报文结构计算机网络体系结构每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。OSI 七层模型物理层、链路层、网络层、传输层、会话层、表示层、应用层。TCP/IP 模型链路层、网络层、传输层、应用层。TCP/IP协议族常见的有TCP、UDP、HTTP、FTP、原创 2020-12-08 10:09:30 · 121 阅读 · 0 评论 -
Java Map的最高校遍历方法
public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); for (int i = 0; i < 200; i++) { map.put("" + i, "value" + i); } // 第一种:普遍使用,二次取值 System.out.println("-------------第一种------------------原创 2020-10-29 16:01:44 · 151 阅读 · 0 评论 -
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?
什么是序列化序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。怎么序列化实现Serializable接口,指定serialVersionUID字段。public class User implements Serializable { private static final long serialVersionUID = -2789105097448974933L;}为什么序列化对象、文件,有许多不同的格式,很难统一原创 2020-10-27 11:44:41 · 947 阅读 · 0 评论 -
Java算法中O(1),O(logn),O(n),O(nlogn),O(n2)是什么
O(1),O(logn),O(n),O(nlogn),O(n2)是用于表示算法的时间复杂度的一个函数。时间复杂度常用大O符号表述,O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系,反应随着数据增值时间复杂度的渐变过程。比如我们统计排序算法复杂度时的对比表:常数阶O(1)O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑原创 2020-10-22 16:32:48 · 1504 阅读 · 0 评论 -
Java位移运算符,左移运算符(<<),有符号右移运算符(>>),无符号右移运算符(>>>)
位移运算符操作的对象是二进制的位,可以用位移运算符来处理int型整数。public static void main(String[] args) { int x = 15; //1111 int y = 3; System.out.println(x<<y); //结果为120,1111000 System.out.println(x>>y); //结果为1,0001 System.out.println(x>>>y); /原创 2020-10-22 15:02:13 · 397 阅读 · 0 评论 -
二进制转十进制,十进制转二进制
十进制转二进制,采用短除法比如要将十进制的29转成二进制: 用29除以2,商写在下面,余数写在商的右边。除到商为0为止,然后倒序排列余数,得到11101即为二进制。二进制转十进制,采用按权相加法比如十进制29的二进制为11101,转换成十进制如下:说明:2的几次方那个次数是怎么确定的?方式一:比如从左数的第一位1,在它前面还有四位,那么它的次数就是为4。方式二:比如从右边开始,第一位是从0次方开始,以此类推。说明:任何除0以外的数的0次方都是1 。如3的0次方是1,-1的0次方也是原创 2020-10-22 11:12:25 · 1275 阅读 · 0 评论 -
深入比较理解Java中 ArrayList 和 LinkedList 的区别
谈谈ArrayList 和 LinkedList 的区别?常规答案:ArrayList 是基于数组实现的,LinkedList 是基于双向链表实现的。ArrayList 在新增和删除元素时,因为涉及到数组复制,所以效率比 LinkedList 低,而在遍历的时候,ArrayList 的效率要高于 LinkedList。如果是面试,这么回答就太简单了。接下来我们一起深入地研究一下 ArrayList 和 LinkedList 的数据结构、实现原理以及源码。转载 2020-10-14 15:48:08 · 152 阅读 · 0 评论 -
Java中几种异常处理方式
直接抛出异常通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。private static void readFile(String filePath) throws IOException { File file = new File(filePath); String result; BufferedReader reader = new BufferedReader(new .转载 2020-10-13 14:50:03 · 148 阅读 · 0 评论 -
Java高并发下一切皆有可能之指令重排
代码示例,我们通过while(true)不断循环,每次开始t1、t2两个线程改值、赋值,模拟并发请求的场景。t1改a值,把b赋值x;t2改b值,把a赋值y。@Slf4j(topic = "e")public class Test1 { public static int a = 0, b = 0, x = 0, y = 0; @SneakyThrows public static void main(String[] args) { int count = 0;原创 2020-10-13 10:15:34 · 286 阅读 · 0 评论 -
JDK8新特性函数式接口的使用示例
基础知识在写函数式接口的使用示例之前,先了解如下几个知识:行为参数化:是JDK8提出的,函数式编程的一种思想,把代码逻辑包装为一个参数传到方法里。Lambda表达式:是JDK8提出的,可以理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有参数列表、函数体、返回类型,可以抛出一个异常类型。函数式接口:本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用@FunctionalInterface注解定义。JDK8默认方法和静态方法可以在函数式接口中原创 2020-10-10 20:03:26 · 447 阅读 · 0 评论 -
Java线程池ThreadPoolExecutor的execute()源码解读
public class ThreadPoolExecutor extends AbstractExecutorService { // 高3位存状态、低27位存线程数 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); //工作线程集合 private final HashSet<Worker> workers = new HashSet<Worker>(); public v原创 2020-10-10 13:09:53 · 689 阅读 · 0 评论 -
Java编译优化惹得祸,while无限循环
下面这段代码,按正常逻辑打印完"[flag = true] end"日志后,程序就会正常退出了。但实际运行,程序未能正常退出,因为while循环没有退出。private static boolean flag;public static void main(String[] args) throws Exception { Thread t = new Thread(() -> { int i = 0; while (!flag) {原创 2020-10-09 18:54:41 · 938 阅读 · 3 评论 -
Java中与&、或|、异或^运算符的使用规则与区别
Java中与&、或|、异或^运算符都是二进制的运算,通过对两组二进制的每一位对比得出结果。运算规则与&1:1时为1(概率25%),其他都为0(概率75%)或|0:0时为0(概率25%),其他都为1(概率75%)异或^0:0或1:1时为0(概率50%),0:1或1:0时为1(概率50%)运算步骤如图,两个数字X、Y,分别进行与&、或|、异或^运算:X、Y如果是十进制的话,先算出X、Y二进制值;把两组二进制值平行放在一起,右边对齐,左边不足补0;根据与&原创 2020-09-29 10:34:36 · 462 阅读 · 0 评论 -
Java中什么是注解及如何实现自定义注解
什么是注解注解(annotation):元数据,一种代码级别的说明;即注解如同一张标签;可以携带参数;在特定场景下由外部解析产生作用;元注解(用于自定义注解)@Documented 注解是否将包含在JavaDoc中,用的比较少;@Retention 什么时候使用该注解,可选值有:source 在源代码阶段使用,如@Override,lombok的注解@Data、@EqualsAndHashCode等等。@Target(ElementType.METHOD) @Retention原创 2020-10-11 12:19:39 · 421 阅读 · 0 评论 -
从数据结构、位运算和源码浅析HashMap
HashMap的数据结构数据结构String[]数组首先想到的就是String[]数组,声明指定的长度后,然后根据索引向里面插入数据。但它的缺点是,长度不够时扩容麻烦。ArrayList数组面对这个缺点可以选择ArrayList数组,支持动态扩容,查询速度很快(可以根据索引快速查找),顺序插入也快。但它的缺点是,在数组的中间元素插入删除元素时,要移动索引,数据量大时,频繁插入删除速度就会慢。LinkedList链表-面对这个缺点可以选择LinkedList链表,插入删除元素快。但查原创 2020-09-27 20:40:02 · 94 阅读 · 0 评论 -
Java身份证号脱敏、校验身份证号合法性、根据身份证号获取年龄、根据生日获取年龄
身份证号编码规则第一、二位表示省(自治区、直辖市、特别行政区)。第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用198105原创 2020-09-09 15:30:14 · 2727 阅读 · 0 评论 -
IDEA怎么设置Class类注释模板并自动生成
IDEA怎么设置Class类注释模板,并在新建类时自动生成。File->Settings原创 2020-09-08 19:57:32 · 2581 阅读 · 0 评论 -
通配符<? extends T>和<? super T>区别及使用场景
<? extends T> : 上界通配符(Upper Bounds Wildcards) <? super T> : 下界通配符(Lower Bounds Wildcards)平时开发会遇到不少<? extends T>和<? super T>通配符的使用,比如:Collections类提供的集合元素拷贝的copy()方法就同时使用了<? extends T>和<? super T>。public class Coll..原创 2020-09-07 21:07:43 · 3053 阅读 · 2 评论 -
Java中如何实现String字符串的反转(四种方式实现)
有四种方式:自定义实现,利用递归的方式/** * 自定义实现,利用递归的方式 * * @param originStr * @return String */ public static String reverse(String originStr) { if (originStr == null || originStr.length() <= 0) { return originStr; }// String o原创 2020-09-01 14:49:36 · 663 阅读 · 0 评论 -
ApacheBench使用入门
Ab(ApacheBench) 测试工具是 Apache 提供的一款测试工具,具有简单易上手的特点,在测试 Web 服务时非常实用。Apache是跨平台的,所以在Mac、Linux、Windows等系统下,只要安装了Apache就能使用AB工具。Mac安装ApacheBench(AB)Ubuntu安装命令:sudo apt-get install apache2-utilsCentOS安装命令:yum -y install httpd-toolsWindows下Apache下载地址:https:原创 2020-08-12 20:30:59 · 1142 阅读 · 1 评论 -
Mac安装ApacheBench(AB)
Mac自带Apache和ApacheBench(据说Mac自带的AB有最大并发限制),也可以重新下载一个Apache编译来安装,安装之前记得卸载系统自带的。查看Mac自带的查看到帮助信息终端输入:ab查看Apache版本、ApacheBench版本终端输入:apachectl -v 、ab -V官网下载ApacheApache网关下载地址选择红色框框的编译包。安装依赖包安装 apr终端 执行 brew install apr 打印如下信息:apr is keg-only原创 2020-08-12 18:50:36 · 2197 阅读 · 0 评论 -
JavaVisualVm安装VisualGC插件
JavaVisualVm是JDK自带的监控可视化工具,有一个VisualGC的插件,非常好用。插件安装有两种方式:配置代理服务器的方式;下载好插件包离线安装。我采用的是第二种方式。1、到官网下载插件下载时一定要注意选择JDK对应的版本。下载地址:https://visualvm.github.io/pluginscenters.html我的JDK是8-261,所以我选择红色框框的版本下载。2、进入插件列表,找到VisualGC插件下载后的文件:3、安装插件(离线安装)原创 2020-08-08 17:01:29 · 508 阅读 · 1 评论 -
SpringBoot启动Tomcat容器的源码主流程
SpringBoot中内置了Tomcat和Jetty容器,默认会启动Tomcat容器。接下来我们点进源码看一下SpringBoot启动Tomcat容器的主流程。SpringBoot启动类:@SpringBootApplicationpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }原创 2020-08-08 10:41:20 · 168 阅读 · 0 评论 -
JDK8语法糖stream()流式计算的使用例子
JDK8推出了很多新特性,比如:函数式接口Lambda表达式Stream API流式计算接口中的默认方法与静态方法方法引用与构造器引用新日期API今天整理一下stream()流式计算的使用例子。filter过滤mapToInt转换max求最大值需求:找出姓张且名字长度最长的长度。List<String> names = Arrays.asList("张三", "李四", "王老五", "李三", "刘老四", "王小二", "张四", "张五六七");//常规做法/原创 2020-08-05 16:59:27 · 1030 阅读 · 0 评论 -
JDK8日期时间类型LocalDateTime、LocalDate、LocalTime的使用例子
JDK8以前日期时间类型统一使用的是java.util.Date,JDK8以后在java.time包下定义了三种新的日期时间类型LocalDateTime、LocalDate、LocalTime。最近项目中使用日期类型比较多,这里做下总结。常用类类型用途LocalDateTime用于“年月日时分秒”的类型,比如:yyyy-MM-dd HH:mm:ssLocalDate用于“年月日”的类型,比如yyyy-MM-ddLocalTime用于“时分秒”的类型,比如:H原创 2020-08-03 21:21:04 · 1218 阅读 · 1 评论 -
Java类加载器和双亲委派模型及Tomcat/SPI为什么要打破双亲委派
JDK 提供的三层类加载器Bootstrap ClassLoader启动类加载器,它在类加载器里处于顶层,任何类的加载都要询问它,它的作用是加载核心类库,比如rt.jar、resources.jar、charsets.jar。主要用于加载JAVA_HOME/lib目录下的类库,也可以通过-Xbootclasspath 参数指定路径。这个加载器是C++编写的,随着 JVM 启动,通过代码获取为null。Extention ClassLoader扩展类加载器,主要用于加载JAVA_HOME/lib原创 2020-08-01 19:45:41 · 976 阅读 · 0 评论 -
简述什么是零拷贝
大家都知道Kafka、RocketMQ都是千万级吞吐量的消息中间件,之所以能有这么高的吞吐量,很大的原因就是使用了零拷贝技术。那么什么是零拷贝呢?先看看JVM的内存结构:需要注意的是,直接内存并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域。所以也叫堆外内存。我们画图来解释什么是直接内存,它又有什么用途:因为JVM不能直接读写操作系统内存,即JVM不能直接拷贝系统内存的数据,JVM也不能直接把数据写入系统内存,需要做中转才能实现数据的拷贝写入。而直接内存就比较原创 2020-07-31 20:31:03 · 385 阅读 · 0 评论 -
Java中强引用、软引用、弱引用、虚引用的使用场景
Java中强引用、软引用、弱引用、虚引用,引用强度从大到小依次是强软弱虚。强引用强引用是引用关系最强的一种引用,比如User user = new User();这种就是强引用。user和堆对象强关联,通常不会被GC回收(除非满足根不可达或者使用“User user = null” 解绑)。使用场景:一般用于常规业务编码。软引用软应用(SoftReference)比强引用的引用强度低一点,当OOM内存溢出时,被回收。软引用可以和一个引用队列ReferenceQueue联合使用,如果软原创 2020-07-30 21:27:29 · 522 阅读 · 0 评论 -
两个Integer的引用对象传给一个swap()在内部做交换引用后,两个引用的值是否发生变化
这个是一道京东的面试题,考察的是值传递和引用传递的知识点。先看一个值传递、引用传递的示例:/** * 引用传递和值传递 * * @author wanglingqiang * @date 2020/7/25 下午3:15 **/public class Test { public static void main(String[] args) { Test test = new Test(); int a = 1; Obj obj =原创 2020-07-25 17:51:36 · 299 阅读 · 0 评论 -
Java的基本数据类型及字节数,Integer和int的区别
Java 中的数据类型分为 基本数据类型 和 引用数据类型。基本数据类型共八种:四种整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节);两种浮点数类型:float(4字节)、double(8字节);一种字符类型:char(2字节);一种布尔类型:boolean(1字节);这八种基本类型都对应有引用类型。Java中将基本数据类型转换为引用数据类型的过程称为装箱,反之称为拆箱。自动装箱、拆箱的示例:Interger i = 30;Float原创 2020-07-25 14:29:55 · 2003 阅读 · 0 评论 -
@Autowired 与@Resource的区别
@Autowired和@Resource都用于Bean的注入。最明显的区别是@Autowired按byType自动注入,而@Resource按 byName自动注入。Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。byType按类型注入 是什么? 就是接口的类型。如果接口有多个实现类,按类型就不足以区分,就要按名称了。byName按名称注入 是什么?就是Bean原创 2020-07-24 20:34:56 · 128 阅读 · 0 评论 -
走进源码学习Lock和AQS(AbstractQueuedSynchronizer)怎么配合实现加锁流程
JUC:java.util.concurrent的缩写,Java的并发变成类都在这个下面。AQS:AbstractQueuedSynchronizer抽象类的缩写,Lock、Condition的具体实现都在这个类,很重要的一个类。主要类及主要结构:AbstractOwnableSynchronizer的主要结构:public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { .原创 2020-07-21 14:57:02 · 196 阅读 · 0 评论 -
JDK1.8中字符串常量池的优化之String的intern()
JDK每次升级都会做很多优化,我们使用最多的String常量类也在不断被优化。这次和大家分享的是String优化手段之一的intern()方法。源码API如下:/*** Returns a canonical representation for the string object.* * A pool of strings, initially empty, is maintained privately by the* class {@code String}.* * When th原创 2020-07-20 17:46:07 · 1665 阅读 · 0 评论 -
如何让多个线程按照指定的顺序串行执行
比如:ThreadA输出0,ThreadB输出1,ThreadC输出2……很短的时间内先后启动线程A、B、C……最后输出0123456……或者循环new Thread(),让多个线程按new的先后顺序串行执行。参考答案:通过Thread的join()方法实现。代码示例一:通过Thread的join()方法实现多个线程的串行执行。每个线程会告诉下一个线程,等我先执行。/** * 通过Thread的join()方法实现多个线程的串行执行 * * @author wanglingqiang原创 2020-07-18 19:14:47 · 1281 阅读 · 0 评论 -
同时启动多个线程输出ABABAB或者ABCABCABC
线程A输出A,线程B输出B,同时启动线程A和线程B让其输出ABABAB……线程A输出A,线程B输出B,线程C输出C,同时启动这三个线程让其输出ABCABCABC……方式一:利用Object对象的wait()、notify()实现这种方式的特点是,wait()、notify()要作用同一个对象才能生效。所以,我们定义了一个单独的PrintAB类,在该类中包含打印A、B的方法,然后线程A、线程B引用PrintAB对象,调用对应的打印方法。代码示例:/** * 利用Object对象的wait()、no原创 2020-07-18 16:53:19 · 1127 阅读 · 1 评论 -
Java代理模式之静态代理和动态代理
Java代理模式之静态代理和动态代理代理模式定义给目标对象提供一个代理对象,并由代理对象控制对目标对象的访问。看上面的类图,我们知道代理对象和目标对象需要实现一样的接口。代理模式目的1、通过代理对象间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;2、通过代理对象对原有业务做增强。静态代理与动态代理我们先从简单的静态代理入手,以便更好地理解代理模式,然后分析静态代理的不足,接着引出动态代理。静态代理我们都知道由于关税和汇率的原因,去香港买东西便宜不少,质量也有保障,于是很原创 2020-07-18 14:55:52 · 257 阅读 · 0 评论 -
Java网络编程BIO示例,从简单到伪异步逐渐升级
Java基础ServerSocket、Socket服务端客户端连接的例子)代码示例代码示例比较基础的代码,配有详细的注释,就不多说了。服务端代码:/** * 服务端 * * @Author wanglingqiang * @Date 2020/7/3 下午5:53 **/public class Server { public static void main(String[] args) throws IOException { // 开启服务,绑定端口原创 2020-07-03 18:28:37 · 224 阅读 · 0 评论