Java基础复习-上
运算
从键盘上获取数据:
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
八大基本数据类型:
byte,short,int,long,float,double,boolean,char

字符串相加:

ASCII编码表:

字符相加:
会先根据ASCII查询对应的数字然后再计算
赋值运算符

关系运算符

逻辑运算符
运算符左右两边都会执行

短路逻辑运算符
运算符左右两边不一定都执行


三元表达式


流程控制
switch


利用大括号省略break

如果只有一句可以把大括号也省略:jdk12

数组




数组的内存分布
Java内存分布



简单的方法

数组内存

通过new关键字创建出来的对象都是在堆里

方法
方法的内存
引用数据类型


基本数据类型


小结
传递基本数据类型的数据时传递的是数值本身,方法内修改这个值原来的值不会改变
传递引用数据类型的数据时传递的数据的地址值,方法内修改这个地址内的数据后,原来的值会发生改变
二维数组

二维数组内存图

面向对象
对象的内存图


一个对象的内存图


两个对象的内存图

两个引用指向同一个对象


this的内存原理


成员变量和局部变量
键盘录入


字符串操作
字符串创建

String字符串内存

栈和方法相关,那个方法执行对应的方法就进栈,执行结束就出栈
堆和对象相关,通过new关键字创建出来的对象都在堆中
方法区用来存放不同Java文件的class文件
字符串采用直接赋值的方式(String str = "123")这种方式,创建出来的字符串是在堆中的StringTable(串池)中
jdk7以后,将这个StringTable(串池)放到堆内存中,jdk7以前他是在方法区


所以,采用直接赋值的方式,是可以复用的,节省了内存
如果使用new关键字搭配构造方法创建字符串,这样是直接在堆中开辟一块空间来使用

字符串的比较

示例:

字符串比较(equals和equalsIgnoreCase)


我们使用Scanner的next方法获取的字符串在底层是使用new关键字创建出来的
遍历字符串

char类型字符比较

字符串截取


字符串替换

StringBuilder
![]()


StringJoiner


StringBuilder提高效率原理图





StringBuilder可以使用.capacity()方法来查看这个数组的容量

集合

ArrayList

基本数据类型-包装类

static

static内存图
静态变量是随着类的加载而加载的,优先于对象的出现



这里的工具类,写一个私有的构造方法,其他地方就没办法new这个工具类的实例了

三大特性
继承


1、父类的构造方法子类是不能继承的
2、父类的成员变量无论是私有还是非私有子类都是可以继承的
3、父类中私有的成员变量子类继承后是不能直接使用的,需要通过对应的get和set方法来使用
内存图
使用public修饰变量:

使用private修改变量:



方法的重写

多态


多态的特点


多态的优势和弊端



包机制

final


权限修饰符


代码块

静态代码块

抽象类
抽象类需要有继承关系,子类需要实现父类中的抽象方法


接口


接口和接口之间可以继承,并且可以多继承






上面的不加static的私有方法是给本类中默认的方法使用,下面带static的是给本类中静态方法使用的
接口的多态


适配器模式

内部类


成员内部类
成员内部类如果使用private修饰,那么在外部是无法直接创建这个内部类的。解决方案:在外部类提供创建这个内部类的方法


Java内存分析工具


静态内部类


局部内部类


匿名内部类


常用API
Math


System




Runtime


Object和Objects


![]()






浅克隆

深克隆


Objects


BigInteger





BigInteger底层原理:将字符串数字转成对应的二进制补码,然后分割,没32位为一组,再将每组都转成对应的十进制,然后将所有的十进制数存储到一个mag数组中,用一个signum代表数字的正负。

BigDecimal
1、直接在括号里面传递double类型的数据时,会出现不可预见的问题

2、使用传递字符串的形式可以避免上述不精确的问题





BigDecimal在底层,将字符串中的每个字符获取出来,然后将其转成对应的ASCII码,然后放到数组中(包括小数点,正负号)。

正则表达式


![]()

可以去帮助文档查询,API帮助文档搜索Pattern









可以使用idea中插件:AnyRule来找对应的正则表达式
时间
Date



SimpleDateFormat







Calendar日历





jdk8新增的时间类








包装类


Integer的静态方法valueOf方法在底层会默认创建-128-127的Integer对象,使用的时候直接返回不会重新创建
算法
查找算法




排序算法





递归算法



代码实现:
// 冒泡排序public static int[] sort1(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;}// 选择排序public static int[] sort2(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}return arr;}// 插入排序public static int[] sort3(int[] arr) {for (int i = 1; i < arr.length; i++) {int j = i;while (j > 0 && arr[j] < arr[j - 1]) {int temp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = temp;j--;}}return arr;}// 快速排序public static void sort4(int[] arr, int start, int end) {if (start >= end) {return;}int i = start;int j = end;int pivot = arr[start];while (i < j) {
// j向左移动,找比基准数小的数while (i < j && arr[j] >= pivot) {j--;}
// i向右移动,找比基准数大的数while (i < j && arr[i] <= pivot) {i++;}
// 交换i和j位置上的数字if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
// 将基准数归位arr[start] = arr[i];arr[i] = pivot;
// 递归调用快速排序sort4(arr, start, i - 1);sort4(arr, i + 1, end);}Arrays



// o1-o2:升序,o2-o1:降序Arrays.sort(arr,(o1,o2) -> o2 - o1);System.out.println(Arrays.toString(arr));Lambda表达式


// 字符串比较String str1 = "abc";String str2 = "def";
// 负数:str1 < str2
// 0:str1 == str2
// 正数:str1 > str2int i = str1.compareTo(str2);System.out.println(i);
