day07レビュー
Java-day08研究ノート
1つは、配列
1.1配列の一般的な例外
①配列インデックスの範囲外例外(ArrayIndexOutOfBoundsException)
public class Demo {
public static void main(String[] args) {
//先定义一个数组
int[] arr = {
11, 22, 33};
//获取数组中数据
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]); //数组索引越界异常 ArrayIndexOutOfBoundsException
}
}
出现问题的原因:因为数组的索引是从0开始的,所以数组最大的索引只能是数组的长度-1,以上异常是因为超过数组的索引了。
如何解决:在访问之前先确定好数组的长度,进而确定数组的最大索引,以免使用的时候超过最大索引。
②NullPointerException(NullPointerException)
public class Demo2 {
public static void main(String[] args) {
int[] arr = {
11, 22, 33};
arr = null;
System.out.println(arr[1]); //空指针异常 NullPointerException
}
}
出现异常的原因:因为数组的引用指向了一个null,而null在内存中不代表任何位置,所以再访问的时候就报的是空指针异常。
如何解决?在使用之前先判断对象(引用)是否为空,如果不为null再执行。
1.2配列の一般的な操作
①アレイのトラバース
トラバーサルとは、配列内のデータを最後から1つずつ取得することです。
public class Demo {
public static void main(String[] args) {
int[] arr = {
11, 22, 33, 44, 55};
//第一种方式:
// System.out.println(arr[0]);
// System.out.println(arr[1]);
// System.out.println(arr[2]);
// System.out.println(arr[3]);
// System.out.println(arr[4]);
//第二种方式:使用for循环改进
// for(int i = 0; i < 5; i++){
//
// System.out.println(arr[i]);
// }
/*
第三种方式:使用for循环改进,同时通过数组的方法来获取数组的长度
获取数组长度的方法:
数组名.length;
注意:此length方法没有小括号
*/
// System.out.println(arr.length);
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}
②配列の最大値
配列の最大値または最小値を取得します
public class Demo2 {
public static void main(String[] args) {
int[] arr = {
11, 33, 22, 55, 44};
//先假定一个数据为最大值,如arr[0],相当于擂台
int max = arr[0];
//遍历数组
for(int i = 1; i < arr.length; i++){
//在擂台上进行比较
if(arr[i] > max){
max = arr[i];
}
}
System.out.println("最大值为:" + max);
}
}
③2つの変数の値を交換します
/*
交换两个变量的值
*/
public class Demo3 {
public static void main(String[] args) {
int a = 3;
int b = 5;
//方式一:【掌握】先定义一个临时变量将a的值存储起来(后面a再被修改的时候,temp的值不会变化)
int temp = a;
a = b;
b = temp;
//方式二:
// int sum = a + b;
// a = sum - a;
// b = sum - a;
//方式三:【了解】一个数对另外一个数异或两次得到的结果还是自己
// a = a^b;
// b = a^b;
// a = a^b;
//方式四:
// a = (a + b) - (b = a);
System.out.println(a);
System.out.println(b);
}
}
④配列を逆にします(逆順)
例:元の配列は{11、22、33、44、55}で、逆順の後の配列は{55、44、33、22、11}です。
public class Demo4 {
public static void main(String[] args) {
int[] arr = {
11, 22, 33, 44, 55};
//方法一:
//将通过方法获取到的新数组地址赋给原数组
// arr = reverse(arr);
//方式二: 【常用】
// reverse2(arr);
//方式三:
reverse3(arr);
//遍历
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
/*
数组的反转:
两个明确:
返回值类型:int[]
参数列表:int[] a
*/
public static int[] reverse(int[] a) {
//1. 新建一个数组,类型及长度都和原数组相同
int[] arr_xin = new int[a.length];
//2. 倒着遍历原数组并将内容正向存入新数组中
for(int i = 0; i < a.length; i++){
arr_xin[i] = a[a.length-1-i];
}
return arr_xin;
}
public static void reverse2(int[] a) {
for (int i = 0; i < a.length / 2; i++) {
/*
a[0] a[a.length-1-0]
a[1] a[a.length-1-1]
a[i] a[a.length-1-i]
*/
int temp = a[i];
a[i] = a[a.length-1-i];
a[a.length-1-i] = temp;
}
}
public static void reverse3(int[] a) {
//int b = 3;
for(int start = 0, end = a.length-1; start < end; start++, end--) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
}
⑤配列の並べ替え
並べ替えは、小さいものから大きいもの(昇順)または大きいものから小さいもの(降順)です。
例:昇順{11、22、33、44、55}の後の配列{33、11、44、22、55}
import java.util.Arrays;
public class Demo5 {
public static void main(String[] args) {
int[] arr = {
33, 11, 44, 22, 55};
//方式一:冒泡排序
// sort(arr);
//方式二:选择排序
// sort2(arr);
//方式三:通过Arrays工具类提供的sort方法进行排序
Arrays.sort(arr);
//遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
/*
冒泡排序
*/
public static void sort(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;
}
}
}
}
/*
选择排序
*/
public static void sort2(int[] arr) {
//控制轮数
for(int i = 0; i < arr.length - 1; i++) {
//定义一个变量,用来存储每一轮的最小值
int min = arr[i];
//定义一个变量,用来存储每一轮最小值所处的索引位置
/*
此处为什么定义为i?
如果经过一轮比较之后,有更小的值产生了,那么这个index值会更新;
如果经过一轮比较滞后,没有更小的值,那么最小值的索引还是本身,交换之后对结果不产生影响
*/
int index = i;
//控制的是比较的次数
for(int j = i+1; j < arr.length; j++) {
if(min > arr[j]){
min = arr[j];
index = j;
}
}
//拿每一轮实际的最小值和刚开始假定的最小值进行交换
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
バブルソート↓
並べ替えを選択↓
⑥配列を探す
整数が配列に存在するかどうかを見つけるメソッドを提供します。存在する場合は、配列内の整数のインデックスを返します。存在しない場合は、-1を返します。
public class Demo7 {
public static void main(String[] args) {
int[] arr = {
11, 22, 33, 44, 55};
System.out.println(getIndex(arr, 999));
}
/*
两个明确:
返回值类型:int
参数列表:int[] arr, int numser
*/
public static int getIndex(int[] arr, int number) {
//定义一个变量,用来存储索引
int index = -1;
for (int i = 0; i < arr.length; i++) {
if(number == arr[i]) {
index = i;
}
}
return index;
}
}
2次元配列
2次元配列は、複数の1次元配列を要素として構成された配列です。
2.1ステートメント
数据类型[][] 数组名 = new 数据类型[m][n];
解释:
数据类型:就是数组中存放元素的数据类型,这个类型可以是基本数据类型,也可以是引用数据类型
[][]:代表了这是一个二维数组
数组名:就是一个变量名
=:将二维数组的地址赋给数组名(引用)
new:用来在堆上开辟一个空间
数据类型:同上
m和n:
m:一个二维数组中存放了m个一维数组
n:每一个一维数组中的元素个数
2.22次元配列の初期化
①動的初期化
数组名[a][b] = 数据;
如:
arr[0][0] = 11;
arr[0][1] = 22;
arr[1][0] = 33;
arr[1][1] = 44;
②静的初期化
数据类型[][] 数组名 = {
{
元素1, 元素2, ...}, {
元素1, 元素2, ...}, {
元素1, 元素2, ...}, ...};
如:
int[][] arr = {
{
11, 22, 33}, {
44}, {
55, 66}};
2.32次元配列要素の取得
数组名[a][b]
2.42次元配列の走査
public class Demo4 {
public static void main(String[] args) {
int[][] arr = {
{
11, 22, 33}, {
44}, {
55, 66}};
//1. 遍历二维数组获取到每一个一维数组
for(int i = 0; i < arr.length; i++) {
//2. 遍历一维数组
for(int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}