1. 初识Java
1.1 Java跨平台原理
Java源程序(.java)首先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行,解释是通过Java虚拟机来执行的。字节码文件不面向任何具体平台,只面向虚拟机,不同平台的虚拟机是不同的,但它们都提供了相同的接口,Java语言具有一次编译,到处运行的特点,就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。
1.2 JVM、JRE、JDK
JVM:Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的字节码文件,这种字节码文件在虚拟机上执行。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的字节码文件(.class文件)
JRE:JRE是java runtime environment(java运行环境)的缩写。光有JVM还不能让class文件执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。
JDK:JDK是java development kit(java开发工具包)的缩写
三者之间的关系:
jdk是JAVA程序开发时用的开发工具包,其内部也有运行环境JRE。JRE是JAVA程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了。JDk、JRE内部都包含JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。
2. 字符串
2.1 对象创建的原理
https://blog.csdn.net/cd546566850/article/details/105353791
2.2 String、StringBuilder和StringBuffer三者之间的区别
1、String对象是不可变的,创建了就不能更改,StringBuilder和StringBuffer是可更改的
2、StringBuilder是线程不安全的,StringBuffer是线程安全的
3、运算速度:StringBuilder>StringBuffer>String
使用场合:
- 在字符串不经常发生变化的业务场景优先使用String
- 在单线程下,比如有大量的字符串操作的情况下,应该使用StringBuilder
- 在多线程下,有大量的字符串大的操作的情况下,应该使用StringBuffer
2.3 String类常见的方法
返回值 | 方法 | 含义 |
---|---|---|
boolean | equals(Object object) | 比较两个字符串是否相等 |
boolean | equalsIgnoreCase(String str) | 比较两个字符串是否相等,忽略大小写 |
int | length() | 返回此字符串的长度 |
String | concat (String str) | 将指定的字符串连接到该字符串的末尾 |
char | charAt (int index) | 返回指定索引处的 char值 |
int | indexOf (String str) | 返回指定子字符串第一次出现在该字符串内的索引 |
String | substring (int beginIndex) | 返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。 |
String | substring (int beginIndex, int endIndex) | 返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。 (含左不含右) |
char[] | toCharArray () | 将字符串转换为一个字符数组 |
String[] | split(String regex) | 将此字符串按照给定的regex(规则)拆分为字符串数组 |
其余的方法见API文档
// char[] toCharArray():把字符串转换为字符数组
String s = "abcde";
char[] chs = s.toCharArray();
//split(String regex)
String s = "aa|bb|cc";
String[] strArray = s.split("|"); // ["aa","bb","cc"]
3. 数组
3.1 概述
数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致
3.2 数组的定义
1、方式一
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度]
int[] arr = new int[3];
2、方式二
数据类型[] 数组名 = new 数据类型[]{
元素1,元素2,元素3...}
int[] arr = new int[]{
1,2,3,4,5};
3、方式三
数据类型[] 数组名 = {
元素1,元素2,元素3...}
int[] arr = {
1,2,3,4,5};
4. super和this
1、访问成员变量
this.成员变量 ‐‐ 本类的
super.成员变量 ‐‐ 父类的
2、访问成员方法
this.成员方法名() ‐‐ 本类的
super.成员方法名() ‐‐ 父类的
3、访问构造方法
this(...) ‐‐ 本类的构造方法
super(...) ‐‐ 父类的构造方法
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。
5. 内部类
5.1 概述
内部类:将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类
5.2 成员内部类
成员内部类 :定义在类中方法外的类
定义格式:
class 外部类 {
class 内部类{
}
}
访问特点:
1、内部类可以直接访问外部类的成员,包括私有成员
2、外部类要访问内部类的成员,必须要建立内部类的对象
创建内部类对象格式:
内部类名 对象名 = new 外部类型().new 内部类型(