java基础
文章平均质量分 52
学习java编程思想笔记
如雨随行2020
哈撒给
展开
-
【Java】协变与逆变
文章目录一、定义二、数组协变,泛型不变1. 数组的协变性2. 泛型的不变性3. 泛型有界的副作用\<? extends T>\<? super T>总结3. PECS原则一、定义若类A是类B的子类,则记作A ≦ B。设有变换f(),若:当A ≦ B时,有f(A)≦ f(B),则称变换f()具有协变性。当A ≦ B时,有f(B)≦ f(A),则称变换f()具有逆变性。当A ≦ B时,f(A)与f(B)无关,则称变换f()具有不变性。二、数组协变,泛型不变1. 数组的协原创 2021-09-23 00:33:00 · 683 阅读 · 0 评论 -
java中的移位操作
文章目录一、左移 <<二、右移1、有符号右移 >>2、无符号右移三、补充一、左移 <<向左移动,高位丢弃,低位用0补齐不溢出的情况下num<<1相当于num*2例如 int i = Integer.MIN_VALUE; System.out.println(Integer.toBinaryString(i)); // 10000000000000000000000000000000 Sys原创 2021-02-13 18:09:31 · 1321 阅读 · 6 评论 -
使用CompletableFuture
文章目录一、基本使用二、串行执行三、CompletableFuture实现复杂的并行一、基本使用从Java 8开始引入了CompletableFuture,它针对Future做了改进,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。/** * CompletableFuture基本使用 * * 异步获取股票价格 */public class CompletableFutureTests1 { public static void main(Strin原创 2021-02-02 00:36:45 · 152 阅读 · 1 评论 -
使用Future
如果要获取异步执行的结果,我们需要用到Callable(对应Runnable)和Future/** * 使用Future获取异步执行的结果 */public class FutureTests { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService es = Executors.newFixedThreadPool(.原创 2021-02-02 00:14:19 · 142 阅读 · 0 评论 -
使用线程池
文章目录一、ExecutorService二、ScheduledThreadPoolFixedRate和FixedDelay的区别。一、ExecutorServicepublic class ThreadPoolTests { public static void main(String[] args) { // 创建一个固定大小的线程池(4) ExecutorService es = Executors.newFixedThreadPool(4);原创 2021-02-01 23:30:42 · 254 阅读 · 1 评论 -
ReentrantLock使用
一、替代synchronized进行同步public class ReentrantLockTests { private final Lock lock = new ReentrantLock(); private int count; /** * 使用lock */ public void add1(int n) { lock.lock(); try { count += n;原创 2021-02-01 22:39:01 · 2585 阅读 · 0 评论 -
名词解释
临界区(Critical Section)一段被加锁的代码块,任何时候临界区最多只有一个线程能执行。线程安全(thread-safe)如果一个类被设计为允许多线程正确访问,我们就说这个类就是“线程安全”的一些线程安全的类:1、Java标准库的java.lang.StringBuffer也是线程安全的2、 还有一些不变类,例如String,Integer,LocalDate,它们的所有成员变量都是final,多线程同时访问时只能读不能写,这些不变类也是线程安全的。3、类似Math这.原创 2021-02-01 00:12:32 · 138 阅读 · 0 评论 -
Java匹配和替换
文章目录一、appendReplacement和appendTail二、练习题一、appendReplacement和appendTail这两个方法都是Matcher类的方法appendReplacement方法:public Matcher appendReplacement(StringBuilder sb,String replacement)sb是一个StringBuffer,replacement待替换的字符串,这个方法会把匹配到的内容替换为replacement,并且把从上次原创 2021-01-31 00:11:27 · 1738 阅读 · 0 评论 -
日期处理-最佳实践
一、旧API转新API如果要把旧式的Date或Calendar转换为新API对象,可以通过toInstant()方法转换为Instant对象,再继续转换为ZonedDateTime public static void old2New() { // Date -> Instant: Instant ins1 = new Date().toInstant(); // Calendar -> Instant -> ZonedDat原创 2021-01-30 22:23:50 · 119 阅读 · 0 评论 -
设置日期(新旧API差异)
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); /** * 设置dayOfMonth差别 */ public static void setDayDiff() { // 初始化 Calendar calendar = Calendar.getInstance(); calendar.set(2019, 0, 29, 8...原创 2021-01-30 00:29:26 · 429 阅读 · 0 评论 -
泛型笔记
文章目录一、总结二、示例代码三、获取泛型类型一、总结1、List<Number>不是List<Integer>的父类 它们的类型都是List2、List<?>是所有List<T>的父类 但是List<?>是不能读不能写,只能做些空判断3、List<原创 2021-01-29 01:18:19 · 105 阅读 · 0 评论 -
Java动态代理(一个有趣的例子)
package reflection;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;public class ProxyExample { public static void main(String[] args) { // 小韭菜学生类 IStudent ordinaryStudents = new OrdinaryStudents();原创 2021-01-27 22:57:50 · 278 阅读 · 1 评论 -
字节流读取中文文本(UTF8)
文章目录一、原理1、单字节2、多字节二、代码实现一、原理 UTF-8用1到4个字节编码Unicode字符。1、单字节 对于单字节,字节第一位是0,后面7位为这个符号的unicode码。因此对于英语字母, UTF-8编码和ASCII码是相同的。 例如:h的编码是11010002、多字节对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。例如:"你"的编码是 1110原创 2021-01-21 00:51:39 · 2031 阅读 · 10 评论 -
UUID是如何保证唯一性的
文章目录UUID涵义UUID的版本UUID的应用UUID的唯一是根据硬件特征,那么,如果在虚拟机里呢?生成两个完全相同的虚拟机,然后让他们在同一时间生成UUID。。。会得到相同的UUID吗?UUID涵义经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID...原创 2020-01-08 23:13:40 · 4912 阅读 · 0 评论 -
java生成UUID
文章目录前言什么是UUID?UUID有什么用?UUID的组成?UUID的应用?生成UUID前言我们开发的时候,数据库表总会有一个主键,以前我们可能会使用自增的数字作为主键。这样做确实查询的时候比较快,但是在做系统集成或者数据迁移的的时候就麻烦了。这是id就有可能重复了。那么有什么比较好的方法解决这一问题呢?于是jdk1.5出了UUID这个类来生成唯一的字符串标识。什么是UUID?UUI...原创 2020-01-08 22:59:41 · 203 阅读 · 0 评论 -
Java中List初始化
文章目录1.构造List后使用List.add初始化2.使用 {{}} 双括号语法3.使用 Arrays.asList4. 使用 Stream (JDK8)5. 使用 Lists (JDK9)1.构造List后使用List.add初始化List<String> stringList = new LinkedList<>();stringList.add("a");s...原创 2020-01-08 22:10:14 · 17467 阅读 · 1 评论 -
Java8新特性(三)lambda表达式
一、行为参数化简单说,就是interface作为参数,并同时实现interface。当interface只有一个抽象方法,我们可以@FunctionalInterface来注释,说明这是一个函数式接口。java8以前,实现interface,我们是使用匿名类实现,比如java.util.Comparator;而java8我们可以使用lambda表达式来简化这个实现。举个例子// 过滤器pu...原创 2020-01-08 21:44:51 · 171 阅读 · 0 评论 -
Java8新特性(二)流式处理
文章目录一、流式处理简介二、中间操作1、过滤一、流式处理简介Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。使用流式处理可以大大简化代码。比如我们希望筛选出一个整数集合中所有偶数不使用java8 List<Integer> evens = new ArrayList<>(); ...原创 2019-12-26 00:31:29 · 1949 阅读 · 3 评论 -
Java8新特性(一)Optional类
对于NPE,Java8对于null判定提供了一种更加优雅的实现,Optional类。比如我们要返回一个字符串的长度java8以前:if(null == str) { return 0;}return str.length();使用Optional return Optional.ofNullable(str).map(String::length).orElse(0...原创 2019-12-05 23:33:50 · 312 阅读 · 0 评论 -
数组和List相互转换(asList)
Array转ListString[] s = new String[]{"A", "B", "C", "D","E"};List<String> list = Arrays.asList(s);注意这里list里面的元素直接是s里面的元素,对s的修改,直接影响list;s[0] ="AA";System.out.println("list: " + list);// ...原创 2019-12-04 00:10:15 · 2520 阅读 · 0 评论 -
集合常用功能(Collections工具类)
sort(同Arrays)shuffle(随机重排)Collections.shuffle(list);binarySearch(同Arrays)maxminindexOfSublistlastIndexOfSublistreplaceAllCollections.replaceAll(list, 1, 100);reverse(反转列表)rotate(集合旋转)Coll...原创 2019-12-03 23:06:19 · 232 阅读 · 0 评论 -
数组常用功能(Arrays工具类)
fill(填充数组)Arrays.fill(a, 4);复制数组System.arraycopy(a, 0, b, 0, a.length);toStringSystem.out.println(Arrays.toString(a));sort第一种:实现了Comparable的 int[] a = {1, 2, 12, 22, 5, 66, 3...原创 2019-11-28 23:45:06 · 192 阅读 · 3 评论 -
数字前自动补0
问题:现在有个数字,要将转换为固定长度的字符串,小于长度的前面补0(java语言)两种方法: /** * 数字前面自动补0 * @param number 数字 * @param n 最后的长度 * @return */ public static String nDigitNumStr(int number, int n) ...原创 2019-09-28 22:33:32 · 307 阅读 · 0 评论 -
Java文件读写
读说明:fileName是文件路径最简单Fille file = new File(fileName);BufferedReader br = new BufferedReader(new FileReader(file));获取到BufferedReader后就可进行读取文件了String line = null;//从第一行开始读while((line = br.readL...原创 2019-08-13 09:55:00 · 274 阅读 · 0 评论 -
Java 反编译
各种java反编译工具https://blog.csdn.net/evangel_z/article/details/17713709jad反编译工具镜像http://varaneckas.com/jad/命令util是class文件的根目录src是生成的java文件根目录jad -o -r -s java -d src util/**/*.class...原创 2019-08-09 10:52:24 · 111 阅读 · 0 评论 -
Java8 排序
使用Lamdba表达式Collections.sort(companyList, (a, b) -> b.getCreateTime().compareTo(a.getCreateTime()));Company是公司对象,有createTime属性companyList是公司列表,后面是比较器用b去比较a代表是按照creatorTime属性倒序排序...原创 2019-08-07 11:35:43 · 517 阅读 · 0 评论 -
SonarLint插件
http://fengfu.io/2017/12/08/使用SonarLint进行代码检查/原创 2019-08-03 16:28:14 · 568 阅读 · 0 评论 -
日期处理
需求做报表统计时需要按年、月、日三个范围进行统计,后端从前端获取一个时间戳,然后根据范围得到两个时间戳(日的话就是当日的00:00到第二天的00:00, 月的话就是当月一号的00:00到下个月一号的00:00, 年的话…)问题关键在处理过程中,我们发现其实并不难解决,主要是代码要优雅,在处理以下部分时代码不好组织。时分秒的清零一开始使用SimpleDateFormat将日期转换字符串,...原创 2019-05-25 12:18:02 · 443 阅读 · 0 评论 -
equals和deepEquals
转载地址:https://blog.csdn.net/gaohuanjie/article/details/39157241deepEquals和equals是Java中Arrays类的两个静态方法,可是它们之间有什么样的区别呢?代码一、import java.util.Arrays; public class Test { public static void main(String...转载 2019-04-26 11:00:14 · 2528 阅读 · 0 评论 -
Java基础系列(三)
Iterator和IterableIterator: 为了是客户端用同一种逻辑来遍历集合,而不用考虑具体是那种集合对于任意的集合c遍历其内部的元素都是相同的:for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操作... } 在JDK1.5中,还对上面的代码在语法上作了简化这就是我们...原创 2018-10-12 22:16:44 · 151 阅读 · 0 评论 -
Java基础系列(二)
集合原创 2018-10-12 20:19:40 · 150 阅读 · 0 评论 -
Java基础系列(一)
一、java的基本类型与包装类1、java是纯面向对象的语言,但是为了方便还是提供了8种基本的数据类型,基本数据类型的数据不具备“对象”的特性——没有属性、没有方法。同时为了满足其面向对象的特点,Java为每种基本数据类型分别设计了对应的类,称为包装类,并且为其添加一些实用的方法。基本类型和其对应的包装类可以相互转换:基本类型—&gt;包装类:装箱包装类—&gt;基本类型:拆箱手动装箱:...原创 2018-09-29 19:52:07 · 139 阅读 · 0 评论 -
Java 基本程序设计
一、基本数据类型 1、整数类型 byte(1) short(2) int(4) long(8) 2、字符类型 char(2) 3、浮点类型 ...转载 2018-08-24 23:40:04 · 134 阅读 · 0 评论 -
第一个java程序
一、java语言特点 可移植性:一处编译,到处运行 面向对象:java是纯面向对象编程的,C++部分面向结构编程,部分面向对象 解释型:编译解释型语言 多线程 安全性 二、java运行机制 Hello.java 编译(javac.exe) Hello.class(字节码文件) ...原创 2018-08-24 22:36:59 · 121 阅读 · 0 评论 -
java读取jar文件
import java.io.*;import java.util.Enumeration;import java.util.jar.JarEntry;import java.util.jar.JarFile;public class TestReadJarFile { private static final String FILE_PATH = "D:...原创 2019-10-17 09:41:48 · 717 阅读 · 1 评论 -
Java基础—equals和hashCode
为什么要重写equals方法1)Object类中equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个地址是相等的,否则这两个对象就不想等。2)如果有两个对象,他们的属性是相同的,但是地址不同,这样使用equals()比较得出的结果是不相等的,而我们需要的是这两个对象相等,因此默认的equals()方法是不符合我们的要求的,这个时候我们就需要对equa...转载 2019-07-09 23:50:06 · 114 阅读 · 0 评论 -
Think In Java(番外)static关键词
static含义书中86页引用:static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。static关键字的误区1)stati...原创 2019-07-08 23:30:19 · 178 阅读 · 0 评论 -
Think In Java(四)初始化
指定初始化如果想为某个变量赋初始值,有一种很直接的办法,就是在定义类成员变量的地方为其赋值(在C++里不能这样做,尽管C++的新手们总想这样做)。以下代码片段直接给成员变量赋初值。public class InitialValues { boolean bool = false; char ch = 'x'; int i = 939;//....}也可以用同样的方法初始化非基本...原创 2019-07-06 23:05:22 · 95 阅读 · 0 评论 -
Think in Java(三)垃圾回收
finalizejava允许在类中定义一个名为finalize()的方法:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下次垃圾回收动作发生时,才会真正回收对象占用的内存。一般情况下,我们不要过多使用finalize,它的存在只是为了处理java中在使用“本地方法”情况下调用C的malloc()分配存储空间,然后需要在finalize()中调用本地方...原创 2019-07-06 22:52:20 · 86 阅读 · 0 评论 -
Think in Java(二) this关键词
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。只要当需要明确指出对当前对象的引用时,才需要使用this关键字。例如,当需要返回对当前对象的引用时,就常常在return语句中这样写:public class Leaf { int i = 0; Leaf increment() { i++; return this; } void print() { ...原创 2019-07-05 23:21:18 · 121 阅读 · 0 评论