java基础
文章平均质量分 80
所为xy
这个作者很懒,什么都没留下…
展开
-
Java中为不同的线程设置不同的获取随机数的Random
private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();使用了 ThreadLocalRandom 生成单独的Random 实例。此类在 JDK7 中引人,它使得每个线程都可以有自己的随机数生成器。我们要避免 Random 实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一 seed 而导致性能下降。...原创 2020-12-26 17:11:44 · 379 阅读 · 0 评论 -
Java中,集合与数组之间的相互转换
使用集合转数组的方法,必须使用集合的 toArray(T[] array)方法,传入的是类型完全一致、长度为 0 的空数组。反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它类型数组将出现ClassCastException 错误。List<String> list=new ArrayList<>();list.add("aa");list.add("bb");list.add("cc");// 使用无参的toArray原创 2020-11-26 17:00:22 · 24500 阅读 · 0 评论 -
偏向锁、轻量级锁
偏向锁:线程执行同步代码块时,首先检查JVM是否开启了偏向锁(1.6后默认是开启的),未开启的执行轻量级锁的流程。**开启的话:**检查对象MarkWord中的偏向线程ID是否是当前线程,是的话,执行同步代码块。**若对象MarkWord的偏向线程ID不是当前线程ID **,则证明已经有线程已经持有了偏向锁。此时使用CAS尝试获取获取,获取成功执行同步代码。未获取到偏向锁的线程会在达到安全点时,暂停已经获取到偏向锁的线程,并将锁升级到 轻量级锁。升级以后,唤醒刚才被停止的持有偏向锁的线程(升级后现在是持原创 2020-05-28 20:32:04 · 125 阅读 · 0 评论 -
枚举实现单例如何保证线程安全、反射安全、序列化安全
1. 线程安全:enum是一个语法糖,编译后,声明的枚举实例其实对应一个用 static final修饰的变量,其初始化在静态块中完成。所以本质上线程安全也是通过类加载过程中,类构造器(< clinit >)的调用实现了同步。2. 反射安全:不允许对enum进行反射,否则直接抛异常。具体是现在 Constructor::newInstance()方法中,进行了类型判断,如果是Enum(每个枚举类的父类)类型,直接会抛异常。3. 序列化安全:Enum序列化与反序列化时的特殊性。序列化时原创 2020-05-23 23:16:48 · 761 阅读 · 0 评论 -
对阻塞、非阻塞、同步、异步的理解
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式原创 2020-06-04 12:32:02 · 141 阅读 · 0 评论 -
使用Scanner输入字符串时的坑
1. 问题描述:使用Scanner从控制台输入字符串时,先使用scanner.next();在使用scanner.nextLine()。最后发现,输入完scanner.next(),按下回车后,还没等输入scanner.nextLine()。程序就执行完了。2. 出现原因:next()是以 空白符(空格、制表符、回车) 结束的,而nextLine()是通过回车结束的。所以上面 输入完scan...原创 2020-05-07 22:25:57 · 981 阅读 · 1 评论 -
生产者-消费者(等待-通知)模式的标准范式
一、说明:所谓范式,指的就是某个领域的一个通用的、合理的问题解决模板。对于常见的生产者-消费者模式,实现方式有很多,但抛开实现手段来说,他的处理方式可以抽象成下面的范式。二、描述:获取锁 { while(条件不满足) { 对象.wait(); } 对应的处理逻辑 }释放锁...原创 2020-05-02 14:36:07 · 278 阅读 · 0 评论 -
后端向前端传递Long类型数据,导致数据不一致
1. 背景:后端商品实体的id字段为Long,从ES中查出封装,以Json的形式返回给前端。结果发现前端展示的的id全为 1244864296175140900。通过在后端打印查出的数据发现实际id有:1244864296175140890、1244864296175140889等等。把后端打印的Json串放进在线Json工具,发现id也会变为1244864296175140900。至此,排...原创 2020-04-07 13:13:43 · 7034 阅读 · 2 评论 -
处理BigDecimal的小数点精度
链接介绍:https://blog.csdn.net/deniro_li/article/details/79164847BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b),n, RoundingMode.DOWN).toString();对于上面的代码,是求a/b后的n位小数。其中RoundingMode是对舍入的策略,DOWN表示不进...原创 2020-03-03 21:22:47 · 416 阅读 · 0 评论 -
多线程中一些接口及类之间的关系
Callable, Runnable, Futher, FutherTask:Runnale:接口,里面有一个run方法,无返回值,代表一个任务。Callable:接口,里面有一个带返回值的方法call,返回值为泛型T,也代表一个任务。Futher:接口,里面有五个重要的方法,用来获取任务及其状态。cancle(xxx):xxx是一个boolean类型的值,为true代表可以取消正在执行的...原创 2019-09-09 17:40:07 · 515 阅读 · 0 评论 -
ThreadLocal补充
针对微信收藏的文章进行补充:1.ThreadLocalMap当发生冲突时,采用的是线性勘察法(开放地址法)。2.ThreadLocal的内存泄漏问题:这里的内存泄漏指的是,一个线程的执行时间一般较长,如果外部的ThreadLocal失去了引用,这时只有Thread类中ThreadLocalMap中Entry中的key在引用他,而这个key又是个弱引用,value呢又是个强引用。这样就存在下一...原创 2020-05-27 20:13:37 · 240 阅读 · 0 评论 -
集合使用不当造成的内存泄漏问题
再使用HashMap与HashSet时,我们常常会自定义一个对象作为key。在自定义对象时如果使用对象内的属性来生成HashCode,则一定不要提供该对象的setter方法,也就是说key应该是不可变类,否则可能会造成内存泄漏。代码示例package trysome.doYourSelf;import java.util.HashMap;import java.util.HashSet;...原创 2019-09-08 10:27:08 · 945 阅读 · 0 评论 -
java中重载与重写的注意事项
一、重载:重载是指在同一个类中,方法名相同,参数列表不同的方法。注意,仅有这两个条件决定,与方法的返回值、访问权限、是否用static、final修饰没有关系。这里的参数列表不同指的是参数个数不同,或者个数相同但顺序或类型不同。二、重写首先重写指的是一个类重新实现它继承的父类或实现的接口中的方法。当重写时:1.子类的访问权限要等于或大于父类的访问权限。2.子类要重写的方法,其返回值、...原创 2020-02-14 11:56:07 · 259 阅读 · 0 评论 -
怎样回答什么是面向对象
学习面向对象编程这么久,那么到底什么是面向对象呢?什么是面向对象:面向对象是计算机科学里的一种编程思想。它根据现实世界事物的特性,即现实中的事物具有其对应的属性与行为。在计算机中就将现实世界中事物的属性和行为抽象成一个类,这个类中描述就这一类对象的属性与行为,也就是我们所说的类的数据与方法。当我们在计算机中需要执行现实世界中某一对象事物要做的事情时,就可以实例化一个对象,通过对这个对象发布命令...原创 2019-07-24 09:00:25 · 253 阅读 · 0 评论 -
逃逸分析
逃逸分析:就是对对象的基本作用域进行分析。比如在一个方法中定义的对象可能被作为参数传给其他方法引用,或者赋值给类变量可以让其它线程访问到。这时就称发生了逃逸。***栈上分配对象:***如果确定对象的范围在一个方法中而不会被其他方法或其他线程访问到。此时就可以把对象分配到栈内容中,这时对象就会随着方法的执行而销毁掉。而不用gc进行垃圾回收。***同步消除:***如果确定一个变量不会逃逸出线程,...原创 2020-02-14 11:56:40 · 158 阅读 · 0 评论 -
hashmap知识点汇总
什么是HashMap:集合框架中已经有list与set系列的数据结构,比如ArrayList满足了我们对数组这种数据结构需求,可以顺序存储数据并可以高效的随机访问数据;LinkedList满足了我们对链表的这种数据结构的需要,可以进行对此添加删除操作。Hashset满足我们能够在一个顺序表中不进行重复值的需求。而HashMap就是为了满足我们对哈希表需求而封装的一个类。这个类中分装了一个has...原创 2020-02-14 11:56:57 · 699 阅读 · 1 评论 -
java的平台无关性
什么平台无关性:平台无关性指的是一种语言可以在不同的平台上运行,而不受不同平台的约束。做到一次编译,到处运行平台无关性的好处:因为平台无关性,所以java程序可以在任意平台上运行。对于java开发者来说可减少部署到不同平台的时间与成本。平台无关性的实现:1.JVM所谓平台无关性,就是要能够做到在不同的平台上无缝连接。但是不同的平台上的硬件设施与操作系统是不同的,这样会导致不同的平台上指...原创 2020-02-14 11:53:55 · 1318 阅读 · 0 评论 -
泛型
泛型是什么:泛型概念:泛型即“参数化类型”,它允许我们在定义类、接口、方法时使用类型形参来表示。在定义变量、产生对象或者调用方法时才真正传入具体的实参,运行时以传入的具体实参为准。引入泛型的原因:1.降低代码的冗余度:假如有一个函数,它可以求两个整数的最大值,也可求两个浮点数的的最大值。如果没有泛型,我们就需要重载产生两个函数。而有了泛型我们就可以将这个函数的形参设为一个类型形参,...原创 2020-02-14 11:56:26 · 136 阅读 · 0 评论 -
自动拆装箱
自包装类及动拆装箱:目的:简化代码书写,封装类可以提供对基本类型的基本操作,当使用集合框架时需要放入的是对象,不能放入基本类型数据1.自动装箱:Integer i=3; 实际会转换为Integer.valueOf(3);2.自动拆箱:int j=i; 实际会转换为 i.intValue()3.包装类缓存机制:目的:提高性能,节约内存空间通过提供一个缓存数组,数值在规定范围的包装类对...原创 2020-02-14 11:55:23 · 89 阅读 · 0 评论 -
深入解析Java中的String
String及其字符串常量池String:对String进行了再次学习,发下很多地方掌握的很模糊:(1)String s1=“abc”;(2)String s2=new String (“abc”);(3)String s3=new String (“abc”).intern();String s4=new String (“def”).intern();jdk1.8:(1)类加载...原创 2020-02-14 11:57:40 · 150 阅读 · 0 评论 -
浮点数问题
造成精度丢失的主要原因:对于float和double ,他们保留的位数不同。一个无限的小数存储时,导致保存的位数不同,从而同一数个其保存下来后值就发生了改变package com.debug;public class Test { static void fun1() { float f_v1 = 20; float f_v2 = 20.3f; float f_v3...原创 2020-02-14 11:55:13 · 217 阅读 · 0 评论 -
枚举类
枚举类**1.每个枚举类都继承于Enum,该类实现Serializable与Comparable接口,并重写了readResolve方法,保证通过反序列化后得到的枚举实例还是之前序列化的实例。2.使用enum定义,非抽象的枚举类默认都会用final修饰的。当有抽象方法时,也不要去手动添加abstract,因为会默认加上,如果强行加上会报错。另外有抽象方法时,在enum类中声明的实例必须去实现该...原创 2020-02-14 11:54:32 · 111 阅读 · 0 评论 -
内部类
将内部类看作是一个类的成员1.非静态内部类中不可以包含静态变量变量、方法以及静态块。非静态内部类可以访问外部类的实例成员和类成员。2.接口也可以有内部接口注意事项:(代码中)public class TestInClass { private int out1=1; private static int out2=2; private int var =3; ...原创 2020-02-14 11:57:14 · 95 阅读 · 0 评论 -
序列化
1.如何实现:package inClass.Serialize;import java.io.*;public class Serialize implements Serializable { private Foo foo; public Serialize(Foo foo){ this.foo=foo; } public stat...原创 2020-02-14 11:57:27 · 98 阅读 · 0 评论 -
java中final关键字详解
一、作用:1.修饰类时,该类不可以被继承2.修饰方法时,该方法不可以被重写3.修饰Java基本数据类型变量时,该变量的值不可再改变;修饰引用变量时,该引用变量的指向不能再改变,但引用对象的值可以改变。4.注意final不可以修饰接口二、final修饰变量的初始化时机1.类变量:在定义时赋值,或在静态块中赋值2.实例变量:在定义时赋值,在非静态块中赋值,或在构造器中赋值3.注意:...原创 2020-02-14 11:53:39 · 171 阅读 · 0 评论