![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java学习
文章平均质量分 77
来一粒感康
这个作者很懒,什么都没留下…
展开
-
强大的集合工具类:java.util.Collections中未包含的集合工具
尚未完成: Queues, Tables工具类任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法。Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法。这是Guava最流行和成熟的部分之一。我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下:在找类似转化、过滤的方法?请看第四章,函数式风格。静态工厂方法在JDK 7之前,构造新的范型集合时要讨厌地重复声明范型:List<TypeThatsT.转载 2021-11-25 13:36:45 · 389 阅读 · 0 评论 -
亲缘性线程池,这是什么鬼?
一、前言JDK中的线程池主要解决两个问题: 一方面当执行大量异步任务时候线程池能够提供较好的性能,在不使用线程池的时,每当需要执行异步任务时候是直接 new一线程运行,而线程的创建和销毁是需要开销的。而使用线程池时候,线程池里面的线程是可复用的,不会每次执行异步任务时候都重新创建和销毁线程。 另一方面线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等,每个 ThreadPoolExecutor 也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。 J转载 2021-11-24 15:53:33 · 238 阅读 · 0 评论 -
基于JDK8中Optional写出可读性高的代码
一、前言JDK8中引入了函数式编程,大大提高了我们编写代码的可读性,其中Optional则是为了避免NPE而生,下面我们就来看看它是如何提高代码可读性的。二、Optional 使用假设我们代码里面下面DO对象:static class Wheel { public String getBrand() { return brand; } public void setBrand(String brand) { this....转载 2021-11-24 15:38:30 · 78 阅读 · 0 评论 -
Java中如何避免空指针异常
这个问题对于我来说是一个很常见的问题,这也是由初级程序员成长到中级程序员的时候经常会遇到的问题。程序员不知道或不信任正在使用的约定,并且小心的检查着null。还有当程序员写代码的时候,总是会依赖于通过返回空(NULL)来表明某些意义,因此需要调用者去检查Null。换种方式来说,有两种空指针的检查场景: 期望的结果就是null。 期望的结果不是null。 第二种很简单,可以通过用assert或者允许程序报错,例如抛出NullPointerException。Assertions是一个从Ja转载 2021-11-24 15:32:55 · 103 阅读 · 0 评论 -
Java集合-Collection
Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一。所以不能直接实例化一个Collection,但是可以实例化它的一个子类,你或许经常把这些子类作为一个Collection统一探讨。在这篇文章中,你将看到如何处理。下面是本文的一个主题列表: Collection子类 增加和移除元素 检测一个Collection是否包含一个确定的元素 Collection大小 遍历一个Collection Colle转载 2021-11-24 14:15:50 · 122 阅读 · 0 评论 -
Java集合-List
java.util.List接口是java.util.Collection接口的一个子接口。它表示对象的一个有序列表,意味你可以特定的顺序访问元素,也可以通过索引访问。也可以向一个List中多次添加重复的元素。Java List 视频教程如果你更喜欢看视频而不是文本,下面是一个版本的Java List视频教程。https://youtu.be/d3QbptJRln4List实现作为一个Collection的子类型,Collection接口的所有方法在List接口里也适用。因为Lis..转载 2021-11-24 13:47:29 · 101 阅读 · 0 评论 -
深入剖析ConcurrentHashMap(2)
经过之前的铺垫,现在可以进入正题了。我们关注的操作有:get,put,remove 这3个操作。对于哈希表,Java中采用链表的方式来解决hash冲突的。一个HashMap的数据结构看起来类似下图:实现了同步的HashTable也是这样的结构,它的同步使用锁来保证的,并且所有同步操作使用的是同一个锁对象。这样若有n个线程同时在get时,这n个线程要串行的等待来获取锁。ConcurrentHashMap中对这个数据结构,针对并发稍微做了一点调整。它把区间按照并发级别(concurrent转载 2021-11-24 13:09:06 · 167 阅读 · 0 评论 -
深入剖析ConcurrentHashMap(1)
ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable。对于ConcurrentHashMap是如何提高其效率的,可能大多人只是知道它使用了多个锁代替HashTable中的单个锁,也就是锁分离技术(Lock Stripping)。实际上,ConcurrentHashMap对提高并发方面的优化,还有一些其它的技巧在里面(比如你是否知道在get操作的时候,它是否也使用了锁来保护?)。我会试图用通俗一点的方法讲解一下 ConcurrentHashMap转载 2021-11-24 12:52:46 · 117 阅读 · 0 评论 -
(译文)Java中使用var声明局部变量指南
简介Java SE 10引入了局部变量的类型推断。早先,所有的局部变量声明都要在左侧声明明确类型。 使用类型推断,一些显式类型可以替换为具有初始化值的局部变量保留类型var,这种作为局部变量类型 的var类型,是从初始化值的类型中推断出来的。关于此功能存在一定的争议。有些人对它的简洁性表示欢迎,其他人则担心它剥夺了阅读者看重的类型信息 ,从而损害了代码的可读性。这两边观点都是对的。它可以通过消除冗余信息使代码更具有可读性,也可以 通过删除有用的信息来降低代码的可读性。另外一个观点是担心它会被滥用转载 2021-11-23 14:20:03 · 469 阅读 · 0 评论 -
Java Date Time 教程-java.util.Calendar和GregorianCalendar
目录 实例化GregorianCalendar 获取年、月、日等 增加和减少年、月、日等 陷阱和误区 月份的陷阱 星期几的误区 JavaDoc中的更多细节 Java的java.util.Calendar用于日期和时间的运算。无论任何时候,只要你有一些轻微操作(除了仅仅表示日期和时间)需要执行,那么就使用这个类。(原文:Whenever you have something slightly more advanced than just转载 2021-11-22 15:13:17 · 195 阅读 · 0 评论 -
Java Date Time 教程-java.sql.Date
Java的java.sql.Date类在JDBC API中被使用。如果你需要在java.sql.PreparedStatement上设置日期或者从java.sql.ResultSet获取日期,你将会和java.sql.Date打交道。实际上,java.sql.Date继承于java.util.Date,所以你可以用java.util.Date做的任何事同样适用于java.sql.Date。查阅java.util.Date了解更多的信息。下面是一个如何实例化java.sql.Date的例子:lo..转载 2021-11-22 15:01:50 · 331 阅读 · 0 评论 -
Java Date Time 教程-时间测量
在Java中,用System.currentTimeMillis()来测量时间最方便。你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差。下面是一个例子:long startTime = System.currentTimeMillis();callOperationToTime();long endTime = System.currentTimeMillis();long totalTime = endTime - startTime;现在变.转载 2021-11-22 14:54:09 · 302 阅读 · 0 评论 -
Java Date Time 教程-java.util.Date
Java的java.util.Date类是Java最初的时间类之一。今天该类的大部分方法已不推荐使用,取而代之的是java.util.Calendar类。不过你仍然可以使用java.util.Date类去表示某个时间。下面是一个如何实例化java.util.Date的例子:java.util.Date date = new java.util.Date();Date实例包含了当前时间作为它的日期和时间。你可以通过getTime()方法访问java.util.Date实例的日期和时间,比如像这样:转载 2021-11-22 14:10:25 · 309 阅读 · 0 评论 -
Java IO: 异常处理
流与Reader和Writer在结束使用的时候,需要正确地关闭它们。通过调用close()方法可以达到这一点。不过这需要一些思考。请看下边的代码:InputStream input = new FileInputStream("c:\\data\\input-text.txt");int data = input.read();while(data != -1) { //do something with data... doSomethingWithData(data);转载 2021-11-22 13:43:34 · 136 阅读 · 0 评论 -
JVM优化之循环展开
在JVM内部实现系列的前几篇文章中,我们已经看到了Java的HotSpot虚拟机的just-in-time (JIT)编译技术,包括逃逸分析和锁消除。本文我们将要讨论另一种自动优化,叫作循环展开。JIT编译器使用这项技术来让循环(比如Java的for或者while循环)执行得更加高效。由于我们要对JVM的内部机制进行深入分析,所以你会时不时看到用于讲解介绍的各种C的代码甚至是汇编语言,扶稳了!我们先从下面这段C代码开始,它会去分配100万个long类型的空间,然后用100万个随机的long值来填转载 2021-11-21 15:03:36 · 356 阅读 · 0 评论 -
Java设计模式:观察者
简单来说,观察者模式=发布者+订阅者。下面是一个有关猎头的典型的例子。在下面这张图当中有两个角色:猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,猎头就会把这个信息通知给曾经向他订阅过的人。Java代码Subject接口://java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!public interface Subject { public void registerObse.转载 2021-11-21 14:30:24 · 183 阅读 · 0 评论 -
Java IO: 字节和字符数组
Java中的字节和字符数组,经常被用于临时存储应用程序内部的数据,所以数组也是常见的数据来源以及数据流目的地。如果你在程序执行过程中需要频繁访问文件的内容,你可能会愿意将文件加载到数组中去。当然你可以通过索引直接访问这些数组。但是如果你有一个组件的设计初衷是从InputStream或者Reader而非数组中读取某些数据呢?通过InputStream或者Reader读取数组为了让你的组件能够从数组中读取数据,你需要把字节或者字符数组包装到一个ByteArrayInputStream或者CharAr转载 2021-11-21 14:15:18 · 170 阅读 · 0 评论 -
Java IO 之 OutputStream源码
一、前言上一篇《Java IO 之 InputStream源码》,说了InputStream。JDK1.0中就有了这传统的IO字节流,也就是 InputStream 和 OutputStream。梳理下两者的核心:InputStream中有几个 read() 方法和 OutputStream中有几个 write() 方法。它们是一一对应的,而核心的是read()和write()方法。它们都没实现,所有本质调用是各自实现类实现的该两个方法。read() 和 write() ,对应着系统的Inpu转载 2021-11-21 13:09:51 · 143 阅读 · 0 评论 -
Java锁是如何保证数据可见性的
All Lock implementations must enforce thesame memory synchronization semantics as provided by the built-in monitor lock: A successful lock operation acts like a successful monitorEnter action A successful unlock operation acts like a successful ...转载 2021-11-20 18:37:51 · 971 阅读 · 1 评论 -
Java IO 之 InputStream源码
一、InputStreamInputStream是一个抽象类,即表示所有字节输入流实现类的基类。它的作用就是抽象地表示所有从不同数据源产生输入的类,例如常见的FileInputStream、FilterInputStream等。那些数据源呢?比如:1) 字节数组(不代表String类,但可以转换)2) String对象3) 文件4) 一个其他种类的流组成的序列化 (在分布式系统中常见)5) 管道(多线程环境中的数据源)等等二者,注意它是属于字节流部分,而不是字符流(jav转载 2021-11-20 18:16:30 · 204 阅读 · 0 评论 -
Java秘术:用枚举构建一个状态机
综述Java中的enum比其他的语言中的都强大,这产生了很多令人惊讶的用法。本文中,我将列出Java中的enum的一些特性,然后将这些特性应用到一起构成一个状态机。Enum的单例和工具类用法你可以非常简单地用一个enum构建一个单例或者工具类。//java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!</pre>enum Singleton { INSTANCE;}enum Utility { ; // no转载 2021-11-20 10:45:44 · 255 阅读 · 0 评论 -
什么是 Java 构造器?
构造器是编程的强大组件。使用它们来释放 Java 的全部潜力。-- Seth Kenlon(作者)在开源、跨平台编程领域,Java 无疑(?)是无可争议的重量级语言。尽管有许多伟大的跨平台框架,但很少有像Java那样统一和直接的。当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例。Java 中与构造器( constructor)有关的最常见问题之一是:它们是什么,它们的作用是什么?简而言之:构造器是在 Java 中创建新对象(object)时执行的操作。当 Java ...转载 2021-11-20 10:30:10 · 683 阅读 · 0 评论 -
如何阅读Java源码?
阅读Java源码的前提条件:1、技术基础在阅读源码之前,我们要有一定程度的技术基础的支持。假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃《Core Java》,那样是很难有收获的,尤其是《深入Java虚拟机》这类书,或许别人觉得好,但是未必适合现在的你。比如设计模式,许多Java源码当中都会涉及到。再比如阅读Spring源码的时候,势必要先对IOC,AOP,Java动态代理等知识点有所了解。2、强烈的求知欲强烈的求知欲是阅读源码的核心动力!大多数程序员的学习态度转载 2021-11-20 10:17:43 · 248 阅读 · 0 评论 -
工厂模式-创建型模式
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。结构图:YML-示例图示例://java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!public interface Factory { public Product factoryMethod();}public class ConcreteFacto转载 2021-11-19 15:05:47 · 50 阅读 · 0 评论 -
面向GC的Java编程
Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。这话其实也没有太大问题,的确,大部分场景下关心内存、GC的问题,显得有点“杞人忧天”了,高老爷说过:过早优化是万恶之源。但另一方面,什么才是“过早优化”?If we c转载 2021-11-19 14:46:42 · 167 阅读 · 0 评论 -
Java那些不为人知的特殊方法
如果你用过反射并且执行过getDeclaredMethods方法的话,你可能会感到很吃惊。你会发现出现了很多源代码里没有的方法。如果你看一下这些方法的修饰符的话,可能会发现里面有些方法是volatile的。顺便说一句,如果在Java面试里问到“什么是volatile方法?”,你可能会吓出一身冷汗。正确的答案是没有volatile方法。但同时,getDeclaredMethods()或者getMethods()返回的这些方法,Modifier.isVolatile(method.getModifiers())转载 2021-11-19 14:17:03 · 108 阅读 · 0 评论 -
我用起来顺手的数据库设计工具,这次推荐给大家
摘要好的数据库设计工具,可以帮助我们进行思考并提高我们的设计效率。以前一直使用的是PowerDesigner,最近发现Navicat的数据库设计功能也很不错,界面简洁且容易使用,特此推荐给大家。NavicatNavicat是一套快速、可靠的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。注意:本教程采用的时Navicat1转载 2021-11-19 13:46:17 · 1353 阅读 · 0 评论 -
分享Java中经常出现的问题
Java中经常出现的问题,Java流行了很多年,相信学习Java的小伙伴有很多很多,今天小编总结了关于Java异常的及几大问题,希望对你有所帮助。1、检查与未检查简而言之,检查过的异常必须显式地在方法中捕获或在方法的throw子句中声明。 未检查异常是由无法解决的问题引起的,例如除以零、空指针等。检查异常特别重要,因为您希望使用您的API的其他开发人员知道如何处理异常。2、异常管理的最佳实践 如果一个异常可以被正确处...转载 2021-11-19 13:24:51 · 118 阅读 · 0 评论 -
几点Java程序必须满足的基本规则
简介:Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。1 Java程序的组织形式Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。上.转载 2021-11-19 12:51:51 · 262 阅读 · 0 评论 -
JAVA后端实习生刚进入公司一般会安排做什么?
新人进公司首先给你配置个人有邮箱和ip,clone代码让你熟悉大概有一周左右。再在此之间,可能会有你的同事或者组长来给你大致讲一下项目的模块,架构,数据库,有的 公司让你看,不懂的让你去问他。针对于刚毕业的,还没有相关经验的可能会有所不同,你能力好的话可能过两天直接给你安排一些小需求进行做了,边做边熟悉,毕竟我经经常对于我招过来的小弟因能力的不同进行分工。根据各个公司的项目情况不同,做的工作也不太一样。不同的公司有自己的文化和特色,大公司和小公司也会不同,一般正常的公司有一些的入职流程熟悉公转载 2021-11-18 15:34:25 · 755 阅读 · 0 评论 -
JVM内部原理
这篇文章详细描述了Java虚拟机的内在结构。下面这张图来自《The Java Virtual Machine Specification Java SE 7 Edition》,它展示了一个典型的JVM的主要的内部结构。java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!接下来的2个部分,将详细介绍这幅图中所有组成结构。 第一部分涵盖了每个线程都会生成的结构, 第二部分 涵盖了单独的每个线程生成的结构。 线程 JVM 系统线程.转载 2021-11-18 15:13:31 · 120 阅读 · 0 评论 -
Java字节码浅析(三)
从Java7开始,switch语句增加了对String类型的支持。不过字节码中的switch指令还是只支持int类型,并没有增加对其它类型的支持。事实上switch语句对String的支持是分成两个步骤来完成的。首先,将每个case语句里的值的hashCode和操作数栈顶的值(译注:也就是switch里面的那个值,这个值会先压入栈顶)进行比较。这个可以通过lookupswitch或者是tableswitch指令来完成。结果会路由到某个分支上,然后调用String.equlals来判断是否确实匹配。最后根据e转载 2021-11-18 14:33:15 · 86 阅读 · 0 评论 -
《Java字节码浅析(二)》
条件语句像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字节码来实现的。循环语句包括for循环,while循环,它们的实现方式也很类似,但有一点不同,它们通常都会包含一条goto指令,以便字节码实现循环执行。do-while循环不需要goto指令,因为它的条件分支是在字节码的末尾。更多细节请参考循环语句一节。有一些指令可以用来比较两个整型或者两个引用,然后执行某个分支,这些操作都能在单条指令里面完成。而像double,floa转载 2021-11-18 13:51:00 · 93 阅读 · 0 评论 -
Java字节码浅析(—)
明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么。理解这点不仅能搞清语言特性是如何实现的,并且在做方案讨论的时候能清楚相应的副作用及权衡利弊。本文介绍了Java代码是如何编译成字节码并在JVM上执行的。想了解JVM的内部结构以及字节码运行时用到的各个内存区域,可以看下我前面的一篇关于JVM内部细节的文章。本文分为三部分,每一部分都分成几个小节。每个小节都可以单独阅读,不过由于一些概念是逐步建立起来的,如果你依次阅读完所有章节会更简单一些。每一节转载 2021-11-18 13:16:52 · 92 阅读 · 0 评论 -
通过JVM日志来进行安全点分析
许多事件都可能会导致JVM暂停所有的应用线程。这类暂停又被称为”stop-the-world”(STW)暂停。触发STW暂停最常见的原因就是垃圾回收了(github中的一个例子),但不同的JIT活动(例子),偏向锁擦除(例子),特定的JVMTI操作,以及许多场景也可能会导致应用程序暂停。应用程序线程可以被安全地停止掉的那个时间点,就叫做安全点。这一术语也通常用来指代SWT暂停。通常来讲GC日志都是打开的。然而,并非所有安全点的信息都能完整地记录下来。想获取到完整的日志,可以使用下列的JVM选项:转载 2021-11-18 12:38:23 · 335 阅读 · 0 评论 -
关于Java中流式编程与ForkJoinPool的一点事
一、前言最近在看项目代码时候,发现有一段奇怪的代码,细看完全多余,然后这其中却隐藏着一个不为人知的关于 ForkJoinPool 的秘密…二、流式编程基础如下代码我们首先创建了一个list,然后从list上获取流对象,并使用foreach进行遍历:运行上面代码,输出为://java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!main 0 main 1 main 2 main 3 main 4 ...上面打印元素..转载 2021-11-17 20:09:19 · 173 阅读 · 0 评论 -
Java中使用Math.abs你入坑了?
一、前言Math.abs函数是jdk中提供的一个用来返回入参绝对值的函数,也就是你输入一个负数,它会返回其对应绝对值正数,这个在大部分情况下是这样,但是特殊情况下,还是会返回负数,为何那?且往下看。java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!二、场景介绍在数据库中当数据量比较大时,我们会把一个表分为多个分表,或者把一个库分为多个库,那么分表按照什么来分那?这里就有一个分表键的概念,比如用户信息表,可以按照用户id作为分表键,比如消...转载 2021-11-17 19:56:16 · 181 阅读 · 0 评论 -
记一次多线程代码优化
一、前言并发运行相比串行执行很好,因为其可以减少执行时间,但是并发用的不对,也会造成资源浪费,本文我们就来探究一例子。二、案例介绍与优化有这样一段代码,根据传递的url列表,并发的去下载url对于的文件内容,原来代码模拟如下://java学习交流:737251827 进入可领取学习资源及对十年开发经验大佬提问,免费解答!private final static ThreadPoolExecutor EXECUTOR_SERVICE = new ThreadPoolExecutor(.转载 2021-11-17 19:48:02 · 59 阅读 · 0 评论 -
Java踩坑记系列之线程池
线程池大家都很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装,比如tomcat的线程池,当然也有单独开发的,但都会牵涉到这几个核心参数的设置:核心线程数,等待队列,最大线程数,拒绝策略等。先说下我们项目组在使用线程池时踩到的坑: 线程池的参数设置一定要结合具体的业务场景,区分I/O密集和CPU密集,如果是I/O密集型业务,核心线程数,workQueue等待队列,最大线程数等参数设置不合理不仅不能发挥线程池的作用,反而会影响现转载 2021-11-17 19:04:53 · 540 阅读 · 0 评论 -
线程池ForkJoinPool简介
ForkJoinPool线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式(worksteal)提高整体的执行效率,充分利用CPU资源。一. 应用场景ForkJoinPool使用分治算法,用相对少的线程处理大量的任务,将一个大任务一拆为二,以此类推,每个子任务再拆分一半,直到达到最细颗粒度为止,即设置的阈值停止拆分,然后从最底层的任务开始计算,往上一层一层合并结果,简单的流程如下图:从图中可以看出ForkJoinPool要先执行完子转载 2021-11-17 19:08:34 · 669 阅读 · 0 评论