基础知识梳理
- 一、内存划分
- 二、java编译器的两点优化
- 三、关于字符串
- 四、包装类
- 五、接口
- 六、几个好用的IDEA编辑技巧
一、内存划分
Java的内存划分为5个部分:
- 栈(Stack):存放的是方法中的局部变量。
方法一定要在栈当中运行 - 堆(Heap):凡是new出来的,都在堆当中。
堆内存里的数据都有地址值(16进制),也都有默认值。
数据类型 | 默认值 |
整数 | 0 |
浮点数 | 0.0 |
字符 | \u0000 |
布尔值 | false |
引用类型 | null |
- 方法区(Method Area):存储.class相关信息,包含方法的信息。
- 本地方法栈(Native Method Stack):与操作系统相关。
- 寄存器(pc Register):与CPU相关
通过一段简单的代码体会数组的内存
public static void main(String[] args) {
int[] arrayA = new int[3];
arrayA[1] = 10;
System.out.println(arrayA); //地址值
System.out.println(arrayA[0]); //默认值0
System.out.println(arrayA[1]); //所赋值10
int[] arrayB = arrayA; //把arrayA数组的地址值赋值给了arrayB数组
System.out.println(arrayB); //地址值
arrayB[1] = 20 ;
System.out.println(arrayA[1]); //修改后的值20
}
二、java编译器的两点优化
- 对byte/short/char三种类型来说,如果对其所赋的值没有超过范围,那么javac编译器将自动隐含的补上强转
- 给变量进行赋值时,当赋值表达式中【全为常量】时,javac编译器将会直接将常量表达式计算得到结果,
在编译阶段完成常量运算,即“编译器的常量优化”
public static void main(String[] args) {
byte num = /*(byte)*/ 20; //int(20)--->byte,不是小到大的自动类型转换,而是编译器隐含强转
char s = /*(char)*/ 65; //int(67)--->char,同上
System.out.println(num); //20
System.out.println(s); //A
short a = 5;
short b = 6;
//short result = a + b; ----> 此时表达式有变量,无法进行常量优化,编译不通过,为'short=int+int'
short result = 5+6 ;
System.out.println(result); //11
}
三、关于字符串
- 字符串的特点:
i. 字符串的内容永不改变,底层是private final byte[] value 字节数组,效果上相当于char[]字符数组
ii.字符串是可以共享使用的,因为字符串不可改变
String str = "abc"; //创建一个字符串,str中保存的是地址值
str = "java"; //这里并非改变str字符串变量的值,而是新创建一个字符串对象,将str中保存的地址值变为新建对象"java"的地址值
- 创建字符串的方式
//三种构造方法:
public String():创建一个空白字符串,不含有任何内容;
public String(char[] array):根据字符数组的内容,来创建对应的字符串;
public String(byte[] array):根据字节数组的内容,来创建对应的字符串;
//一种直接创建
String str = "Hello";
- 字符串常量池:直接用String="xxx"构造的String字符串,就在字符串常量池中。
对于基本类型,==是进行数值的比较
对于引用类型,==是进行地址值的比较
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a','b','c'};
String str3 = new String(charArray); //"abc"
byte[] byteArray = { 97,98,99 };
String str4 = new String(byteArray); //"abc"
System.out.println(str1==str2); //true
System.out.println(str1==str3); //false
System.out.println(str2==str3); //false
}
- 常用方法
方法 | 作用 |
boolean equals(Object obj) | 字符串内容的比较 |
boolean equalsIgnoreCase(Object obj) | 忽略大小写的字符串内容比较 |
int length() | 获取字符串当中含有的字符个数,即字符串长度 |
String concat(String str) | 字符串拼接 |
char charAt(int index) | 获取指定索引位置的单个字符 |
int indexOf(String str) | 查找参数字符串在本字符串中首次出现的索引位置,若无则返回-1值 |
String substring(int index) | 截取从参数位置到字符串末尾,返回新字符串 |
String substring(int begin, int end) | 截取从begin到end(左闭右开)中间的字符串 |
char[] toCharArray() | 将当前字符串拆分为字符数组作为返回值 |
byte[] getBytes() | 获得当前字符串底层的字节数组 |
String replace(CharSequence oldString,CharSequence newString) | 将所有出现的老字符串替换为新字符串,并返回替换后的字符串 |
String[] split(String regex) | 按照参数的规则,将字符串切分成为若干部分【参数是正则表达式,若按.拆分,需"\\."】 |
对于String以及包装类,equals是比较内容的,因为该引用类型覆盖了Object中的equals方法
对于自定义对象类型,equals是比较地址的,因为直接继承了Object中的equals方法,
四、包装类
- 自动装箱与拆箱:基本类型与对应的包装类对象之间的转换过程可以自动完成
- 包装类是引用类型,都位于java.lang包下
泛型只能是引用类型
基本类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
五、接口
接口可包含的内容 | |
Java 7 | ① 常量 , ② 抽象方法 |
Java 8 | ③ 默认方法 , ④ 静态方法 |
Java 9 | ⑤ 私有方法 |
- 接口中的成员变量即常量:[public] [static] [final] 数据类型 常量名称 = 数据值 ;
- 常量必须赋值且不能改变,常量名称完全大写,用下划线分隔
- 接口中的抽象方法:[public] [abstract] 返回值类型 方法名称(参数列表);
- 接口实现类必须覆盖重写其所有的抽象方法,除非是实现类是抽象类
- 接口的默认方法:[public] default 返回值类型 方法名称(参数列表) { 方法体 }
- 接口的默认方法可以解决接口升级的问题:它有自己的方法体,作为接口新增的方法时(升级)无需修改接口实现类。
- 可通过其实现类直接调用,也可以被其实现类覆盖重写。
- 接口中的静态方法:[public] static 返回值类型 方法名称(参数列表) { 方法体 }
- 应该通过接口名称调用
- 接口中的私有方法:private [static] 返回值类型 方法名称(参数列表) { 方法体 }
- 接口编译生成的字节码文件依旧是:.java–>.class
- 接口与接口之间是多继承的
注: 以上,[]代表可选择性省略;
六、几个好用的IDEA编辑技巧
快捷键/代码 | 作用 |
shift+F6 | 同时修改所有同名变量 |
sout | 快速生成控制台打印语句 |
n.fori / n.forr | 快速生成for循环(正序/倒序) |
Ctrl+Alt+v 或 Alt+enter 或 X.var | 快速接收变量 |
Ctrl+w | 选择光标所在单词/代码块 |
Ctrl+Shift+i | 在当前页显示对象详细信息,Ctrl+单击会新开一页 |
Ctrl+Alt+t | 快速生成围绕代码,如try…catch… |