随笔分类 - JavaSE
摘要:验证码功能只需复制粘贴即可,做个记录方便回看 1. 绘制验证码 java @RestController public class VerifyCodeController { @GetMapping("/verifyCode") public void verifyCode(HttpServlet
阅读全文
摘要:看集合扩容时能经常看到位运算,所以翻出来复习一下 1. 原码,补码,反码 原码:将数值转化成二进制,最高位表示符号位 反码:在原码的基础上,正数不变、负数符号位不变,其余各位取反 补码:在原码的基础上,正数不变、负数符号位不变,其余各位取反再加1(即反码+1) 三者是计算机存储数据的不同形式,计算机
阅读全文
摘要:不知不觉就遇到了线程同步器问题,查了资料写下了总结 1. CountDownLatch 日常中会有开启多个线程去并发执行任务,而 主线程要等所有子线程执行完之后才能运行的需求 。之前我们是使用Thread.join方法来实现的,过程如下: join()方法不够灵活,现在JDK提供了 CountDow
阅读全文
摘要:最近忙着复习,笔记倒是写了很多但没有整理出来,后期抽时间统一上传 1. CAS 在并发编程下能经常看到CAS,全名Compare and Swap(比较和交换)。是JDK提供的非阻塞原子性操作,它通过硬件保证了 这个操作的原子性,主要是处理器级别提供了原子性操作。和重量级锁(Synchronized
阅读全文
摘要:说明:等于转载的博客,出自JavaGuide(还是有自己手动实践一遍的) 1. 概览 JDK提供的并发容器在java.util.concurrent中,即出名的JUC,主要有: ConcurrentHashMap:线程安全的HashMap CopyOnWriteArrayList:线程安全的list
阅读全文
摘要:学了Lambda表达式之后感觉没什么用处对吧,其实不然,在流操作里面可以体验其简便性,因为平时用得少,很容易忘记 1. Stream 其在java.util.Stream包下, 提供对数据进行各种简便操作,效率当然比我们手写要好,并且支持并行操作,其使用过程分为三步: 创建Stream流 中间操作
阅读全文
摘要:辛辛苦苦搬了一天砖,结果发现绝大部分时间是在写Bug,改起来真是痛不欲生,然后忽然想起来还有个JUnit测试,方便我们debug调试 1. Assertion 断言是一种调试程序的方式,可以理解为高级的异常,其常与测试类并用,使用 关键字来实现断言。在JVM中默认是关闭断言的(这样在线上环境就不会启
阅读全文
摘要:无意间看到了内省,与反射相关联,所以写了一点操作 1. 内省 反射 一个类有两种状态(编译和运行),通常我们是在编译状态来获取类的信息,也就是new一个实例出来然后通过该实例来获取类内部的信息。若需要在类运行时动态的获取类的信息,则需要用到反射 内省 内省是通过反射来实现的,用BeanInfo来暴露
阅读全文
摘要:Coding中经常遇到回调,大概知道是什么作用但没有去理解其原理,导致后期遇到类似问题还是很懵,现在就来学习一下 1. 回调 回调简单而言:在一个类(A)的方法(a)中调用另一个类(B)的方法(b),当方法(b)执行完之后就调用类(A)中的方法(c),这就是回调的过程,是不是很简单?简单分析可以知道
阅读全文
摘要:笔者最近在练习Mysql语句优化,奈何年少不懂,找不到百万级别的测试数据,只好用java随机生成数据凑合用一下,所以写下此篇博客,经测试生成500万条数据后台用了9秒,完全可以接受 1. Random random伪随机数类在 java.util 包下,是最常用的随机数生成器,其使用线性同余公式来生
阅读全文
摘要:1. 时间API 我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970 01 01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还需加上时区。比如现在输出笔者本地的时间 ,其中 GMT+08:00 表示格林威治时间的东8区,也就是
阅读全文
摘要:1. BIO和NIO 我们平常使用的IO是BIO(Blocking IO),即阻塞IO、而NIO(No blocking IO)则是非阻塞IO,二者有什么区别呢? 预先知识准备 同步:发起调用后,调用者一直处理任务至结束后才返回结果,期间不能执行其他任务 异步:发起调用后,调用者立即返回结果的标记(
阅读全文
摘要:学习Lambda表达式之前需要一些铺垫,下面直接开始把 1. 接口的默认方法 接口之前定义为只有常量和抽象方法,JDK1.8之后增加了默认方法 public interface Test { int num = 10; abstract void say(); default void sayHel
阅读全文
摘要:1. 来源 Object类中定义了equal和hashCode方法,又因为Object是基类,所以继承了Object的类都有这两个方法 先来看看Object类中的equal方法 * @param obj the reference object with which to compare. * @r
阅读全文
摘要:1. 注解 什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数上的一种特殊“注释”,可以在编译、类加载、运行时被读取,并执行相对应的处理 2. 基本注解 @Override:检查该方法实现父类方法 @Deprecated:过时注解 @SuppressWarnings:抑
阅读全文
摘要:关于java的类型,这里讲解基本类型,引用类型较复杂,分开来讲,那么开始把,基本类型有8种: 整数类型:btye、short、int、long 浮点类型:float、double 字符类型:char 布尔类型:boolean 他们占用的字节数及其默认值如下: | 数据类型 | 字节数 | 默认值 |
阅读全文
摘要:1. 打包jar 自己写了一个类,怎么才能打包使用呢?下面就来介绍如何将自己写的类打包成jar包方便以后使用 1.1 准备一个写好的类 这里笔者写了一个基数排序的类 java import com.howl.sort.RadixSort; public class JarTest { public
阅读全文
摘要:1. ThreadLocal ThreadLocal让线程有自己的局部变量,其中重要的方法有:set(),get(),remove() ThreadLocal的使用 线程1存的内容,只有线程1能使用,其他线程拿不到 2. 原理 来看看set方法 ThreadLocal内部维护了一个静态内部类 Thr
阅读全文
摘要:1. 线程池 线程池和数据库的连接池是同样意思,把多个线程放在一个集合里,有任务时从集合里分配线程,当该线程完成任务后不是销毁,放入线程池等待下次任务,减少了创建和销毁线程的次数,提高系统效率,因为创建和销毁属于 。如果每有一个任务就创建一个线程,大量任务涌进会导致创建过多线程而内存溢出 2. Ex
阅读全文
摘要:1. 多线程可能出现的安全问题 问题分析: i++ 这个操作是非原子性的,分为三步: 读取 i 的值 将读取的数值 +1 将数值写回 i 线程t1,读取了i 值为10,在把值写回 i (i++ = 11) 之前,线程t2就读取了 i 的值,此时t1并未修改 i 的值,所以 i 还是等于10 因此二者
阅读全文