
java
文章平均质量分 65
向上攀爬的程序员
量变引起质变,个人微信:T_Stone11
展开
-
深入JVM系列-类加载原理
看完这系列文章能对JVM有一个全新而全面的认识!(文章来源于我的公众号:Java技术泛)首先介绍的是类的生命周期,类的生命周期主要分为以下几个阶段,如下图所示:类加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存中创建一个java.lang.Class对象(JVM规范中并未说明class对象位于哪里,HotSpot虚拟机将其放在了方法区中)用来封装类在方法区内的数据结构。类连接...原创 2021-03-19 01:22:43 · 497 阅读 · 1 评论 -
Spring IOC初始化流程
文章目录1、Spring IOC初始化整体流程1.1 Spring IOC的容器体系介绍1.2 编写测试代码1.3 初始化整体流程源码剖析1.4 初始化整体流程与时序图2、Spring BeanFactory创建流程2.1 BeanFactory创建与BeanDefinition加载流程源码2.2 BeanFactory创建与BeanDefinition加载注册时序图2.3 BeanDefinition加载及注册源码剖析2.4 BeanDefinition加载于注册时序图1、Spring IOC初始化整体原创 2021-03-02 12:52:35 · 648 阅读 · 0 评论 -
Spring循环依赖源码剖析
文章目录Spring循环依赖主要流程Spring循环依赖核心源码Spring循环依赖时序图Spring循环依赖主要流程 上篇文章中介绍了Spring初始化的整体流程,本篇文章主要是对初始化过程中finishBeanFactoryInitialization这个方法进行剖析,该方法主要是初始化所有非懒加载的单例Bean,创建Bean对象,完成属性填充,调用init-method进行初始化,然后调用后置处理器处理Bean,解决循环依赖就发生在这个过程中。大体流程原创 2021-03-02 12:48:15 · 193 阅读 · 0 评论 -
深入JVM原理系列(一)
上周分享了一篇关于RocketMQ的文章,有很多的不足,很多小伙伴说少了一些图和代码,然后还有小伙伴建议我贴一些应用层面的,跟框架整合的代码。后来想了想,代码的话GitHub上面太多Demo了,就不在此分享啦,加上最近一直在研究学习JVM这块的内容,因此准备分享一个JVM的系列性的文章,让之前没怎么研究JVM的或者没有过深入了解JVM的同学,看完这系列文章能对JVM有一个全新的认识,结合上...原创 2019-11-27 15:55:55 · 349 阅读 · 4 评论 -
RocketMQ组件及原理深度剖析详解
RocketMQ于2017年9月成为Apache基金会的顶级项目。有着支撑亿级消息量的能力,可以为复杂的业务场景提供系统解耦、削峰填谷、以及低延迟、高吞吐的能力,下面将详细介绍RockeMQ的核心组件和功能,以及细节。RocketMQ应用场景及作用? 应用解耦:用户调用订单系统创建订单后,分别调用库存系统、支付系统、物流系统,使用解耦之后,支付系统、库存系统、物流系统...原创 2019-11-25 15:41:45 · 1212 阅读 · 0 评论 -
Thinking in java 之:静态数据的初始化及初始化顺序
无论创建了多少个对象,静态数据都只占用一份存储区域,static关键字不能应用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值,如果它是一个对象引用,那么它的默认初始化值就是null。实例:public class StaticInitialization { static Bowl b11 = new Bowl(11原创 2015-09-06 10:40:54 · 480 阅读 · 0 评论 -
Java 多线程之信号量 Semaphore
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release原创 2016-04-27 14:54:20 · 717 阅读 · 0 评论 -
关于java的n=n++问题
public class Test2 { public static void main(String[] args) { int n = 0; for(int i = 0; i<3; i++){ n = n++; System.out.println(n); } System.out.println(n); }}输出结果为:0000原因原创 2016-04-14 14:56:22 · 2663 阅读 · 7 评论 -
静态内部类
1.非静态内部类是附属在外部类对象上的,需要先实例化一个外部类的对象,通过外部类对象才能实例化非静态内部类;而静态内部类可以看做是直接附属在外部类上的,这个静态代表附属体是外部类,而不是外部类实例。public class outClass { public static class innerClass{ public innerClass(){原创 2016-03-23 09:48:57 · 386 阅读 · 0 评论 -
数据库连接学习(二)——Tomcat下使用C3P0配置JNDI数据源
一、C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包。二、使用C3P0配置JNDI数据源 Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池,Tomcat6.x使用DBCP连接池配置J转载 2016-03-03 11:51:03 · 539 阅读 · 0 评论 -
继承中的this的含义及通过反射获取泛型参数
在继承中,如果A类继承了B类,super对应B类,this对应A类。package cn.test;import java.lang.reflect.ParameterizedType;public class Animal { Class clazz=null; public Animal() { //这里的this.getClass()实际上得到的是子类中的new的类对原创 2015-12-25 11:16:44 · 1017 阅读 · 0 评论 -
finally,final,finalize区别详解(上)
final修饰符用于声明属性方法和类:1)用final修饰的类不能被继承。2)用final修饰的方法不能被子类的方法覆盖。3)private类型的方法都默认为final方法,因而不能被子类的方法覆盖。4)final变量必须被显式初始化,而且只能被赋一次值。 以下修饰符连用是无意义的,会导致编译错误:abstract与private、abstract与final、abstra原创 2015-08-23 22:53:00 · 611 阅读 · 0 评论 -
Thinking in java 之:内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类。普通内部类:public class InnerDemo { private Object[] item = { 2, 12, 3 }; public void print() { System.out.println("aaaa"); } public static void main(String[] args)原创 2015-09-07 09:30:56 · 308 阅读 · 0 评论 -
详解super关键字
在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下: 当你new一个子类对象的时候,必须首先要new一个父类的对象出来,这个父类对象位于子类对象的内部,所以说,子类对象比父类对象大,子类对象里面包含了一个父类的对象,这是内存中真实的情况.构造方法是new一个对象的时候,必须要调的方法,原创 2015-08-27 11:30:15 · 507 阅读 · 0 评论 -
finally,final,finalize区别详解(下)
在finally,final,finalize区别详解(上)中有这样一句话:return 语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果 return 的是引用类型的,改动将可以起效果。下面对这句话用几个例子进行说明:例1:public class Demo { int b; public int test()原创 2015-08-25 11:49:14 · 358 阅读 · 0 评论 -
Thinking in java 之:this关键字
this关键字:this关键字只能在方法内部使用,指“调用方法的那个对象”的引用,this的用法和其他对象引用并无不同,但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。例如:public class Dog { public void eat(){ drink(); } public void drink(){ }}在eat()内部原创 2015-08-23 11:34:29 · 409 阅读 · 0 评论 -
Thinking in java 之'对象的存储位置'
从今天开始,决定详细的读一遍thinking in java这本书,之前有看过,不过都是需要哪看到哪,现在工作之余,想细品这本书,从头到尾细看一遍,用博客来记录点点滴滴,对自己的基础进行巩固和加强。对象的存储:1.寄存器:最快的存储区,他位于不同其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器根据需求进行分配,你不能直接控制,也不能再程序中感觉到寄存器存在的任何迹象。原创 2015-08-21 08:50:11 · 497 阅读 · 0 评论 -
构造器是静态方法吗?
在thinking in java中,第96页提到,“即使没有显示地使用static关键字,构造器实际上也是静态方法“,对此我产生了疑惑,于是找相关资料进行确认,在一篇大神的博客中得到了答案,那就是构造器不是静态方法。主要是以下几点原因:Java虚拟机规范第二版中定义了四种不同的字节码指令来处理Java程序中不同种类的方法的调用:· invokestatic - 用于调用类(静态)方法转载 2015-08-26 17:32:34 · 20655 阅读 · 7 评论 -
Thinking in java 之'数据初始化'
若类的某个成员是基本数据类型,即使没有进行初始化,java也会确保它获得一个默认值如下面所示:boolean:falsechar: '\u0000'(null)byte: 0short: 0int: 0long: 0Lfloat: 0.0fdouble: 0.0d当变量作为类的成员使用时,java才确保给定其默认值,以确保那些是基本类原创 2015-08-21 20:56:06 · 421 阅读 · 0 评论 -
HashMap和TreeMap的区别
HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,key的hash值是先计算key的hashcode值,然后再进行计算,每次容量扩容会重新计算所以key的hash值,会消耗资源,要求key必须重写equals和hashcode方法。注意:HashMap中是通过比较hashC原创 2015-08-20 10:25:08 · 677 阅读 · 0 评论 -
java中的移位运算符:<<,>>,>>>
java中有三种移位运算符>> : 右移运算符,num >> 1,相当于num除以2,将二进制数向右移,左边补零>>> : 无符号右移,忽略符号位,空位都以0补齐下面来看看这些移位运算都是怎样使用的:public class Test { public static void main(String[] args)转载 2015-08-21 21:22:51 · 737 阅读 · 0 评论 -
用反射机制实现对数据库数据的增、查例子
基本原理;保存数据时,把需要保存的对象的属性值全部取出来再拼凑sql语句 查询时,将查询到的数据全部包装成一个java对象。 先定规则: 1)数据库的每一个表对象一个实体类,表中的每一个字段对应实体类的中的一个属性。 并且实体类的名字和表的名字相同,属性名和字段名相同,大小写没有关系原创 2015-08-20 09:02:40 · 658 阅读 · 0 评论 -
反射的详解与使用
Java反射机制:一、什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。 二、反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念, 静态编译:在编译时确定类型,绑定对象,原创 2015-08-19 15:56:29 · 430 阅读 · 0 评论 -
Thinking in java 之:容器介绍
Set和存储顺序:Set:存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。HashSet *:为快速查找而设计的Set。存入HashSet的元素必须定义hashCode()TreeSet:保持次序的Set,原创 2015-09-10 10:54:07 · 299 阅读 · 0 评论 -
Thinking in java:多线程详解
一.线程的创建和启动java虚拟机的主线程,它从启动类的main()方法开始运行,此外,用户还可以创建自己的线程,它将和主线程并发运行。创建线程的两种方式:1.继承java.lang.Thread类2.实现Runnable接口Thread类代表线程类,它的最主要的两个方法是:run()——包含线程运行时所执行的代码,start()——用于启动线程。原创 2015-09-23 16:48:15 · 336 阅读 · 0 评论 -
Thinking in java 之:迭代器Iterator
迭代器(也是一种设计模式)是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外迭代器通常被称为轻量级对象:创建它的代价小。因此,经常可以见到迭代器有些奇怪的限制,例如:Java的Iterator只能单向移动,这个Iterator只能用来:1.使用方法Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。原创 2015-09-08 10:41:39 · 482 阅读 · 0 评论 -
Thinking in java 之:内部类的继承
因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密的”引用必须被初始化。class InnerOut { class Inner { public void print() { System.out.println("Inner"); } }}public class InheritIn原创 2015-09-07 13:14:34 · 492 阅读 · 0 评论 -
Thinking in java 之:可变参数列表
有了可变参数,就再也不用显示地编写数组语法了,当你指定参数时,编译器实际上会自动为你去填充数组,你获取的仍是一个数组,这就是为什么print()可以使用foreach来迭代该数组的原因,但是,当你传递的参数已经是一个数组的时候,编译器发现你已经是一个数组了,便不会为你做任何的转换操作,所以,如果你有一组事物,可以把它们当做列表传递,而如果你已经有了一个数组,该方法可以把它们当做可变参数列表来接受。原创 2015-09-06 10:26:02 · 833 阅读 · 0 评论 -
Thinking in java 之:构造器
默认构造器:默认构造器(又名“无参”构造器)是没有形式参数的——它的作用是创建“默认对象”,如果你写的类中没有构造器,则编译器会自动帮你创建一个默认构造器,例如:public class Dog { public static void main(String[] args) { Dog dog=new Dog(); }} 如果已经定义了一个构造器(无论是否有参数),编译原创 2015-08-23 11:31:25 · 557 阅读 · 0 评论