Java
咚咚锵呀
沃德天.维森陌.拉莫帅.帅得.布耀不耀德
展开
-
java 对象创建过程
一、基本知识一个对象的创建过程包含两个过程:初始化<clinit>和实例化<init>我们在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。实例化时候,java虚拟机就会为其分配内存来存放自己及其从父类继承过来的实例变量。在为这些实例变量分配内存的同时,这些实例变量先会被赋予默认值(零值)。在内存分配完成之后,Java虚拟机才会对原创 2021-05-17 09:29:43 · 247 阅读 · 0 评论 -
java中init()和clinit()方法
<clinit>(初始化):在jvm第一次加载class文件时调用,包括静态变量初始化语句和静态块的执行,在同一个类加载器下,一个类型只会被初始化一次<init>(实例化):在实例创建出来的时候调用,包括调用new操作符;调用Class或java.lang.reflect.Constructor对象的newInstance()方法;调用任何现有对象的clone()方法;通过java.io.ObjectInputStream类的getObject()方法反序列化。(1)<原创 2021-05-15 18:27:58 · 745 阅读 · 0 评论 -
Java四种引用类型
hashmap/list/JUC/springMvc/spring bean生命周期/aop/feign/Hystrix/eureka/循环依赖/mybatis原理/redis/redis过期淘汰策略/持久化策略/数据类型用处/分布式锁/秒杀系统设计/mysql mvcc/mysql 事物原理/mysql索引原理数据结构/mysql锁/mq/分布式事务/线程池/二分查找/二叉树的前中后序遍历...原创 2021-04-29 16:44:18 · 126 阅读 · 1 评论 -
Java对象创建过程以及组成结构
1. 对象的创建 类加载 虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类到符号引用,并检查这个符号引用代表到类是否已经被加载、解析和初始化。如果没有,那必须先执行相应的类加载过程。 分配内存 接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。 内存初始化 内存分配完成后,虚拟机需要将分配到到内存空间都初始化为零值(不包括转载 2021-04-21 09:45:18 · 161 阅读 · 0 评论 -
hashMap1.7和1.8的扩容机制条件
JDK1.7 具体put是否扩容需要两个条件1、 存放新值的时候当前已有元素的个数必须大于等于阈值2、 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)扩容方法是在addEntry方法中void addEntry(int hash, K key, V value, int bucketIndex) { //1、判断当前个数是否大于等于阈值 //2、当前存放是否发生哈希碰撞 //如果上面两个条件否发生,那么就扩容原创 2021-04-11 13:01:59 · 4205 阅读 · 4 评论 -
Java死锁产生的四个条件
死锁的四个条件:1. 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用2. 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占用者主动释放3. 请求和保持,即当资源的请求者在请求其他的资源的同时保持对原有资源的占有4. 循环等待,即存在一个等待队列: P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。当上述四个条件都成立,便形成死锁。import java.util.Date; pub...原创 2021-04-09 17:29:19 · 687 阅读 · 0 评论 -
HashMap 死循环
在多线程环境中,使用HashMap进行put操作时会引起死循环,因为在HashMap本来就不支持多线程使用,要并发就用ConcurrentHashmap。 会导致死循环是在jdk1.7中,由于扩容时的操作是使用头插法,在多线程的环境下可能产生循环链表,由此导致了死循环。在。jdk1.8中改为使用尾插法,避免了该死循环的情况,暂无此问题。在创建了新的数组之后调用transfer方法来完成元素的迁移操作,具体迁移逻辑如下: /** * Transfers all...原创 2020-11-11 20:24:31 · 939 阅读 · 2 评论 -
Java知识点----ThreadLocal杂记
ThreadLocalThreadLocal实际是操作ThreadLocalMap的入口,只有传递参数的作用,并不会直接持有数据,真正存储数据的是其静态内部类ThreadLocalMap,ThreadLocal的属性包括当前线程和要保存的值,ThreadLocal只是提供set/get方法,通过ThreadLocal将Thread赋给ThreadLocalMap的key,想要保存的值赋给ThreadLocalMap的value,所以一个ThreadLocal=一个Thread=一个要保存的值=全局...原创 2020-10-30 15:39:31 · 207 阅读 · 0 评论 -
Oracle 官网登录账号
Oracle 官网下载 JDK需要账号登录方可下载,如果不想麻烦注册一个账号,可以免费借用别人的账户老外记录的一些 oracle 账号,亲测可用,提供给大家避免注册账号的麻烦。http://bugmenot.com/view/oracle.com...原创 2020-08-12 18:31:42 · 1028 阅读 · 0 评论 -
漫谈Java加密技术(一)
这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书。 如基本的单向加密算法: ● BASE64 严格地说,属于编码格式,而非加密算法 ● MD5(Message Digest algorithm 5,信息摘要算法) ● SHA(Secure Hash Algorithm,安全散列算法) ● HMAC(Hash Messag转载 2016-06-12 17:28:45 · 488 阅读 · 0 评论 -
漫谈Java加密技术(二)
接下来我们介绍对称加密算法,最常用的莫过于DES数据加密算法。 DES DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作转载 2016-06-12 17:31:38 · 574 阅读 · 0 评论 -
漫谈Java加密技术(三)
除了DES,我们还知道有DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法——PBE PBE PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂转载 2016-06-12 17:32:52 · 358 阅读 · 0 评论 -
漫谈Java加密技术(四)
RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman.这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。同时支持数转载 2016-06-12 17:34:20 · 672 阅读 · 0 评论 -
谈谈Java加密技术(六)
接下来我们介绍DSA数字签名,非对称加密的另一种实现。 DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签转载 2016-06-12 17:38:00 · 501 阅读 · 0 评论 -
谈谈Java加密技术(七)
ECC ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生。 当我开始整理《Java加密技术(二)》的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官转载 2016-06-12 17:39:23 · 3347 阅读 · 0 评论 -
Java加密技术(九)
在Java加密技术(八)中,我们模拟了一个基于RSA非对称加密网络的安全通信。现在我们深度了解一下现有的安全网络通信——SSL. 我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中生成的自签名证书zlex.cer 这里,我们将证书导入到我们的密钥库。 Shell代码 keytool -import -alias www.zlex.org -file转载 2016-06-12 17:42:04 · 446 阅读 · 0 评论 -
Java加密技术(八)
本篇的主要内容为Java证书体系的实现。 请大家在阅读本篇内容时先阅读 Java加密技术(四),预先了解RSA加密算法。 在构建Java代码实现前,我们需要完成证书的制作。 1.生成keyStroe文件 在命令行下执行以下命令: keytool -genkey -validity 36000 -alias www.zlex.org -keyal转载 2016-06-12 17:43:24 · 417 阅读 · 0 评论 -
Java加密技术(十)
在Java 加密技术(九)中,我们使用自签名证书完成了认证。接下来,我们使用第三方CA签名机构完成证书签名。 这里我们使用thawte提供的测试用21天免费ca证书。 1.要在该网站上注明你的域名,这里使用www.zlex.org作为测试用域名(请勿使用该域名作为你的域名地址,该域名受法律保护!请使用其他非注册域名!)。 2.如果域名有效,你会收到邮件要求你访问htt转载 2016-06-12 17:45:07 · 625 阅读 · 0 评论 -
Java 静态语句块、语句块、构造函数
以下是一道笔试题: Java代码 package com.example; public class Parent { public Parent() { System.out.println("Parent>>>>>>>>>>>1"); } {转载 2016-09-12 15:47:40 · 333 阅读 · 0 评论 -
详细讲解JAVA中的IO流
一、流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可分为两类:输入流原创 2016-09-13 11:28:31 · 4163 阅读 · 2 评论 -
Java关键字new-----对象的内存分配原理
一、关键字new概述 "new"可以说是Java开发者最常用的关键字,我们使用new创建对象,使用new并通过类加载器来实例化任何我们需要的东西,但你是否深入了解过new在编译的瞬间都做了什么? 在Java中使用new关键字创建对象变得很容易了,事实上,对这些事情你是不需要考虑的。需要访问一个文件吗?只需要创建一个新的File实例:new File(“j转载 2016-08-22 12:15:25 · 9127 阅读 · 0 评论 -
Java之IO,BIO,NIO,AIO
对于网络通信而言NIO,AIO并没有改变网通通信的基本步骤,即Socket建立连接需要三次握手serversocket 。只是在其原来的基础上(serverscoket,socket)做了进一步封装和优化。编号 名词 解释 举例 1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服,自己亲自干这件事,别的事干不了。 2 异步 异步是指用户进程触发IO...转载 2017-07-21 12:16:06 · 338 阅读 · 0 评论 -
Java finally语句到底是在return之前还是之后执行?
网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的:(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一转载 2018-01-21 19:34:01 · 242 阅读 · 0 评论 -
转发和重定向引发关于request和response的思考
先是看上去不同,他们的调用分别如下:重定向(redirect)response.sendRedirect("success.jsp");转发(forward):request.getRequestDispatcher("success.jsp").forward(request,response);转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域原创 2018-01-06 14:35:53 · 1466 阅读 · 0 评论 -
JAVA 内存知识点整理
一、java内存模型JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。简单来说,非堆包含方法区、JVM内部处理或优化所需的内(如 JITCompiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法原创 2018-01-06 14:33:38 · 436 阅读 · 0 评论 -
事物的理解
事物的理解a)事物具有原子性,一致性,持久性,隔离性b)原子性:事物中包括的所有操作要么都做,要么都不做,不会介于2者之间。c)一致性:事物执行之前和执行之后都处于一致性状态d)持久性:事物多数据的操作是永久性e)隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。Read uncommitted读未提...原创 2018-01-07 21:15:35 · 671 阅读 · 0 评论 -
String str = new String("abc")内存分配问题(==和equals())
String str1="abc";String str2=new String("abc");有啥区别?Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存原创 2016-09-22 15:05:42 · 1488 阅读 · 0 评论 -
Java异常
首先,java的异常分为Error和Exception。这两类都是接口Throwable的子类。Error及Exception及其子类之间的关系,大致可以用下图简述。注意事项:1。 Error仅在java的虚拟机中发生,用户无需在程序中捕捉或者抛出Error。2。 Exception分为一般的Exception和RuntimeException两类。这里有点让人觉得别扭的是RuntimeExcep...原创 2018-02-26 11:00:57 · 246 阅读 · 0 评论 -
JVM GC杂谈之理论入门
GC杂谈之理论入门JVM堆布局介绍JVM堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor,其中两个Survivor区的大小一致。堆新生代老年代老年代java堆=新生代(Young)+老年代(Old)=老年代(Old)+Eden+FromSurviv...转载 2018-02-08 11:48:24 · 415 阅读 · 0 评论 -
spring data jpa 详解
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现。如果需要了解该框架的入门,百度一下,很多入门的介绍。在这篇文章的接下来一篇,会有一个系列来讲解mybatis,这个系列从mybatis的入门开始,到基本使用,和spring整合,和第...转载 2018-04-11 20:11:22 · 274 阅读 · 0 评论 -
单例模式的七种写法
写在前面:单例模式,是设计模式中最简单的一种,但是,他却有很多的东西需要注意,性能、线程安全等。原文地址:http://cantellow.iteye.com/blog/838473第一种(懒汉,线程不安全):public class Singleton { private static Singleton instance; private Single...转载 2018-08-01 15:41:28 · 241 阅读 · 0 评论 -
关于单例模式的总结
常用的单例模式基本上只有静态内部类和枚举两种形式:枚举public enum SomeThing { INSTANCE; private Resource instance; SomeThing() { instance = new Resource(); } public Resource getInstance() { ...原创 2018-08-01 16:14:10 · 223 阅读 · 0 评论 -
Spring AOP的实现原理
AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对AspectJ和Spring A...转载 2018-08-03 11:12:30 · 188 阅读 · 0 评论 -
记录两个简单的桶排序和冒泡排序
桶排序关于桶排序先做几点说明:1)桶排序是稳定的; 2)桶排序是常见排序算法中最快的一种,大多数情况下比快排和归并排序还要快 3)桶排序非常快但是也非常消耗空间,典型的以空间换时间,基本上是最耗内存的一种排序算法。桶排序中:无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为0-9例如待排数字[6 2 4 1 5 9]准备10个空桶,最大数个空桶 [...原创 2018-08-21 12:01:03 · 217 阅读 · 0 评论 -
线程池的使用简介
项目中涉及到了线程池的使用,最初使用的是Executors的工厂模式向我们提供了4种线程池实现方式,但是阿里的编码规约并不推荐使用,原因是使用Executors创建线程池不会传入这个参数而使用默认值所以我们常常忽略这一参数,而且默认使用的参数会导致资源浪费,不可取。阿里的 Java开发手册,上面有线程池的一个建议:【强制】线程池不允许使用 Executors 去创建,...原创 2018-09-20 10:31:55 · 486 阅读 · 0 评论 -
submit与execute区别
(1)可以接受的任务类型 submit: execute: 可以看出: execute只能接受Runnable类型的任务 submit不管是Ru...转载 2018-10-08 11:08:27 · 22213 阅读 · 1 评论 -
SpringBoot记录一次循环依赖
一、情景:项目中用到了@Async注解,在项目的Application启动类中加上了@EnableAsync注解,等到启动运行服务的时候控制台日志报错:Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled....原创 2018-11-01 11:46:39 · 4186 阅读 · 0 评论 -
Java环境变量Path和ClassPath
1.首先说一下JDK运行原理。一个MyTest.java文件要想被运行,首先要被javac.exe编译生成字节码文件 ----> MyTest.class文件然后JDK中的Java命令运行此MyTest.class文件,java代码就可以被执行。2.为什么要配置Path?平时使用cmd运行JDK中的命令时,只能在JDK的安装目录下运行如 javac和java命令。但是一旦脱离...原创 2019-08-22 16:42:46 · 276 阅读 · 0 评论