
JavaSE
JavaSE笔记
艾比Abe
不要拒绝思考
展开
-
Java - 并发编程:同步方法的锁对象与锁竞争
并发编程:同步方法的锁对象与锁竞争1 示例描述2 同步方法的锁对象3 静态同步方法的锁对象1 示例描述示例:定义线程任务类如下所示:public class SynObj { public synchronized void showA(){ System.out.println("showA.."); try { Thread.sleep(3000); } catch (Interr原创 2020-11-01 23:22:50 · 241 阅读 · 0 评论 -
Java - 源码走读:HashMap(JDK1.7)
源码走读:HashMap(JDK1.7)〇、HashMap 功能概述一、从 ArrayList 谈起二、添加元素1. Entry 接口2. 哈希冲突4. 初识构造方法5. 数组容量的初始化6. 利用哈希值确定数组索引7. 对于 key==null 的处理四、扩容1. 单线程下的扩容2. 多线程场景下的扩容五、重哈希六、查找元素七、modCount〇、HashMap 功能概述HashMap 作为一种双列集合,从使用者的角度来看,它最主要的两个功能就是添加和查找。添加键值对:将键值对(key-value原创 2020-08-25 21:06:43 · 344 阅读 · 1 评论 -
Java - 并发编程:线程状态
并发编程:线程状态一、线程状态概述二、Timed Wating(计时等待)三、Blocked(被阻塞)四、Waiting(无限等待)1. 案例描述2. 需求分析:需要哪些类?3. 代码实现一、线程状态概述当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在 API 中 java.lang.Thread.State 这个枚举给出了一个线程在整个生命周期中的6种线程状态,下表对这6种线程状态做了简要归纳线程状态导致状态发生的事件New(新建)线程刚被创建原创 2020-08-19 00:35:55 · 203 阅读 · 0 评论 -
Java - 并发编程:线程安全
并发编程:线程安全一、线程安全1. 多线程的潜在风险2. 线程不安全原因分析二、线程同步1. 同步代码块2. 同步方法3. Lock锁一、线程安全如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。1. 多线程的潜在风险电影院的多窗口售票:假设一场电影可以卖100张票。使用线程对象模拟售票窗口,多个线程对象同时执行售票任务。使用 Runnable 接口实现线程类class RunnableIm原创 2020-08-18 23:45:03 · 146 阅读 · 0 评论 -
Java - 内存分析:多线程调度
内存分析:多线程调度一、绘制内存结构图二、类加载三、启动 main 线程四、启动其它线程五、争夺 CPU 执行权多线程调度内存分析:给定以下多线程实现相关代码,观察和分析不同线程在内存中的的调度过程一、绘制内存结构图二、类加载将 Thread 和 DemoThread 类的字节码文件加载到方法区中三、启动 main 线程程序总是从 main() 方法开始执行,首先,JVM在栈区中创建并启动一个 main 线程栈。然后在 main 线程栈中为 main 方法开辟一个栈帧,将 main() 方法压原创 2020-08-18 23:26:18 · 219 阅读 · 0 评论 -
Java - 并发编程:创建线程
并发编程:创建线程一、继承 Thread 类1. 实现步骤2. 相关方法二、实现 Runnable 接口1. 实现步骤2. 相关方法3. Runnable 接口与 Thread 类对比三、匿名线程1. 继承 Thread 类的匿名线程2. 实现 Runnable 接口的匿名线程Java程序总是从一个静态且无返回值的 main() 方法开始从上至下依次执行。在不添加其它线程情况下,程序执行时会占用一个CPU进程,且这个进程中只包含一条主线程。在Java中,创建线程首先要定义线程类,然后将线程类实例化为线程对原创 2020-08-18 23:20:07 · 143 阅读 · 0 评论 -
Java - 并发编程:基本概念
并发编程的基本概念一、并发与并行二、进程与线程三、多线程四、线程调度一、并发与并行无论是并行还是并发,在用户看来都是“同时”运行的。实际上,一个CPU同一时刻只能执行一个任务。并发:指两个或多个事件在同一时段内发生,即单核CPU在固定时段内交替执行多个任务并行:指两个或多个事件在同一时刻发生,即多核CPU同时执行多个任务。在单处理器(CPU)系统中,每一时刻只能有一道程序执行,多个程序在单 CPU 上采取分时的交替运行(并发执行)。而在多 CPU 系统中,多个程序可以被分配到多个CPU中,实现原创 2020-08-18 23:04:45 · 135 阅读 · 0 评论 -
Java - Map 接口及主要实现类
Map 接口及主要实现类一、Map 接口1. 基本介绍2. 常用方法3. Map接口的主要实现类二、Map 类集合的遍历1. 键找值方式2. 键值对方式Entry一、Map 接口1. 基本介绍现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等。这种元素之间成对保持一一对应的关系称为映射。通常称构成映射关系的两个元素称为键值对(key-value)。Java 提供了专门的集合类用来存放这种对象关系的对象,java.util.Map 接口。Map:双列集合原创 2020-08-16 22:11:25 · 1723 阅读 · 0 评论 -
Java - Collection 接口及主要实现类
Collection 接口及主要实现类一、Collection1. 基本介绍2. 常用方法二、List1. 基本介绍2. List 的特有方法3. List 接口的实现类三、Set 接口1. 基本介绍2. Set 接口的实现类一、Collection1. 基本介绍Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.List 与 java.util.Set。其中:List 的特点是有索引、存取有序、可重复。Set 的特点是无原创 2020-08-16 21:57:18 · 11224 阅读 · 2 评论 -
Java - String.intern()方法
@TOC一、从字符串比较说起一个String类型 “==” 比较样例代码如下:public class StringTest { public static void main(String[] args) { String str1 = "todo"; String str2 = "todo"; String str3 = "to"; String str4 = "do"; String str5 = s原创 2020-08-11 00:43:06 · 683 阅读 · 1 评论 -
Java - 内存分析:字符串常量池
内存分析:字符串常量池一、绘制内存结构图二、字符串实例化三、字符数组实例化四、字符串对象实例化五、总结图片内容源自B站黑马Java基础公开课给定以下字符串实例化的代码段,分析内存中的数据流动一、绘制内存结构图二、字符串实例化 String str1 = "abc";栈中开辟main方法栈帧(图中省略),在栈帧中开辟一段名为str1的地址空间,用于保存字符串实例的地址堆中实例化一个字符编码数组,数组长度为字符串长度,内容为字符串中每个字符的编码值(图中以ASCII码为例)堆中有一块专门存原创 2020-08-10 23:01:30 · 218 阅读 · 0 评论 -
Java - 字符串及其常用操作
字符串及其常用操作一、基本介绍1. API2. 字符串的特点二、创建字符串三、字符串之间的比较四、获取字符串五、字符串截取六、字符串转换七、字符串切分一、基本介绍1. APIjava.lang.String类代表字符串对象Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。意思是说,程序中所有的双引号字符串,都是String类的对象,就算没有new,也照样是。2. 字符串的特点字符串的内容不可变,字符串是常量,一旦确定,不可修改。[重点]正是因为字符串不可改变,所以字符串是原创 2020-08-10 22:46:58 · 253 阅读 · 0 评论 -
Java - 内部类
内部类一、概述1. 理解内部类2. 内部类的分类二、成员内部类1. 编写格式2. 使用成员内部类3. 成员访问三、局部内部类1. 编写格式2. 变量访问四、匿名内部类1. 编写格式2. 匿名类替换继承类3. 匿名类替换实现类其它注意事项一、概述1. 理解内部类如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类例如:身体和心脏的关系、汽车和发动机的关系2. 内部类的分类成员内部类局部内部类(包含匿名内部类)二、成员内部类定义在方法体外部,属于外部类中的一个成员1. 编写原创 2020-08-10 22:31:36 · 173 阅读 · 0 评论 -
Java - final 关键字
final 关键字一、修饰类二、修饰方法三、修饰局部变量四、修饰成员变量在 Java 中,关键字 final 表示最终的、不可改变的。其主要包括以下四种用法一、修饰类final修饰类:此类不可以被继承public final class 类名称 { // 类定义...}二、修饰方法final修饰方法:此方法不可以被重写public final void 方法名() { // 方法体...}显然,对于类和方法,abstract 和 final 是不能同时使用的,二者原创 2020-08-10 21:54:44 · 101 阅读 · 0 评论 -
Java - 多态
多态一、什么是多态性1. 父类引用指向继承类的对象2. 接口引用指向实现类的对象二、成员变量访问三、成员方法调用四、多态的优势五、可能导致的问题1. 向上转型与向下转型2. 避免类转换异常的方式一、什么是多态性多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 —— Charlie Calverts。Java中,继承(extends)和实现(implements)是多态的前提。class Fu { public原创 2020-08-10 21:42:35 · 200 阅读 · 0 评论 -
Java - 接口
接口一、接口的概念1. Java中的接口2. 接口的语法格式3. 接口的使用规范二、接口中的内容1. 常量2. 抽象方法3. 默认方法4. 静态方法5. 私有方法三、接口的使用四、类与接口之间的关系一、接口的概念生活中,接口是一种公共的规范标准,只要符合规范标准就可以通用。1. Java中的接口接口(Interface)指定是多个类的公共规范接口是一种引用类型,最重要的内容是其内部的抽象方法接口的源代码文件也是.java,编译后生成的字节码文件格式也是.class2. 接口的语法格式p原创 2020-08-10 20:47:05 · 162 阅读 · 0 评论 -
Java - 内存分析:super 与 this
内存分析:super 与 this一、绘制内存结构图二、类加载三、对象实例化四、调用对象方法根据以下父子类的定义调用代码,分析super与this关键字在内存中的执行过程class Fu { int num = 10; public void method() {} // 父类方法}class Zi extends Fu { int num = 20; public void method() {} // 子类重写父类方法 public void show() { int num原创 2020-08-09 21:00:31 · 409 阅读 · 1 评论 -
Java - 继承、抽象类
继承、抽象类一、继承1. 基本概念2. 继承关系中的成员访问3. 重写与重载4. super 与 this二、抽象类一、继承1. 基本概念继承主要解决的问题是共性抽取。继承是多态的前提,没有继承就没有多态。继承关系的特点子类可以拥有父类的内容子类还可以有自己专属的内容“子类是一个父类”(is a)Java中的继承Java是单继承的,一个类的直接继承父类只能有一个Java支持多级继承,支持孙类继承子类,子类再继承父类,所有的类最终都继承自Object类子类有且只能有一个父类,但是父原创 2020-08-09 18:00:14 · 227 阅读 · 0 评论 -
Java - 封装、权限修饰符、方法重载
封装、权限修饰符一、什么是封装二、权限修饰符三、Java标准类定义格式四、方法重载1. 方法重载的概念2. 方法重载的要素一、什么是封装从实体中抽象出属性和方法的实现细节并包装在类中的过程称为封装。Java通过在属性和方法定义前添加权限修饰符达到控制外部访问权限的目的。方法封装的目的:隐藏方法实现细节,通过向外部提供公开接口供外部使用简化调用过程,方便修改维护根据需要,可以私有化方法仅供类内部使用二、权限修饰符Java中有四种权限修饰符,对外公开权限从高到低依次是:public >原创 2020-08-09 17:02:24 · 287 阅读 · 0 评论 -
Java - 对象的内存分析(3)
对象的内存分析(3)一、绘制内存结构图二、类加载三、实例化one对象四、声明two引用one对象五、通过引用two操作对象内存分析:对象的重复引用。给定手机类的实例化流程代码,分析两个变量引用同一个手机对象时的内存中流动过程一、绘制内存结构图二、类加载将所有类的字节码加载到方法区中;在栈内存中为 main 方法开辟栈帧三、实例化one对象在堆中实例化一个 Phone 对象,在 main 方法栈帧中定义一个名为 one 的 Phone 类型变量,用于保存该对象在堆内存中的地址值根据变量 o原创 2020-08-09 14:19:08 · 226 阅读 · 0 评论 -
Java - 对象的内存分析(2)
对象的内存分析(2)一、绘制内存结构图二、类加载三、实例化one对象四、操作one对象五、实例化two对象六、操作two对象七、总结图片内容源自B站黑马Java基础公开课内存分析:同一个类实例化的两个不同对象使用同一个方法。给定手机类的实例化流程代码,分析两个手机对象在执行相同方法时的内存中流动过程一、绘制内存结构图二、类加载将所有类字节码(.class文件)加载到方法区中三、实例化one对象在栈内存中为 main 方法开辟栈帧。进而实例化第一个 Phone 对象,在 main 方法栈帧中原创 2020-08-09 14:02:44 · 130 阅读 · 0 评论 -
Java - 对象的内存分析(1)
对象的内存分析(1)一、绘制内存结构图二、类加载三、对象实例化四、访问和修改成员变量五、调用执行对象方法六、弹出main方法栈帧图片内容源自B站黑马Java基础公开课内存分析:单个对象的实例化过程。给定手机类的实例化流程代码,分析手机对象在内存中的流动过程一、绘制内存结构图二、类加载JVM依次将Phone类和Demo01PhoneOne类的字节码(.class)加载到方法区中。加载内容包括各自的成员变量和成员方法,并记录它们在方法区中的地址三、对象实例化main方法是程序运行的起点,JVM原创 2020-08-09 13:44:06 · 282 阅读 · 0 评论 -
Java - 数组的内存分析(3)
数组的内存分析(3)一、绘制内存结构图二、类加载三、数组实例化两个引用指向同一数组时的内存分析:给定单数组的定义和相关CRUD操作代码,观察多引用变量对数组在内存中变化的影响一、绘制内存结构图 arrayB = arrayA; // 将变量 arrayA 中保存的数组首地址赋值给变量 arrayB二、类加载执行main方法,为main方法在栈中开辟栈帧三、数组实例化定义数组变量 arrayA,同时实例化数组对象,将数组对象的地址赋值给数组变量 arrayA,再对 arrayA 指向的数原创 2020-08-09 02:10:56 · 126 阅读 · 0 评论 -
Java - 数组的内存分析(2)
数组的内存分析(2)一、绘制内存结构图二、类加载三、数组实例化图片内容源自B站黑马Java基础公开课两个数组的内存分析:给定两个数组的定义和相关CRUD操作代码,观察两个数组在内存中的流动过程一、绘制内存结构图二、类加载将main方法压入栈内存,开辟main方法栈帧三、数组实例化数组 arrayA 的实例化和值覆盖:在栈中开辟一段名为 arrayA 的变量空间,在堆中实例化数组对象,将数组对象的首地址保存在 arrayA 中。赋值时,根据 arrayA 中保存的地址变量找到数组,再根据索原创 2020-08-09 01:56:47 · 154 阅读 · 0 评论 -
Java - 数组的内存分析(1)
数组的内存分析(1)一、绘制内存结构图二、类加载三、数组实例化四、分析不同的数组操作图片内容源自B站黑马Java基础公开课一个数组的内存分析:给定单数组的定义和相关CRUD操作代码,观察数组在内存中的流动过程一、绘制内存结构图二、类加载main方法是程序运行的起点,首先,JVM会将类Demo01ArrayOne的字节码文件(.class)加载到方法区,找到 main 方法,将 main 方法压入栈内存,并为 main 方法开辟栈帧三、数组实例化执行第一句,实例化一个名称为 array 的整原创 2020-08-09 01:50:00 · 172 阅读 · 0 评论 -
Java - 数据类型、常量与变量
Java - 数据类型、常量与变量一、数据类型1. 基本数据类型:2. 引用数据类型:二、常量常量的分类:三、变量1. 变量的创建方式2. 局部变量与成员变量的区别三、强制类型转换1. 强制类型转换的格式2. 强制类型转换的几点注意:3. 表达式赋值一、数据类型Java中有两种数据类型:基本数据类型和引用数据类型1. 基本数据类型:整数型:byte[1字节],short[2字节],int[4字节],long[8字节]浮点型:float[4字节],double[8字节]字符型:char[2字节]原创 2020-08-08 21:42:27 · 273 阅读 · 0 评论