
java语言
Hermione Granger
To be or not to be,that's a question.
展开
-
Java微基准性能测试:数字转字符串方式哪家强?JMH来帮忙
Java中数字转字符串方式哪家强?是它!Java中数字转字符串搞过吧?四种常用的转换方式,究竟用哪种最优呢,本次对Integer.toString(a)String.valueOf(a)a + “”“” + a四种数字转字符串的方式进行性能探究和分析,本文稍长,如有谬论和建议,欢迎指出。测试一波/** * CommonTest * * @author chenyaqiang * @date 2020/8/18 22:59 */public class CommonTest原创 2020-11-02 09:08:06 · 712 阅读 · 3 评论 -
Guava Caches和Guava ListenableFuture学习
1.Guava是什么?Guava是Google的一组核心Java库,其中包括新的集合类型(例如多图和多集),不可变的集合,图形库以及用于并发,I / O,哈希,缓存,原语,字符串等的实用程序!它广泛用于Google的大多数Java项目中,也被许多其他公司广泛使用。它的github地址为: https://github.com/google/guava本次主要参照官方文档,对项目中用到的guava caches和guava listenableFuture进行了学习.2.Guava Caches2原创 2020-07-28 12:39:04 · 694 阅读 · 0 评论 -
ArrayList源码探究
ArrayList源码探究本文全部以源码为根据,探究ArrayList的实现,原创blogs,转载请注明。构造方法ArrayList底层是一个长度可以动态增长的数组默认的构造方法是构建一个初始容量为10的空list用于默认大小的空实例的共享空数组实例。 我们将此与EMPTY_ELEMENTDATA区分开来,以便在添加第一个元素时知道要膨胀多少。上面不是说初始容量为10吗,奇怪了,为什...原创 2019-06-09 20:42:55 · 15042 阅读 · 0 评论 -
HeadFirst设计模式-工厂模式(基于汽车工厂和手机工厂)
工厂模式本次主要讲述三个内容:简单工厂模式工厂方法模式抽象工厂模式依赖倒置原则设计原则:要依赖抽象,不要依赖具体类。不能让高层组件依赖底层组件,而且,不管高层或底层组件,“两者”都应该依赖于抽象。这个原则告诉我们,应该重写代码以便于我们依赖抽象类,而不依赖具体类。指导方针:变量不可以持有具体类的引用。(如果使用new,就会持有具体类的引用。你可以改用工厂类避开这样的做法。...原创 2019-06-13 17:24:21 · 13161 阅读 · 0 评论 -
(一)Netty之整体设计与核心API
Netty是什么?Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。Netty 是一个基于 NIO 的网络编程框架,使用 Netty 可以帮助你快速、简单的开发出一个网络应用,相当于简化和流程化了 NIO 的开发过程。作为当前最流行的 NIO 框架,Netty 在互联网领...原创 2019-05-29 14:50:31 · 15496 阅读 · 1 评论 -
(三)NIO之AIO,对比总结
AIO编程JDK 7 引入了 Asynchronous I/O,即 AIO。在进行 I/O 编程中,常用到两种模式:Reactor和 Proactor。Java 的 NIO 就是 Reactor,当有事件触发时,服务器端得到通知,进行相应的处理。AIO 即 NIO2.0,叫做异步不阻塞的 IO。AIO 引入异步通道的概念,采用了 Proactor 模式,简化了程序编写,一个有效的请求才启...原创 2019-05-28 22:04:12 · 16374 阅读 · 0 评论 -
(二)NIO之网络IO
概述和核心 API前面在进行文件 IO 时用到的 FileChannel 并不支持非阻塞操作,学习 NIO 主要就是进行网络 IO,Java NIO 中的网络通道是非阻塞 IO 的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等等在 Java 中编写 Socket 服务器,通常有以下几种模式:一个客户端连接用一个线程,优点:程序编写简...原创 2019-05-28 21:45:13 · 16627 阅读 · 0 评论 -
(一)NIO编程之NIO与BIO
BIO编程原创 2019-05-28 12:08:30 · 17218 阅读 · 0 评论 -
(六)并发编程之Java中的锁
公平锁和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁类似排队打饭 先来后到非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象两者的区别:公平锁/非公平锁并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁注:...原创 2019-05-27 21:50:28 · 17216 阅读 · 1 评论 -
LinkedList源码探究
ArrayList源码探究本文全部以jdk1.8源码为根据,探究LinkedList的实现。转载请注明出处。LinkedList同时实现了List接口和Deque接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack)。这样看来,LinkedList简直就是个全能冠军。当你需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为J...原创 2019-06-09 21:15:14 · 15102 阅读 · 0 评论 -
HeaFirst设计模式-单件模式[单例模式](Singleton Pattern)
单件模式本次主要介绍的内容有单件模式单线程下的单件模式实现多线程下的单件模式实现的三种方式单件模式:确保一个类只有一个实例,并提供一个全局访问点。...原创 2019-06-14 21:50:18 · 12785 阅读 · 0 评论 -
Java之NIO和零拷贝(Zero Copy)
早就想写一篇关于NIO中的零拷贝的文章,今天逛博客看到一篇写的不错的文章,就转载过来了,相信对零拷贝不太了解的同学看到后会很有收获本文章转自: https://blog.youkuaiyun.com/cringkong/article/details/80274148一.Linux操作系统中的零拷贝1.1先从Linux的普通I/O过程说起1.2内存映射方式I/O1.3内核空间内部传输I/O1.4理...转载 2019-06-20 14:24:23 · 8541 阅读 · 0 评论 -
HashMap源码探究
HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;跟TreeMap不同,该容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open ad...原创 2019-06-17 17:43:41 · 11242 阅读 · 0 评论 -
同步方法和静态同步方法使用的锁的类型
synchronized 修饰方法使用锁是当前this锁。synchronized 修饰静态方法使用锁是当前类的字节码文件。原创 2019-06-17 17:53:17 · 12498 阅读 · 0 评论 -
String中intern()方法
本文参考 https://blog.youkuaiyun.com/believesoul/article/details/79588305 ,我对这篇文章进行了一些小小的整理和修改。这篇文章很好的对intern()方法进行了阐述。最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个String中的intern()方法,它是一个本地方法(由Java语言外的语言编写...原创 2019-06-17 19:48:50 · 11333 阅读 · 0 评论 -
String str =“a“ + “b“ 与 String str = new String(“a“) + new String(“b“) 的区别(jdk1.8环境利用javap命令探究)
今天,又在思考一个常见的问题,那就是字符串创建对象系列。发现了一个很多人都模糊不清的问题,那就是String str =“a” + “b” 与 Strin str = new String(“c”) + new String(“d”) 把对象创建在了哪里?创建了几个字符串对象?话不多出,show my code:String str =“a” + “b”package com.bestqi...原创 2019-06-18 14:27:41 · 14012 阅读 · 6 评论 -
关于Java注解的那点事
最近复习spring的注解开发,本来想自己写一片关于java注解的文章加深记忆,结果发现一篇很优秀的文章 秒懂,Java 注解 (Annotation)你可以这样学仔细读了一下,这篇文章介绍的很不错,就转载来了这处图片引自老罗的博客。为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的。至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明。好了,可以开始今天的博文了。Annotatio...转载 2019-07-09 12:32:26 · 1046 阅读 · 0 评论 -
关于@Autowired注入空指针问题的解决(利用Bean的生命周期)
今天做项目的时候遇到一个问题,需要将线程池的参数抽取到yml文件里进行设置。这不是so easy吗?于是我就写出了下面这样的代码进行抽取import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** ...原创 2019-09-20 00:29:24 · 13532 阅读 · 0 评论 -
(五)并发编程之容器类
java.util.ConcurrentModificationException标题的错误是由于多线程并发争抢修改导致的,在并发编程中使用线程不安全的容器导致的下面晒出导致错误的例子:package com.bestqiang.thread.Collections;import java.util.List;import java.util.UUID;import java.ut...原创 2019-05-27 21:18:22 · 17455 阅读 · 0 评论 -
(四)并发编程之CAS
CAS是什么?CAS ===》 compareAndSet 或者 compareAndSwap ,比较并交换,暂时这样理解,下面会对CAS做具体分析。public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInteger...原创 2019-05-27 20:26:05 · 17165 阅读 · 0 评论 -
(三)并发编程之线程池
为什么要使用线程池,优势是什么?线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果线程超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行.他的主要特点为:线程复用控制最大并发数管理线程.第一:降低资源消耗.通过重复利用自己创建的线程降低线程创建和销毁造成的消耗.第二: 提高响应速度.当任务到达...原创 2019-05-27 16:31:14 · 17808 阅读 · 0 评论 -
静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行。执行顺序优先级:静态块,main(),构造块,构造方法。...原创 2019-03-03 16:01:18 · 16661 阅读 · 0 评论 -
jdk1.8的方法引用类型
方法引用的分类方法引用分为4类,常用的是前两种。方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断。具体分类信息如下:引用静态方法ContainingClass::staticMethodName例子: String::valueOf,对应的Lambda:(s) -> String.valueOf(s)比较容易理解,和静态方法调用相比,只是把....转载 2019-03-07 20:35:21 · 16723 阅读 · 0 评论 -
关于jdbc的介绍以及PreparedStatement和Statement牵涉的sql注入问题解决
1 什么是JDBCJDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。2 JDBC原理早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂...原创 2019-03-08 18:10:31 · 16657 阅读 · 0 评论 -
关于比较器:Comparable与挽救的比较器:Comparator
比较器:Comparable数组实际上会分为普通数组与对象数组两类使用情况,如果是普通数组则可以直接根据数据的大小关系进行排序(调用Arrays.sort()排序)。而对象数组由于其本身存放的都是地址数据,是不可能依据大小关系来实现排序的,但是在Arrays类中依然重载了一个sort()方法(对象数组排序:public static void sort(Object[] a)),此方法可以直...原创 2019-03-10 15:11:57 · 18296 阅读 · 0 评论 -
加载驱动的三个方法
1.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());3.System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);...原创 2019-03-31 14:41:47 · 17736 阅读 · 0 评论 -
剑指offer 1.二维数组中的查找
时间限制:1秒 空间限制:32768K本题知识点: 查找题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法一:传统遍历(较慢,只是能解决问题)public class Solution { public boolean Find...原创 2019-03-31 15:09:20 · 17026 阅读 · 0 评论 -
import static和import的区别
什么是import static?import static 静态导入是JDK1.5中的新特性。一般我们导入一个类都用 import com…ClassName;而静态导入是这样:import static com…ClassName.;这里的多了个static,还有就是类名ClassName后面多了个 . ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方...原创 2019-03-31 21:42:44 · 17215 阅读 · 0 评论 -
深入分析ClassLoader工作机制
深入分析ClassLoader工作机制结合资料,自己的一些理解,分析JVM的类加载器工作机制。1.java类的加载机制1.1 .什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装...原创 2019-04-11 15:57:27 · 17516 阅读 · 0 评论 -
关于在参数中使用"++"语句的坑,参数不改变?
今日在进行传递参数时使用了++语句,发现前面出现了黄色警告,然后就无视了,无奈程序就是执行不对,就回去好好看一下警告内容The value changed at 'index++' is never used less... (Ctrl+F1) Inspection info: This inspection points out the cases where a variable val...原创 2019-04-08 17:40:19 · 19605 阅读 · 0 评论 -
Trie的递归实现和非递归实现
关于Trie: 在计算机科学中,Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。import java.util.TreeMap;/** * @author ...原创 2019-04-08 19:29:58 · 17847 阅读 · 0 评论 -
leetcode 208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWith("app");...原创 2019-04-08 19:41:30 · 17063 阅读 · 0 评论 -
jinfo报错:Error attaching to process
使用jinfo命令查看 RemoteMavenServer(Idea的一个进程) 时报错:Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.101-b13. Target VM is 25.152-b28sun.jvm.hotspot...原创 2019-04-27 20:06:15 · 19345 阅读 · 0 评论 -
GC Roots的对象,以及对java类中的成员变量,局部变量,静态变量和常量的不同回收时机的解析
1.作为GC Roots的对象有以下几种虚拟机栈(栈帧中的局部变量区,也叫局部变量表)中引用的对象。方法区中的类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNI(Native)方法引用的对象。2.成员变量(实例变量)&局部变量&静态变量(类变量)的区别成员变量(实例变量)&局部变量区别:作用域成员变量:针对整个类有效。局部变量:只在...原创 2019-05-06 10:16:36 · 19725 阅读 · 0 评论 -
关于多线程中的虚假唤醒的原因和解决,以及分别用Lock锁和阻塞队列实现消费者生产者案例
虚假唤醒: 有这么一种情况,在一个线程调用wait()进行等待时,被其他线程所唤醒,但是这时同时有另外的线程也被唤醒了,它抢先运行后,使得原来的唤醒条件又不满足了,这时就悲剧了,这个线程就称为被虚假唤醒了。 有人说,它所在的线程是加锁的,唤醒后不是依然不能运行吗,是的,但是它被唤醒了,等到获取锁后,依然会运行。解决: 所以为了避免这种情况,只好用while循环避免虚假唤醒。(因为if只判断一...原创 2019-05-17 15:21:40 · 18353 阅读 · 4 评论 -
(一)并发包中的(计数器)CountDownLatch,(屏障)CyclicBarrier,(计数信号量)Semaphore
(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...原创 2019-05-17 16:14:55 · 17401 阅读 · 0 评论 -
(二)Java中的并发队列和阻塞队列
并发队列在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。阻塞队列与非阻塞队1.阻塞队列阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获...原创 2019-05-17 17:48:33 · 19110 阅读 · 1 评论 -
关于 ? extends T 和 ? super T 的存在意义和使用
问题来源:Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?<? extends T>和<? super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。<? extends T>:是指“上界通配符(Upper Bounds Wildcards)”...原创 2019-03-01 21:04:52 · 35666 阅读 · 17 评论