基础知识梳理

  • 一、内存划分
  • 二、java编译器的两点优化
  • 三、关于字符串
  • 四、包装类
  • 五、接口
  • 六、几个好用的IDEA编辑技巧


一、内存划分

Java的内存划分为5个部分:

  1. 栈(Stack):存放的是方法中的局部变量。
    方法一定要在栈当中运行
  2. 堆(Heap):凡是new出来的,都在堆当中。
    堆内存里的数据都有地址值(16进制),也都有默认值。

数据类型

默认值

整数

0

浮点数

0.0

字符

\u0000

布尔值

false

引用类型

null

  1. 方法区(Method Area):存储.class相关信息,包含方法的信息。
  2. 本地方法栈(Native Method Stack):与操作系统相关。
  3. 寄存器(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编译器的两点优化

  1. 对byte/short/char三种类型来说,如果对其所赋的值没有超过范围,那么javac编译器将自动隐含的补上强转
  2. 给变量进行赋值时,当赋值表达式中【全为常量】时,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
   }

三、关于字符串

  1. 字符串的特点:
    i. 字符串的内容永不改变,底层是private final byte[] value 字节数组,效果上相当于char[]字符数组
    ii.字符串是可以共享使用的,因为字符串不可改变
String str = "abc";		//创建一个字符串,str中保存的是地址值
str = "java";	//这里并非改变str字符串变量的值,而是新创建一个字符串对象,将str中保存的地址值变为新建对象"java"的地址值
  1. 创建字符串的方式
//三种构造方法:
public String():创建一个空白字符串,不含有任何内容;
public String(char[] array):根据字符数组的内容,来创建对应的字符串;
public String(byte[] array):根据字节数组的内容,来创建对应的字符串;
//一种直接创建
String str = "Hello";
  1. 字符串常量池:直接用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
    }
  1. 常用方法

方法

作用

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…