java
文章平均质量分 67
sicaujh
这个作者很懒,什么都没留下…
展开
-
Java Map,List,Set,String[]之间的转换
1、Map和Listmap.values转list:Collection<Object> values = resultMap.values(); ArrayList<Object> resultList = new ArrayList(values);2、Map和Setmap转set(主要用于迭代遍历),注意是无序的map.keySet();map.entrySet();set转map就是遍历添加暂无提供简便方法3、List和Set转载 2022-01-18 13:46:14 · 3179 阅读 · 0 评论 -
java中抛出异常后代码继续执行的问题
昨天在工作中遇到一个问题:我需要调公司另外一个模块来获得数据,这个模块返回的是n*n矩阵式的数据,但由于我只需要这个矩阵中的某些数据,所以我在调用代码方法中把需要的数据整理成map并添加到list,然后返回给应用处理方法。在应用处理的代码中,我只对返回的list进行null和size!=0判断,并抛出可能的异常,但我并没有考虑到这个矩阵里面有的格子数据本身是null的情况,也就是说单个map的空指针异常导致了我的应用处理方法里面也会抛出异常,相当于处理模块没法用了,这就导致了刷出来的数据减少了90%。那原创 2022-01-13 13:43:13 · 12880 阅读 · 0 评论 -
优雅判空--Optional.ofNullable()方法
工作中经常会调外部接口、或者查询表等,如果对返回结果不进行空指针判断的话就会导致空指针异常。针对这种情况经常会使用if进行判断,比如示例一这样:示例一:private boolean isNotNull(Object param) { if (param == null) { return false; } else { return true; }}这还仅仅是针对某个对象进行判空操作,如果我们需要对某个对象的某个具体参数使用,使用前需原创 2022-01-06 17:13:45 · 19241 阅读 · 1 评论 -
全面理解java异常机制
在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面介绍java中的异常机制:异常机制的层次结构 异常的处理过程 抛出异常 捕获异常 异常机制的实现细节一、异常机制的层次结构在java程序设计语言中,所有的异常对象都是派生于Throwable类,一般情况下,如果java中内置的异常类不能满足需求,可以自定义异常类只需要继承与Throwable类即可,下面是java 中的异常层次结构:...转载 2022-01-04 17:15:38 · 164 阅读 · 0 评论 -
位运算符汇总整理
1、按位与 &规则:如果两个数相应的二进制都为1,则该位的按位与值为1,否则为0(全1为1)。举例:12&1412的二进制数是1 1 0 014的二进制数是1 1 1 012&14的结果为 1 1 0 0 = 122、按位或 |规则:如果两个数相应的二进制只要有一个为1,则该位的按位与值为1,否则为0(有1为1)。举例:12&1412的二进制数是1 1 0 014的二进制数是1 1 1 012&14的结果为 ...原创 2021-12-06 15:21:30 · 1002 阅读 · 0 评论 -
雪花算法snowflake的原理和实现
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字:第一..转载 2021-04-04 17:09:23 · 710 阅读 · 0 评论 -
Java String源码分析
什么是不可变对象?众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。区分对象和对象的引用对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码: String s = "AB...转载 2021-03-10 09:36:11 · 146 阅读 · 0 评论 -
CopyOnWriteArrayList学习笔记
前言并发包中的并发List只有CopyOnWriteArrayList。CopyOnArrayList是一个线程安全的ArrayList,对其进行修改的操作都是在底层的一个复制的数组上进行的,也就是使用了写时复制策略。CopyOnWriteArrayList源码解析初始化public CopyOnWriteArrayList() { setArray(new Object[0]); }无参构造函数内部创建了一个大小为0的Object数组作为array的初始值。然后看下有参...转载 2021-03-01 14:50:21 · 159 阅读 · 0 评论 -
Java instanceof和getClass区别
在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面从代码中看看区别:public class Test{ public static void testInstanceof(Object x) { System.out.println("x instanceof Parent: "+(x instanceof Parent)); ...转载 2021-02-26 10:33:58 · 156 阅读 · 0 评论 -
Java中Runnable和Thread的区别
在实际工作中,我们很可能习惯性地选择Runnable或Thread之一直接使用,根本没在意二者的区别,但在面试中很多自以为是的菜货面试官会经常而且非常严肃的问出:请你解释下Runnable或Thread的区别?尤其是新手就容易上当,不知如何回答,就胡乱编一通。鄙人今天告诉你们这二者本身就没有本质区别,就是接口和类的区别。问出这个问题的面试官本身就是个二流子!如果非要说区别,请看如下:Runnable的实现方式是实现其接口即可 Thread的实现方式是继承其类 Runnable接口支持多继承,但基本上转载 2021-02-18 21:32:10 · 890 阅读 · 0 评论 -
netty源码分析之writeAndFlush全解析
前言在前面的文章中,我们已经详细阐述了事件和异常传播在netty中的实现,(netty源码分析之pipeline(一),netty源码分析之pipeline(二)),其中有一类事件我们在实际编码中用得最多,那就是 write或者writeAndFlush,也就是我们今天的主要内容主要内容本文分以下几个部分阐述一个java对象最后是如何转变成字节流,写到socket缓冲区中去的pipeline中的标准链表结构 java对象编码过程 write:写队列 flush:刷新写队列 write转载 2021-02-18 15:57:20 · 1000 阅读 · 0 评论 -
Java垃圾收集(GC)详解
1、简介 Java内存运行时区域分为堆(Heap)、方法区、虚拟机栈、本地方法栈和程序计数器,其中虚拟机栈、程序计数器和本地方法栈随线程而生、随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配所少内存基本上在类结构确定下来就是已知的(尽管在运行期会由即时编译器进行一些优化,但是在基于概念模型的讨论里,大体上可以认为是编译期可知的),这几个区域的内存分配和回收都具备确定性,因此对于这几个区域就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就..原创 2021-02-16 21:49:41 · 262 阅读 · 1 评论 -
Netty可靠性设计之Netty心跳机制
1、使用心跳机制的原因 在凌晨等业务低谷期,如果发生网络闪断、连接被Hnag住等网络问题时,由于没有业务消息,应用进程很难发现。等到了白天业务高峰期时,会发生大量的网络通信失败,严重的话还会导致一段时间进程内无法处理业务消息。为了解决这个问题,在网络空闲时采用心跳机制来检测链路的互通性,一旦发现网络故障,立即关闭链路,主动重连。2、设计思路(1)当网络处于空闲状态持续时间达到T(连续周期T没有读写消息)时,客户端只懂发送Ping心跳消息给服务端。(2)如果在下一个周期T到来时客户...原创 2021-02-16 18:09:07 · 446 阅读 · 0 评论 -
Java NIO底层原理
1.1. JavaIO读写原理无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理.转载 2021-02-14 09:40:57 · 271 阅读 · 1 评论 -
JVM之对象的访问定位
在Java虚拟机中,对象类型的数据放在方法区,而对象实例的数据放在java堆中。如果要访问对象,一般有两种方式:一种是使用句柄,另一种是直接指针式地访问对象。一、句柄访问Java堆中会划分出一块内存来作为句柄池,而reference中存储的就是对象的句柄地址,而句柄中分别存放了对象实例数据和对象类型数据各自的地址信息。优点:对象发生变化的时候只需要修改句柄池中的指针而不需要修改reference。缺点:运行速度会受到影响(需要两次指针定位)。二、使用指针(HotSpot采用.原创 2021-02-12 19:37:45 · 160 阅读 · 0 评论 -
IDEA设置头注释,自定义作者author和日期date
步骤File→Settings→Editor→File and Code Templates→Includes→File Header→添加模板使用到的模板如下:/** * @Author: Sicauxjh * @Date: ${DATE} ${TIME} */实际效果:第一次添加上去,用户名会有波浪线的问题,比如:解决方法:将鼠标移到出现波浪线字符的位置,点击More actions或者按快捷键Alt+Enter然后点击Save 'xx..原创 2021-02-10 13:38:36 · 2969 阅读 · 0 评论 -
命令行中使用javap反编译class文件
由于自己在学习Java JVM相关知识的时候需要将java文件反编译成class文件进行性能分析,故将搜索到的方法整理如下:步骤:第一步:运行代码,生成.java文件第二步:在当前路径下打开cmd窗口在当前文件路径下直接输入cmd输入cmd回车第三步:使用javac Math.java将其编译可以看到,新生成了一个class文件第四步:在cmd中输入javap -c Math命令,将其字节码文件进行反汇编。可以看到如下画面:...原创 2021-02-10 11:59:59 · 3560 阅读 · 2 评论 -
JVM内存空间详解&实例分析
1、介绍 Java不需要开发人员来显示分配内存,而是由JVM来自动管理内存的分配和回收(垃圾回收GC),但由此带来的负面影响有可能是在不知不觉中浪费了很多内存或者造成内存泄漏。因此,作为开发人员而言,不能因为JVM自动内存管理机制就不掌握内存分配和回收的知识了。2、内存空间 分析JVM的内存结构,主要是分析JVM运行时数据区,具体划分成5个部分:方法区、堆、虚拟机栈、本地方法栈和程序计数器。2.1 方法区 方法区主要存放了需要加载的类的信息(名称、修饰符等)、...原创 2021-02-10 11:42:45 · 406 阅读 · 0 评论 -
Java中的 BIO,NIO,AIO 总结
BIO,NIO,AIO 总结Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。同步与异步 同步:同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 异步:异步就是发起一个调用后,立刻得到被调..转载 2021-02-08 20:10:03 · 233 阅读 · 1 评论 -
Java中的<< 和 >> 和 >>> 详细分析
<<表示左移移,不分正负数,低位补0; 注:以下数据类型默认为byte-8位左移时不管正负,低位补0正数:r = 20 << 2 20的二进制补码:0001 0100 向左移动两位后:0101 0000 结果:r = 80负数:r = -20 << 2 -20 的二进制原码 :1001 0100 -20 的二进制反码:1110 1011 -20 的二进制补码 :1110 1100 左移两位后的补码:...转载 2021-02-03 21:00:30 · 196 阅读 · 1 评论 -
JVM之类加载机制&双亲委派
1、介绍 类加载机制是指.class文件加载到JVM并形成Class对象的机制,在完成类加载后,应用就可以对Class对象进行实例化并调用。类加载机制可以在运行时动态加载外部的类和通过远程网络下载咋class文件等。除了有动态化的优点之外,JVM的类加载机制还有隔离运行的效果,使应用之间互不干扰。 JVM将类加载的过程划分为三个步骤:装载、链接和初始化。其中,装载和链接是将二进制的字节码转换为Class对象;初始化过程不是加载类时必须触发的,但是最迟必须在初次主动使用对象前执行,其所作的...原创 2021-01-25 22:14:12 · 120 阅读 · 0 评论 -
Java并发编程:线程各种状态之间的转换
BLOCKED,WAITING,TIMED_WAITING的区别请看另外一篇帖子:https://blog.csdn.net/qq_41834553/article/details/1126261661、NEW←→RUNNABLE当调用t.start()方法时,会由NEW→RUNNABLE2、RUNNABLE←→WAITING当调用obj.wait()方法时,t线程会从RUNNABLE→WAITING当调用obj.notify()/obj.notifyall()/t.in...原创 2021-01-14 19:01:00 · 109 阅读 · 0 评论 -
Java并发编程:BLOCKED,WAITING,TIMED_WAITING区别
一、介绍BLOCKED,WAITING和TIMED_WAITING是很重要的线程状态,但是经常对我们造成困扰。如果需要分析线程dump必须要对其有一定的理解。使用生活的例子,本文将每个状态变成了简单的例子。与正式的Java文档定义相比,任何让人费解的概念都可以用简单的例子来理解。如果用真实生活中的例子,就更好理解了。我想分享一些真实生活的例子来帮助理解这些线程状态。二、BLOCKEDJava文档官方定义BLOCKED状态是:“这种状态是指一个阻塞线程在等待monitor锁。”真实生.转载 2021-01-14 18:23:00 · 950 阅读 · 0 评论 -
Java并发编程:浅谈park/unpark机制
park/unpark是LockSurpport类中的方法,其基本使用为://暂停当前线程LockSupport.park();//恢复某个线程的运行/LockSupport.unpark(暂停线程对象);每个线程都有自己的一个parker对象,这个parker对象由_counter,_cond(条件变量),_mutex三部分组成。举个例子:一个线程就像一台小时候路边杂货店门口需要投币的游戏机,不过这台游戏机比较特殊,无论投多少个游戏币进去只算投进去一个,并且没有游戏币后会马上关机原创 2021-01-14 15:07:52 · 1506 阅读 · 0 评论 -
Java并发编程:浅谈wait/notify/notifyall机制
1、使用条件:当前重量级锁的持有线程Thread2发现条件不满足时会调用wait方法,Thread2释放锁并进入WaitSet变为WAITING状态(即线程调用wait/notify/notifyall方法的前提条件是该线程必须持有这个锁)。2、线程在BLOCKED和WAITING状态下都是处于阻塞状态,不会占用CPU时间片。3、当Owner线程释放锁的时候,会调用notify或者notifyall来唤醒WaitList中的线程进入EntryList重新竞争锁,区别在于notify是随机唤醒一个原创 2021-01-14 11:09:38 · 186 阅读 · 0 评论 -
Java并发编程:浅谈偏向锁、轻量级锁、自旋优化、锁膨胀、锁重入机制
一、介绍1、 我们知道,在java中可以通过Synchronized对对象加锁、其原理是通过对对象内部的一个叫做监视器(monitor)的来实现的,但是线程之间的切换是需要操作系统通过从用户态转成核心态来实现的,状态之间的转换需要比较长的时间,这就是为什么synchronized效率比较低的原因。Java从JDK6开始引入了“轻量级锁”和“偏向锁”来减少频繁的锁释放和锁获得所带来的性能上的消耗,所以在jdk6中,锁一共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这些锁会随着...原创 2021-01-13 20:30:41 · 251 阅读 · 0 评论 -
JVM栈、堆、方法区的交互关系
栈、堆、方法区的交互关系public class AppMain { //运行时,JVM把AppMain的信息都放入方法区 public static void main(String[] args) { //main成员方法本身放入方法区。 Sample test1 = new Sample( " 测试1 " ); //test1是引用,所以放到栈区里,Sample是自定义对象应该放到堆里面转载 2020-12-30 18:19:30 · 204 阅读 · 0 评论 -
JVM堆、栈区别
堆和栈是程序运行的关键,区别如下:栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放、放在哪。 在Java中有一个线程就会相应的有一个线程栈与之对应,这点很容易理解。因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈,而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程相关的信息,包括局部变量、程序运行状态、方法返回值等等,而堆只负责存储对象信息。根集合:简单地将就是栈里面的对象引用和堆内转载 2020-12-19 18:10:30 · 650 阅读 · 1 评论 -
ApplicationContext和BeanFactory区别
BeanFactory:是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;ApplicationContext:应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;1) 国际化(MessageSource)2) 访问资源,如URL和文件(ResourceLoader)3) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层 4) 消息发送、..转载 2020-12-18 22:56:55 · 392 阅读 · 2 评论 -
java虚拟机之JVM的内存结构
主要内容如下:JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JVM基本结构图:《深入理解Java虚拟机(第二版)》中的描述是下面这个样子的:Java中的内存分配:Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。具体划分为如下5个内存空间:..转载 2020-12-18 15:31:41 · 93 阅读 · 1 评论 -
JVM、JRE、JDK的区别
简单粗暴的理解JDK包含了JRE,JRE包含了JVM详解JDK: java development kit, java开发工具包,用来开发Java程序的,针对java开发者。 JRE: java runtime environment, java运行时环境,针对java用户 JVM: java virtual machine,java虚拟机 用来解释执行字节码文件(class文件)的。 )JVM 是什么JVM:Java Virtual Machine(Java 虚拟机)JVM是JRE转载 2020-12-18 09:43:14 · 162 阅读 · 0 评论 -
cannot resolve symbol ‘springframework‘解决
原因是没有在pom文件中加入相关依赖。解决办法:进入https://mvnrepository.com/搜索Spring Context,找一个合适的版本然后复制maven框里的语句到pom文件里的依赖标签下然后重新启动idea就可以了。...原创 2020-12-17 23:02:43 · 6397 阅读 · 2 评论 -
Spring中 @Autowired注解与@Resource注解的区别
相同点:@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。不同点:(1)提供方:@Autowired是由org.springframework.beans.factory.annotation.Autowired提供,换句话说就是由Spring提供;@Resource是由javax.annotation.Resource提供,即J2EE提供,需要JDK1.6及以上。(2)注入方式:@Autowired只按照byType 注入;@Resource默认转载 2020-12-17 22:23:23 · 125 阅读 · 0 评论 -
java中类加载机制和类加载器(classloader)详解
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 一、类加载过程1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java...转载 2020-12-17 16:36:56 · 377 阅读 · 0 评论 -
Java当中Integer和int的区别
1、基本关系区分:①int是java中的基本数据类型而Integer则是int的包装类,需要把Integer当做一个类来看。②int可以直接使用而Integer必须实例化后才能使用。比如:int i = 10;Integer i = new Integer(10);③int的默认值为0而Integer的默认值为null。④int和Integer不能互用,因为它们是两种不同的数据类型。⑤当需要往HashMap、ArrayList中存放元素时,因为其容器设定的元素都是Object原创 2020-12-06 22:36:34 · 227 阅读 · 0 评论 -
xml文件基本格式与解析
什么是xml文件格式我们要给对方传输一段数据,数据内容是“too young,too simple,sometimes naive”,要将这段话按照属性拆分为三个数据的话,就是,年龄too young,阅历too simple,结果sometimes naive。我们都知道程序不像人,可以体会字面意思,并自动拆分出数据,因此,我们需要帮助程序做拆分,因此出现了各种各样的数据格式以及拆分方式。比如,可以是这样的数据为“too young,too simple,sometimes naive”然后按照逗号拆转载 2020-12-02 20:44:47 · 6428 阅读 · 0 评论 -
ArrayList简介及其常用的方法
1、简介ArrayList是一个采用类型参数的泛型类,用其来创建的泛型数组列表和java自带的传统数组相比,容量设置更加灵活,插入、删除元素更加方便。2、使用ArrayList创建数组的步骤①、导入包 import java.util.ArrayList;②、创建数组基本格式:ArrayList<数组存储的数据类型(类型参数)> 数组名称 = new ArrayList<>();比如ArrayList<Integer> stuNum...原创 2020-12-02 15:22:01 · 803 阅读 · 0 评论 -
Java中的顶层类修饰问题
对于这个问题,一直没有仔细思考,今天整理一下:对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。如果类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(p转载 2020-12-01 14:41:59 · 643 阅读 · 1 评论 -
java里static、final、和static final的区别
转自:http://blog.csdn.net/qq1623267754/article/details/361907151、final可以修饰:属性,方法,类,局部变量(方法中的变量)Java中,利用关键字final对一个变量赋值的时候,表示这个变量只能被赋值一次,一旦被赋值以后将不能再进行更改。比如:public class Test { public static void main(String[] args) { final int a = 10; while(a &g原创 2020-11-30 22:05:22 · 388 阅读 · 0 评论 -
java中的for-each循环使用
for-each循环是Java中for循环的一种变体,它可以用来依次处理数组中的每个元素而不用指定下标值。其基本使用方法如下:public class Test { public static void main(String[] args) { int[] a = {1,2,3,4,5,6}; for(int element : a) { System.out.println(element); } }}运行结果是换行输出1,2,3,4,5,6其效果等价原创 2020-11-30 22:23:48 · 329 阅读 · 0 评论