与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。
JIT
HotSpot虚拟机的执行引擎在执行Java代码是可以采用【解释执行】和【编译执行】两种方式的,如果采用的是编译执行方式,那么就会使用到JIT,而解释执行就不会使用到JIT,所以,早期说Java是解释型语言,是没有任何问题的,而在拥有JIT的Java虚拟机环境下,说Java是解释型语言严格意义上已经不正确了。
HotSpot中的编译器是javac,他的工作是将源代码编译成字节码,这部分工作是完全独立的,完全不需要运行时参与,所以Java程序的编译是半独立的实现。有了字节码,就有解释器来进行解释执行,这是早期虚拟机的工作流程,后来,虚拟机会将执行频率高的方法或语句块通过JIT编译成本地机器码,提高了代码执行的效率,至此你已经了解了JIT在Java虚拟机中所处的地位和工作的主要内容。
- 工作原理
当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码。
通常javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译。非常显然,经过解释运行,其运行速度必定会比可运行的二进制字节码程序慢。为了提高运行速度,引入了JIT技术。
在执行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,採用该JIT技术能够,能够接近曾经纯编译技术。
- 相关知识
JIT是just in time,即时编译技术。使用该技术,可以加速java程序的运行速度。
JIT并不总是奏效,不能期望JIT一定可以加速你代码运行的速度,更糟糕的是她有可能减少代码的运行速度。这取决于你的代码结构,当然非常多情况下我们还是可以如愿以偿的。
从上面我们知道了之所以要关闭JITjava.lang.Compiler.disable(); 是由于加快运行的速度。由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这样的情况,当前的JIT仅仅对常常运行的字节码进行编译,如循环等
系统变量修改:
dir
cd
mkdir
rd
echo
del
方向键上下
cls
exit
copy 源文件夹 目标文件夹
xcopy 源文件夹 目标文件夹 /e 复制子文件夹中内容
javap -c HelloWorld 虚拟机指令基本信息
javap -v HelloWorld 虚拟机指令详细信息
对象
类
方法
实例变量
大小写敏感
类名
方法名
源文件名
主方法入口
概念
访问控制修饰符
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限
访问控制
访问控制和继承
非访问修饰符
概念
注意点
规范AJCG
标识符可以使用的字符范围,英文字母(A ~ Z a ~ z) 数字(0 ~ 9) 唯一可以使用的标点符号 _
标识符要求必须英文字母开头
标识符严格区分大小写,大写A和小写a完全不一样!
标识符没有严格的长度限制,但是会根据实际需求来限制标识符的长度
标识符组需要做到见名知意,动宾结构!!!
推荐使用驼峰命名法和下划线命名法
已经被Java使用的关键字和保留字不得用于自定义标识符使用。(变色的不能使用,大写开头的不能使用)
概念
注意点
概述
类型转换
自动类型转换
强制类型转换
强制类型转换在面向对象开发中,可以用来操作对象直接的关系
基本类型包装类
基本类型的取值范围,都以常量的形式定义在对应的包装类中
例子
类型
byte
short
int
long
float
double
boolean
char
/ 除法 - 左操作数除以右操作数 B / A等于2
% 取模 - 左操作数除右操作数的余数 B%A等于0
++ 自增: 操作数的值增加1 B++ 或 ++B 等于 21(区别详见下文)
– 自减: 操作数的值减少1 B-- 或 --B 等于 19(区别详见下文)
自增自减运算符
检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 (A> B)非真。
= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 (A> = B)为假。
按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111
= 右移位赋值运算符 C >> = 2等价于C = C >> 2
条件运算符(?:)
instanceof 运算符
if(布尔表达式)
{
//如果布尔表达式为true将执行的语句
}
if 语句
if…else语句
if…else if…else 语句
嵌套的 if…else 语句
// 打印所有数组元素
for (double element: myList) {
System.out.println(element);
}
冒泡排序
两个相邻的元素进行比较,小的向前,大的向后
N个数字来排列,两两比较小靠前,外层循环n-1,内层循环n-i-1
选择排序
选择一个元素,让选择依次和后面的元素进行比较,小的向前,大的向后
插入排序
从第二元素开始,向前找到插入的位置,保证前面的元素都有顺序
希尔排序
快速排序
采用递归分治的思想
for复制
System.arrayCopy
Arrays.copyOf
1 基础
类
对象(实例)
对象是类的一个实例,拥有多个特征和行为的实体。
创建对象
声明
实例化
初始化
创建对象的四种方式:
成员变量
实例变量(非静态变量)
类变量(静态变量)
引用
构造方法
this
方法重载overload
2 三个修饰符
abstract(抽象类)
作用
注意点
特点
经验
final
特征
final修饰实例变量(常量)
final修饰类变量(常量)
final修饰基本类型: 值不可变
final修饰引用数据类型: 地址不可变
final修饰对象常量
static(静态)
特点:
被static修饰的成员将最优先加载到内存
静态成员存在方法区(HotSpot虚拟机JDK1.7之前永久代,JDK1.8元空间)中
注意事项
static用法
修饰属性
修饰方法
修饰代码块
修饰内部类
静态导入
类加载
JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件。
将.class文件中对类的描述信息加载到内存中,进行保存。
如:包名、类名、父类、属性、方法、构造方法…
加载时机
注意事项:
代码块
局部代码块
动态代码块(构造代码块)
静态代码块
对象创建过程
接口
作用
概念
微观概念: 接口是一种能力和约定。
宏观概念:接口是一种标准。
接口中只能定义
用interface替代class
用implements替代extends
接口的规范
特征:
经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接 口扩充子类能力。(接口多实现)
接口支持多实现,可为类扩充多种能力。
如果父类实现了某些接口,则子类自动就实现了这些接口。
接口引用
同父类一样,接口也可声明为引用,并指向实现类对象
注意:
接口的多态
接口回调
常见关系
类与类:
类与接口
接口与接口
常量接口
标记接口
JDK1.8之后接口中可以包含静态方法和默认方法
接口的好处
Java包
源文件声明规则
Import语句
封装
概念:
访问控制符
private
default
protected
public
好处
具体步骤
继承
概念
作用
单继承
不可继承
构造方法不继承
没有访问权限的成员不继承
静态成员不继承
重写:
super
在子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或 方法存在重名(属性遮蔽、方法重写)时,需要加以区分,才可专项访问。
在具有继承关系的对象创建中,构建子类对象会先构建父类对象。
由父类的共性内容,叠加子类的独有内容,组合成完整的子类对象。
super关键字的用法
注意
多态
多态指的是编译器(申明变量是)和运行期(创建对象后)表现为不同的形态(数据类型)
概念:父类引用指向子类对象,从而产生多种形态。
三个条件
子类转父类规则
instanceof关键字
多态使用形式
注意事项
(开口里合最单依)
总则:开闭原则(Open Close Principle,OCP)
接口隔离原则(Interface Segregation Principle,ISP)
里氏替换原则(Liskov Substitution Principle,LSP)
合成复用原则(Composite Reuse Principle,CRP)
迪米特法则(最少知道原则)(Demeter Principle,DP)
单一职责原则(Single Responsibility Principle,SRP)
依赖倒置原则(Dependence Inversion Principle,DIP)
定义
特点
成员内部类
在类(外部类)的内部,且与外部类的成员是“同一级别”的
特点
静态内部类
使用static修饰的成员内部类,称之为静态内部类
特点:
局部内部类
定义
特点
匿名内部类
直接创建已知的类的子类的对象,则该对象的类型就是匿名内部类
特点
非静态内部类
注意事项
超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
任何类,如没有书写extends显示继承某个类,都默认直接继承Object类, 否则为间接继承。
Object类中所定义的方法,是所有对象都具备的方法。
Object类型可以存储任何对象。
getClass()方法
hashCode()方法
toString()方法
equals()方法
public boolean equals(Object obj){}
默认实现为(this == obj),比较两个对象地址是否相同。
可进行覆盖,比较两个对象的内容是否相同。
equals()方法覆盖步骤
finalize()方法
基本数据类型所对应的引用数据类型。
Object可统一所有数据,包装类的默认值是null。
8种包装类提供不同类型间的转换方式:
Number父类中提供的6个共性方法。
parseXXX()静态方法(除了Character)。
valueOf()静态方法。
JDK 5.0之后,自动装箱、拆箱。基本数据类型和包装类自动转换。
整数缓冲区
字符串字面值是常量,具有不可变性,创建之后不可改变。
常用创建方式:
public char charAt(int index)
public boolean contains(String str)
int compareTo(String anotherString)
String concat(String str)
boolean equals(Object anObject)
byte[] getBytes()
int hashCode()
String intern()
int indexOf(String str)
int lastIndexOf(int ch)
int length()
String replace(char oldChar, char newChar)
String replaceAll(String regex, String replacement
String[] split(String regex)
boolean startsWith(String prefix)
public boolean endsWith(String str)
String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
char[] toCharArray()
String trim()
public String toUpperCase()
和 StringBuilder 类
与String类区别
StringBuffer与StringBuilder区别
public StringBuffer append(String s)
public StringBuffer reverse()
public delete(int start, int end)
public insert(int offset, int i)
replace(int start, int end, String str)
定义:
Pattern类
Matcher类
用途:
匹配
拆分
查找
替换
叠词处理
元字符
预定义字符
边界匹配
其他字符
位置
作用
创建方式
方法
加
减
乘
除
BigDecimal divide(BigDecimal bd)
divide(BigDecimal bd,int scal,RoundingMode mode)
Calendar提供了获取或设置各种日历字段的方法。
protected Calendar() 构造方法为protected修饰,无法直接创建该对象。
方法
System.out.println(calendar.get(Calendar.MONTH) + 1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.SECOND));
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
//这个最小天数
System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
//获取月的最大天数
System.out.println(calendar.getMaximum(Calendar.DAY_OF_MONTH));
//获取月的最小天数
System.out.println(calendar.getMinimum(Calendar.DAY_OF_MONTH));
calendar1.add(Calendar.DAY_OF_MONTH,-1);
//date --- calendar
Date date = new Date();
Calendar instance = Calendar.getInstance();
instance.setTime(date);
//calendar --- date
Date date1 = instance.getTime();
SimpleDateFormat是以与语言环境有关的方式来格式化和解析日期的类。
进行格式化(日期 -> 文本)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
String format = simpleDateFormat.format(date);
解析(文本 -> 日期)
String string = "2020-07-30";
Date date1 = simpleDateFormat1.parse(string);
常用的时间模式字母
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和 三角函数。
方法
System.out.println(Math.abs(10));
System.out.println(Math.abs(-10));
//返回大于或等于这个数字的最小整数
System.out.println(Math.ceil(3.5));
//返回小于或等于这个数字的最大整数
System.out.println(Math.floor(3.5));
System.out.println(Math.pow(2, 10));
//返回四舍五入最接近的整数
System.out.println(Math.round(3.8));
//保留两位小数
System.out.println(Math.round(3.1415926*100)/100.0);
//返回0~1之间的小数 含头不含尾
System.out.println(Math.random());
//平方根
System.out.println(Math.sqrt(50));
//立方根
System.out.println(Math.cbrt(50));
类的实例用于生成伪随机数流。
此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改所得。
注意事项:
每个 Java 应用程序都有一个Runtime类实例,使应用程序能够与其运行的 环境相连接。可以通过getRuntime方法获取当前运行时。
修改JVM运行内存
Error
Exception
程序在运行和配置中产生的问题,可处理。
所有的异常类是从 java.lang.Exception 类继承的子类
Exception 类是 Throwable 类的子类
RuntimeException
运行时异常,又称不受检查异常,可处理,可不处理。无需声明异常。
系统运行时产生的异常,编译时不会告诉你有这个异常,只有运行时才会暴露出来
常见运行时异常
CheckedException
检查时异常,必须处理。
throws 声明异常,修饰在方法参数列表后端。
Throwable
public String getMessage()
public void printStackTrace()
try/catch
throws/throw
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明
底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程 序中断。
throws 关键字放在方法签名的尾部
也可以使用 throw 关键字抛出一个异常
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开
finally
概念:需继承Exception或Exception的子类,代表特定问题。
经验:异常类型名称望文生义,可在发生特定问题时抛出对应的异常。
常用构造方法:
Collection接口是最基本的容器接口,继承至Iterable接口,允许元素重复,可以无序,无下标
方法
迭代器
//Iterator
//迭代器: 是一种专门用来遍历集合元素的一种方法
//hasNext(); 有下一个元素 返回true
//next(); 取下一个元素
//remove(); 删除元素
注意事项:
//必须使用迭代器的删除方法
//iterator.remove();
//集合删除方法 :ConcurrentModificationException
//迭代过程中不能使用集合的删除方法,否则会出现并发修改异常
//collection.remove(o);
List接口
ArrayList
底层的数据结构使用的是数组结构,有序,有下标,可以重复,查询很快,但增删较慢,线程不安全
ArrayList的查找遍历比较快,插入和删除相对较慢,因为使用本地方法优化,并不一定比LinkedList慢
源码分析
LinkedList
底层的数据结构是双向链表结构,有序,有下标,可以重复LinkedList的插入和删除比较快,查找遍历比较慢
源码分析
列表迭代器
ListIterator listIterator = linkedListist.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
Vector
底层是数组数据结构,查询快、增删慢,JDK1.0版本,运行效率慢、线程安全。
遍历
//枚举器
Enumeration elements = vector.elements();
while (elements.hasMoreElements()) {
System.out.println(elements.nextElement());
}
Set接口
不允许在其中放入重复的元素
最多只能包含一个null元素
HashSet类
数据结构
栈
是一种先进后出的数据结构
Stack类:继承Vector类
push方法入栈、pop方法出栈
//出栈
int count = stack.size();
for (int i = 0; i < count; i++) {
System.out.println(stack.pop());
}
LinkedList也实现了栈结构
队列
是一种先进先出的数据结构
Queue接口:继承Collection接口
offer方法入队、pop方法出队
queue.offer("桃子");
//出队
int count = queue.size();
for (int i = 0; i < count; i++) {
System.out.println(queue.poll());
}
LinkedList实现了Queue接口
注意事项:
HashMap类
TreeMap类
SortedMap接口
Collections
提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作
方法
Arrays类
Comparable
Comparator接口
数组转成集合
集合变成数组
注意点: 数组要给初始值
步骤
stringArrayList.add("上海");
stringArrayList.add("北京");
String[] strings = stringArrayList.toArray(new String[0]);
简单定义
简单实例化
规则
泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开
一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符
因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型
例子
类型通配符一般是使用?代替具体的类型参数
类型通配符上限
类型通配符下限
new Test()
1.创建并默认初始化一个Test类型的对象
new jvm.study.Test [1]
dup
2.调用Test类的signature为 ()V 的构造器
invokespecial jvm.study.Test() [16]
3.表达式的值为一个指向这个新建对家的引用。
astore_1 [t]