1.什么是NPE,什么情况下会发生NPE
NPE 空指针异常(nullpointenrException)
Java 语言严格规定当指针是null的时候,不允许通过指针操作
当你使用指针进行操作的时候,如果不确定指针是否为null应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间if(指针== null) {指针= new ...}
2.new关键字的作用
New关键字的作用是在堆区开辟内存空间,并且返回该内存空间的内存地址
可操作的索引永远是
3.数组和对象的区别
(1)用于在堆区造数组
数组的构造器是系统默认就有的,任何一种数据都可以永数组构造器来构造数组
例如 new int[]
(2)用于在堆区造对象
对象的构造器是类里面提供的
例如 new student()
这个new后面的student()是一个构造方法,是编译器给的,你自动生成的,在字节文件中可以看到他
4.基本数据类型对应的引用数据类型
- 数据类型图:
┏数值型━┳━整数型:byte short int long
┏基本数据类型━━┫ ┗━浮点型:float double
┃ ┣字符型:char
数据类型╋ ┗布尔型:boolean
┃ ┏类(class)
┗引用数据类型━━╋接口(interface)
┗数组(array
- 基本数据类型
注意:
1、在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与平台无关的。比如,int永远占4个字节(1 Byte = 8 bit)。
2、void不是基本数据类型
- 引用数据类型
引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。
在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
5.正序逼历数组,倒序逼历数组
正向遍历都是从0开始(因为数组的索引是从0开始的)
到arr。length 结束,length是数组的长度
循环变量i只能<length,不能<=length,或者是i <=arr
6.数组求和
累加求和,遍历数组,累加所有元素
7.数组求最大值和最小值
声明变量max存储最大数,并默认第一个元素是max
8.数组求平均数
9.数组扩容的策略
数组是一种定长的数据结构 数组扩容的策略:1 创建新数组2.把原数组的元素转移到新的数组在 3.把新数组的地址赋给原数组的指针
10.数组中插入元素
找到数组中一个null的位置插入一个元素,并且不会对其他元素有影响
11.数组中删除元素
12.反转数组
方法一:使用循环,交换数组中元素的位置
使用循环,在原数组中交换元素的位置:第一个元素与最后一个元素交换,第二个元素与最后一个元素交换,依此类推,直到结束。
例如,在数组[1,2,3,...,n-2,n-1,n]中,我们可以将1和n进行交换,2和n-1进行交换,3和n-2进行交换。
实现代码public class arrayReverse {
/*数组中元素位置进行交换*/
static void reverse(int a[], int n)
{
int i, k, t;
for (i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
/*printing the reversed array*/
System.out.println("\n反转数组是:");
for (k = 0; k < n; k++) {
System.out.println(a[k]);
}
}
public static void main(String[] args)
{
int [] arr = {5, 6, 7, 8, 9};
System.out.println("原数组是: ");
for (int k = 0; k < arr.length; k++) {
System.out.println(arr[k]);
}
reverse(arr, arr.length);
}
}
输出:原数组是:
5
6
7
8
9
反转数组是:
9
8
7
6
5
13.使用冒泡排序算法排序数组
第一步,从第一个元素开始,将相邻的两个元素进行比较,直到最后两个元素完成比较。如果前面的元素比后面的元素大,则交换它们的位置。整个过程完成后,数组中最后一个元素自然就是最大值,这样也就完成了第一趟的比较。
第二步,除了最后一个元素,将剩余的元素按照第一步的方法进行两两比较,这样就可以将数组中第二大的元素放到倒数第二个位置上。
第三步,以此类推,持续对越来越少的元素重复上面的步骤,直到没有任何一对元素需要比较为止。
总体而言,在冒泡排序中,程序的时间复杂度和空间复杂度随着程序的执行,均呈现递减趋势。
public class Example32{
public static void main(String[] args){
int[] arr={9, 8, 3, 5, 2};
System.out.print("冒泡排序前:");
printArray(arr); // 打印排序前的数组元素
bubbleSort(arr); // 调用排序方法
System.out.print("冒泡排序后:");
printArray(arr); // 打印排序后的数组元素
}
// 定义打印数组方法
public static void printArray(int[] arr){
for(int i=0; i<arr.length; i++){ // 从第一个数组元素开始遍历数组元素
System.out.print(arr[i]+" "); // 输出数组元素,并加空格以控制格式
}
System.out.print("\n"); // 完成一次调用后换行
}
// 定义冒泡排序方法
public static void bubbleSort(int[] arr){
for(int i=0; i<arr.length -1; i++){ // 外层循环,控制总共需要比较的趟数
for(int j=0; j<arr.length -i -1; j++){ // 内层循环,控制每趟需要比较的次数
if(arr[j] > arr[j+1]){ // 比较相邻元素
// 以下三行代码用于交换两个元素
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.print("第"+(i+1)+"轮排序后:"); // 每趟执行完后,输出提示信息
printArray(arr); // 输出本趟执行后的结果
}
}
}
14.官方的Arrays工具类
Arrays 是JDK提供的操作数组的工具类,array类提供了动态创建和访问 Java 数组的方法。
arrays此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。主要有一下几种用法。
首先声明几个数组:
int a[]={20,3,32,1,72,26,35};
int b[]={3,5,7,8,54,23,9};
int c[]={3,5,7,8,54,23,9};
System.out.println("转换前:"+a);
//数组转换字符串
String str=Arrays.toString(a);
System.out.println("转换为字符串:"+str);
15.二维数组
两种初始化形式
格式1: 动态初始化
数据类型 数组名 [ ][ ] = new 数据类型[m][n]
数据类型 [ ][ ] 数组名 = new 数据类型[m][n]
数据类型 [ ] 数组名 [ ] = new 数据类型[m][n]
举例:int [ ][ ] arr=new int [5][3]; 也可以理解为“5行3例”
格式2: 静态初始化
数据类型 [ ][ ] 数组名 = {{元素1,元素2....},{元素1,元素2....},{元素1,元素2....}.....};
举例:int [ ][ ] arr={{22,15,32,20,18},{12,21,25,19,33},{14,58,34,24,66},};
静态初始化可用于不规则二维数组的初始化
public static void main(String[]args){
int [][] arr=new int[][]{{4,5,6,8},{2,3},{1,6,9}};
System.out.println(arr.length);//输出行数
System.out.println(arr[0].length);//输出列数
}
16.类和对象
类与对象时整个面向对象中最基础的组成单元。
类:是抽象的概念集合,表示的是一个共性的产物,类之中定义的是属性和行为(方法);
对象:对象是一种个性的表示,表示一个独立的个体,每个对象拥有自己独立的属性,依靠属性来区分不同对象。
可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。
17.成员变量
在 Java 中对象的属性也称为成员变量。为了了解成员变量,首先定义一个图书类,成员变量对应于类对象的属性,在 Book 类中设置 3 个成员变量,分别为 id、name 和 category,分别对应于图书编号、图书名称和图书类别 3 个图书属性。
18.构造方法
在 Java 语言中使用成员方法对应于类对象的行为。以 Book 类为例,它包含了 getName() 和 setName() 两个方法,这两个成员方法分别为获取图书名称和设置图书名称的方法。
一个成员方法可以有参数,这个参数可以是对象,也可以是基本数据类型的变量,同时成员方法有返回值和不返回值的选择,如果方法需要返回值,可以在方法体中使用 return
关键字,使用这个关键字后,方法的执行将被终止。
20. this关键字
1、this是一个关键字,翻译为:这个。
2、this是一个引用,this变量中保存了内存地址指向自身,this存储在JVM内存java对象内部。
3、创建1001个java对象,每一个对象都有this,也就说有100个不同的this
4、this可以实现出现在“实例方法中”当中,this指向当前正在执行这个动作的对象
21.什么是零值
零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。