1.反射的概念反射机制指的是,程序在运行时能够获取自身的信息。在java中只要给定类的名字,就能够获取类的所有属性和方法。反射是Java中很多高级特性的基础,比如注解、动态代理以及SpringIoc、AOP等技术都需要借助反射来实现。2.Class对象的创建java中java.lang.Class是反射机制的基础,当我们想要在运行期获取一个类中的相关信息的时候,必须先获取其Class类。Jvm会自动将已加载类的Class对像载入。获取Class对象的三种方式:对象实例.getClass()MyObjectobj=newMyObject();Classclazz=obj.getClass();类
如何工作在某些Java虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就向前移动一格。这意味着对象存储空间的分配速度特别快。Java的"堆指针"只是简单地移动到尚未分配的区域,所以它的效率与C++在栈上分配空间的效率相当垃圾回收器工作时,一边回收内存,一边使堆中的对象紧凑排列,这样堆指针就可以更容易的移动到空闲区域的位置上垃圾收集器在分配存储空间的同时会将对象重新排列,由此实现一个高速的、有无限空闲空间的堆模型。对象可能不被垃圾回收垃圾回收不等于析构垃圾回收只与内存有关无论是“垃圾回收”还是“终结”,都不一定保证会发生;如果java虚拟机(JVM)并未面临内存耗尽的情况,它可
如何工作在某些Java虚拟机中,堆的实现截然不同:它更像一个传送带,每分配一个新对象,它就向前移动一格。这意味着对象存储空间的分配速度特别快。Java的"堆指针"只是简单地移动到尚未分配的区域,所以它的效率与C++在栈上分配空间的效率相当垃圾回收器工作时,一边回收内存,一边使堆中的对象紧凑排列,这样堆指针就可以更容易的移动到空闲区域的位置上垃圾收集器在分配存储空间的同时会将对象重新排列,由此实现一个高速的、有无限空闲空间的堆模型。对象可能不被垃圾回收垃圾回收不等于析构垃圾回收只与内存有关无论是“垃圾回收”还是“终结”,都不一定保证会发生;如果java虚拟机(JVM)并未面临内存耗尽的情况,它可
示例代码publicclassArrayListSource{publicstaticvoidmain(String[]args){ArrayListarrayList=newArrayList();//跳转至第一步for(inti=0;i代码分析第一步:当使用newArrayList()创建集合时,会调用ArrayList类的无参构造器,在集合内部存在一个空的elementData数组,代码如下privatestaticfinalintDEFAULT_CAPACITY=10;//默认容量...privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_EL
示例代码publicclassArrayListSource{publicstaticvoidmain(String[]args){ArrayListarrayList=newArrayList();//跳转至第一步for(inti=0;i代码分析第一步:当使用newArrayList()创建集合时,会调用ArrayList类的无参构造器,在集合内部存在一个空的elementData数组,代码如下privatestaticfinalintDEFAULT_CAPACITY=10;//默认容量...privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_EL
目录一、使用默认无参构造器创建Vector集合1.测试代码2.底层代码二、使用带参构造器创建Vector集合1.测试代码2.底层代码总结:ArrayList与Vector集合的底层都是通过Object[]elementData数组存放对象的ArrayList使用无参构造器时,初始容量为0,当存放一个对象后,容量扩容为10,此后按1.5*当前容量进行扩容ArrayList使用带参构造器时,初始容量为设定值,当存放对象个数达到集合容量上限后,此后按1.5*当前容量进行扩容Vector使用无参构造器时,初始容量为10,当存放对象个数达到集合容量上限后,此后按2*当前容量进行扩容Vector使用带参构
目录一、使用默认无参构造器创建Vector集合1.测试代码2.底层代码二、使用带参构造器创建Vector集合1.测试代码2.底层代码总结:ArrayList与Vector集合的底层都是通过Object[]elementData数组存放对象的ArrayList使用无参构造器时,初始容量为0,当存放一个对象后,容量扩容为10,此后按1.5*当前容量进行扩容ArrayList使用带参构造器时,初始容量为设定值,当存放对象个数达到集合容量上限后,此后按1.5*当前容量进行扩容Vector使用无参构造器时,初始容量为10,当存放对象个数达到集合容量上限后,此后按2*当前容量进行扩容Vector使用带参构
Java的动态绑定机制当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用看案例:publicclassDynamic{publicstaticvoidmain(String[]args){Animalcat=newCat();cat.action();//小猫吃鱼,动态绑定看new的对象的运行类型和内存地址}}classAnimal{privateintage;//创建eat方法publicvoideat(){System.out.println("动物进食");}//创建方法,调用eat方法publicvoidaction()
Java的动态绑定机制当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用看案例:publicclassDynamic{publicstaticvoidmain(String[]args){Animalcat=newCat();cat.action();//小猫吃鱼,动态绑定看new的对象的运行类型和内存地址}}classAnimal{privateintage;//创建eat方法publicvoideat(){System.out.println("动物进食");}//创建方法,调用eat方法publicvoidaction()
目录1线程安全定义2Java数据与线程安全2.1不可变2.2绝对线程安全2.3相对线程安全2.4线程兼容2.5线程对立3Java线程安全支持3.1互斥同步3.1.1synchronized互斥同步原理3.1.2Lock接口和ReentrantLock互斥同步原理3.1.3synchronized和Lock对比3.2非阻塞同步3.3无同步方案3.3.1可重入代码3.3.2线程本地存储1线程安全定义含糊的定义:如果一个对象可以安全地被多个线程同时使用,那它就是线程安全的严谨的定义:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方