
Java语言基础
文章平均质量分 67
荒野大码农
仰之弥高,钻之弥坚
展开
-
Integer中为什么-128~127之间的值可以直接==
在判断两个Integer是否相等的时候我们一般都是使用equals来比较是否相等,很多网上的博客也有提到过两个Integer的值在[-128, 127] 之间的时候,可以直接通过==来比较是否相等。那么为什么[-128, 127] 之间的Integer可以直接用==呢?从自动装箱说起public class Demo { public static void main(String[] args) { Integer i1 = 100; Integer i2 =原创 2021-04-22 16:42:03 · 1291 阅读 · 0 评论 -
java中Socket设置超时时间的两种方法
方法1:调用Socket的connct 方法打开连接,并设置连接超时时间Socket socket = new Socket()socket.connect(new InetSocketAddress(ip, port), 3000); //设置超时3000毫秒以上代码是设置Socket的连接超时时间,当连接超时时,会抛出如下异常:在不设置连接超时时间的情况下,socket默认的超时时间应该是20毫秒左右(我试了5次大概都是20毫秒就会抛出异常)方法2:调用Socket的setSoTime原创 2021-02-21 16:57:13 · 14960 阅读 · 1 评论 -
阻塞队列LinkedBlockingQueue源码学习
前上一篇博客学习了ArrayBlockingQueue,今天学习LinkedBlockingQueue源码并与之对比。LinkedBlockingQueue总结同样先直接总结LinkedBlockingQueue相关的特性,再根据源码来进行说明,它的主要特性如下:底层用链表实现数据存储;是一个FIFO无界阻塞队列。队列的最大容量默认是Intenger的最大值Integer.MAX_VALUE,也可以设置自定义容量;重要属性介绍LinkedBlockingQueue有一个内部类 Node ,原创 2020-10-08 16:35:35 · 328 阅读 · 0 评论 -
阻塞队列ArrayBlockingQueue源码学习
ArrayBlockingQueue总结先直接总结ArrayBlockingQueue相关的特性再根据源码来进行说明,它的主要特性如下:他是一个由数组实现的FIFO有界阻塞队列,数组由final修饰;ArrayBlockingQueue有界且固定,在构造函数时必须指定大小,确认后不支持改变(确定数组长度且不可变);默认在多线程环境下不保证"公平性";通过 ReentrantLock 与 Condition 实现线程安全;重要属性介绍ArrayBlockingQueue的属性还是比较简单,原创 2020-10-08 13:47:19 · 169 阅读 · 0 评论 -
Java中异常为什么性能差
Throwable源码首先给大家看一段JDK的Throwable源码上面这段JDK的源码就是抛出异常时会调用的方法,更准确的说是Throwable 的所有构造方法中都会调用fillInStackTrace ,由于所有的异常都直接或间接的继承了Throwable ,所以当我们所以当我们new一个异常的时候,一定会执行fillInStackTrace (创建子类的时候会先执行父类的构造方法)这个方法暴露出两个问题使用了synchronized修饰了整个异常方法需要追踪线程运行堆栈信息异常种类原创 2020-09-09 08:48:24 · 700 阅读 · 4 评论 -
TreeMap是如何实现去重和排序的
TreeMap实现了SortedMap接口,它是一个key有序的Map类。TreeMap的默认排序规则TreeMap并不是根据插入的顺序来排序,而是根据key元素的 compareTo 方法来排序。测试代码:Map<Integer, Object> map = new TreeMap<>();map.put(5, new Object());map.put(10, new Object());map.put(8, new Object());map.put(12, n原创 2020-07-18 14:38:33 · 6348 阅读 · 1 评论 -
乐观锁的思想和其在Java中的实现
首先我们要明白,所谓的乐观锁和悲观锁其实都是一种思想,基于思想,可以做出很多种实现。乐观锁与悲观锁的概念非常好理解。悲观锁当一个公共变量(比如一个有状态的单例对象)被多个线程访问的时候,我们假设每个线程都会去修改这个公共变量,于是我们要让访问这个公共变量的线程上锁,这样其他线程要想访问这个变量就会阻塞等待锁的释放。这个就是悲观锁的思想。在关系型数据库中就用到了很多这种锁机制,比如行锁,表锁等...原创 2020-02-14 21:07:54 · 1200 阅读 · 0 评论 -
代码安全之使用不可变对象
我们先来看一个例子:public static void main(String[] args) { try { Date d1 = str2date("2019-10-20 09:10:00"); Date d2 = str2date("2019-10-20 09:12:00"); Date d3 = st...原创 2019-10-21 10:00:52 · 138 阅读 · 0 评论 -
Map中的merge,compute,computeIfAbsent,computeIfPresent
mergemerge表示合并,它将传入的value值和Map中特定的旧value按照自定的计算规则进行合并。merge方法接受三个参数:key,value和BiFunction函数对象:key:要与计算结果值关联的键,同时它也用来查询老的value值value:用来与key所对应的旧value合并的非空值,如果key所对应的旧value为null,它就会与key直接组成新的键值对存入ma...原创 2019-08-29 10:43:46 · 889 阅读 · 3 评论 -
Java队列的poll,peek,element的区别
poll,peek,element的共同点:都是返回队列中的首个元素不同点:poll:将首个元素从队列中弹出,如果队列是空的,就返回nullpeek:查看首个元素,不会移除首个元素,如果队列是空的就返回nullelement:查看首个元素,不会移除首个元素,如果队列是空的就抛出异常NoSuchElementException...原创 2019-07-24 14:43:48 · 41456 阅读 · 1 评论 -
初探Java的Buffer类
传统阻塞型I/O的问题用过Java的Socket编程的人一定都知道传统的网络I/O编程是ServerSocket的accept方法一直等待着TCP请求的接入,每当收到一个TCP请求后,ServerSocket就会创建出一组I/O流,把它们交给一个线程去处理,这种情况下的结构关系就是每条线程处理一个I/O,就像下面这张图一样这种设计有几个问题:1.假设访问的高峰期并发量较大,我们必须为程序配...原创 2019-04-24 23:30:27 · 14063 阅读 · 2 评论 -
用Jedis获取Json字符串时候遇到的一个坑
记录以下今天下午遇到的一个坑,一下午时间全花在这个问题上了。。。在用Jedis从redis中获取到Json字符串后要将它反序列化为对象。结果抛出了异常。第一个怀疑是这个Json字符串是不是格式有问题,我将这个Json字符串打印出来放到格式化的网站上,结果没问题。...原创 2019-02-26 09:00:14 · 1047 阅读 · 0 评论 -
Java保留两位小数的4种方法
原文地址:添加链接描述转载 2018-10-20 08:30:59 · 205 阅读 · 0 评论 -
如果类中的构造方法是创建本类的对象,会栈内存溢出
今天用递归的时候,从递归的问题(方法调用自己本身可能会出现栈内存溢出),联想到如果一个对象创建自己本身,会不会也出现堆内存溢出。于是写了个小测试。/** * 如果类中的构造方法是创建本类的对象,会堆内存溢出 * java.lang.StackOverflowError * */public class Test { private Test t; Test(){ th...原创 2018-11-22 10:41:07 · 496 阅读 · 0 评论 -
关于for循环删除集合元素的几个坑
1.原始的for循环删除集合元素的时候有可能会漏掉某个元素测试代码:/*** 假设需要删除集合中的所有的"A"元素* 如果使用原始的for循环,那么就可能会漏删*/List&lt;String&gt; list = new ArrayList&lt;&gt;(); list.add("A"); list.add("原创 2018-12-03 16:26:34 · 4661 阅读 · 5 评论 -
Java8中的LocalDateTime和时间戳timestamp互相转换
将timestamp转为LocalDateTimepublic LocalDateTime timestamToDatetime(long timestamp){ Instant instant = Instant.ofEpochMilli(timestamp); return LocalDateTime.ofInstant(instant, ZoneId.sys...原创 2018-12-14 16:10:14 · 24110 阅读 · 3 评论 -
在对象中可以访问到另一个同类对象的私有属性
今天看String的equals源码的时候发现了一个问题public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String an...原创 2018-12-10 10:25:06 · 995 阅读 · 3 评论 -
分割String的时候用substring会比split效率更高
假设一个场景:将一个字符串 "电池组号=1"以等号为边界拆分为两个字符串即,将 “电池组号=1” 拆分为“电池组号”和“1”两个字符串。实现这个功能可以用split或者substring两种方法。那么那种方式的效率更快呢?答案是substring更快。测试代码如下@Test public void test(){ String str = "电池组号=1";...原创 2019-01-07 14:12:05 · 2640 阅读 · 0 评论 -
Java中构造方法的继承问题
1.父类的构造方法是不会被子类继承的,但是子类的构造方法中会有一个隐式的super()来调用父类中的无参数构造方法。验证代码如下:public class FatherClass { int a; int b; public FatherClass() { a = 10; } public FatherClass(int b) { this.b = b; }}publ...原创 2018-09-26 14:13:05 · 9541 阅读 · 0 评论