Java基础
Java基础
J.K.Yang
这个作者很懒,什么都没留下…
展开
-
Java类加载过程
类加载过程 加载->连接->初始化。连接过程⼜可分为三步:验证->准备->解析 加载 通过全类名获取定义此类的⼆进制字节流 将字节流所代表的静态存储结构转换为⽅法区的运⾏时数据结构 在内存中⽣成⼀个代表该类的 Class 对象,作为⽅法区这些数据的访问⼊⼝ ⼀个⾮数组类的加载阶段(加载阶段获取类的⼆进制字节流的动作)是可控性最强的阶段,这⼀步我们可以去完成还可以⾃定义类加载器去控制字节流的获取⽅式(重写⼀个类加载器的 loadClass() ⽅法)。数组类型不通过类加载器创建,它原创 2020-12-26 14:50:07 · 310 阅读 · 2 评论 -
Java垃圾回收机制
堆空间的基本结构 eden区、s0区、s1区都属于新生代,tentired 区属于老年代。⼤部分情况,对象都会⾸先在 Eden 区域分配,在⼀次新⽣代垃圾回收后,如果对象还存活,则会进⼊ s0 或者 s1,并且对象的年龄还会加 1(Eden区->Survivor 区后对象的初始年龄变为1),当它的年龄增加到⼀定程度(默认为15岁),就会被晋升到⽼年代中。对象晋升到⽼年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。另外,⼤对象和⻓期存活的对象会直接进⼊⽼年代。 M原创 2020-12-22 20:16:42 · 125 阅读 · 0 评论 -
Java对象的创建过程
1.类加载检查: 虚拟机遇到⼀条 new 指令时,⾸先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。 2.分配内存: 在类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。对象所需的内存⼤⼩在类加载完成后便可确定,为对象分配空间的任务等同于把⼀块确定⼤⼩的内存从 Java 堆中划分出来。分配⽅式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配⽅式由 Java 堆是否规整(没有内存碎片)决原创 2020-12-21 18:25:27 · 134 阅读 · 0 评论 -
Java内存区域
线程私有 程序计数器 1.可以看作是当前线程所执⾏的字节码的⾏号指示器,字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执⾏、选择、循环、异常处理; 2.在多线程的情况下,程序计数器⽤于记录当前线程执⾏的位置,从⽽当线程被切换回来的时候能恢复到正确的执⾏位置,所以每条线程都需要有⼀个独⽴的程序计数器。 虚拟机栈 是由⼀个个栈帧组成,⽽每个栈帧中都拥有:局部变量表、操作数栈、动态链接、⽅法出⼝信息。 局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、cha.原创 2020-12-15 20:30:28 · 83 阅读 · 0 评论 -
Java线程的关键字
synchronized synchronized关键字解决的是多个线程之间访问资源的同步性,可以保证被它修饰的⽅法或者代码块在任意时刻只能有⼀个线程执⾏。 synchronized使用方式 修饰实例方法: 作⽤于当前对象实例加锁,进⼊同步代码前要获得当前对象实例的锁 修饰静态方法: 也就是给当前类加锁,会作⽤于类的所有对象实例,因为静态成员不属于任何⼀个实例对象,是类成员( static 表明这是该类的⼀个静态资源,不管new了多少个对象,只有⼀份)。所以如果⼀个线程A调⽤⼀个实例对象的⾮静态 synch原创 2020-12-13 18:02:55 · 1533 阅读 · 0 评论 -
Java线程总结
线程和进程 进程(Process)是系统进行资源分配和调度的基本单位; 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 线程的六种基本状态 1.NEW:线程刚创建,此时没有调用start()方法; 2.RUNNABLE: 在JVM中正在运行的线程,其中运行状态可以有运行中RUNNING和READY两种状态,由系统调度进行状态改变; 3.BLOCKED: 线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行; 4.WAITING : 等待状态,需原创 2020-12-07 22:02:50 · 126 阅读 · 0 评论 -
Java集合
ArrayList 、LinkedList和Vector 1.线程安全:ArrayList 和LinkedList线程都不安全,而Vector是线程安全的,但是性能远不及前两者; 2.数据结构:ArrayList使用数组,而LinkedList使用双向链表(JDK1.6前为循环链表,JDK1.7取消了循环); 3.时间复杂度:ArrayList:查询get(),因为有数组下标,时间复杂度为O(1);执行add(e)方法时,默认会将元素e追加到末尾,时间复杂度为O(1);指定位置做增删的话(add(i,e)/原创 2020-12-06 21:14:13 · 103 阅读 · 0 评论 -
对于Java中==、equals()和hashCode()的理解
==和equals()的区别 ==:基本数据类型比较的是值,引用数据类型比较的是内存地址; equals(): 1.类没有重写equals()方法时,等价于" == "; 2.类重写了equals()方法时,一般是重写用来比较对象的内容。 比如:经常使用的String类型数据中equals()方法是用来判断字符串值是否相等(String类中的equals()方法是被重写过的,而Object类的equals()是比较对象的内存地址) hashCode () hashCode()的作用是获取对象的哈希码(实际上原创 2020-12-06 16:49:05 · 108 阅读 · 0 评论 -
Java接口和抽象类的区别
接口 接口是对行为的抽象,是一种行为的规范; 接口中可以有变量和方法,但是变量会被隐式的指定为public static final变量,而方法会被指定为public abstract【所有方法在接口中不能有实现,也说明接口中都是抽象方法】,(Java 8 开始接⼝⽅法可以有默认实现); 一个类可以实现多个接口。 抽象类 抽象类是对类的抽象,是一种模板设计; 如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰; 一个类只能继承一个抽象类。 总结 1.成员变量:接口中的成原创 2020-12-06 15:13:33 · 2152 阅读 · 0 评论 -
Java重载和重写的区别
Java重载和重写的区别 重载 发生范围:同一个类 发生阶段:编译 必须相同:方法名 可以不同:参数类型、个数、顺序、返回值以及访问修饰符 重写 发生范围:子类 发生阶段:运行 必须相同:⽅法名、参数列表、返回值 可以不同:抛出的异常范围⼩于等于⽗类,访问修饰符范围⼤于等于⽗类 注意:父类方法访问修饰符为private/final/static,则子类不能重写该父类方法。 附:Java访问修饰符访问权限 访问修饰符 同类 同包不同类 不同包子类 不同包 private 私有 √ × × ×原创 2020-12-06 13:23:18 · 114 阅读 · 0 评论