java基礎5 + 陣列
阿新 • • 發佈:2021-01-16
陣列
1.main方法中的陣列
//String[] args陣列:String型別的陣列 args 陣列名字。 [[email protected] (前面有[ 代表此物件為陣列型別)
System.out.println(args);
2.是誰呼叫了main方法:jvm
3.陣列:
//length:檢視陣列的長度
//預設為一個長度為0的陣列
System.out.println(args.length);
//如果通過命令執行程式
//javac
//java -cp path com.briuo.day6.am.ArrTest 10 20 30 -cp:jvm命令 -d (指定CLASSPATH)
//在呼叫主方法時 將10 20 30放到main方法String陣列中 此時args陣列長度為3
//如果args這個陣列中有資料我們可以取出來並使用
//迴圈 1.5新特性 增強for迴圈
/*
*for(資料型別 變數名:容器){ //從容器中取出資料交給變數名
* System.out.println(變數名);
*}
*/
program arguments(程式引數)
VM arguments(jvm引數 -cp -d)
4.//自己宣告一個數組
//陣列宣告的語法: 宣告一個 陣列變數
// 資料型別[] 陣列名
// 資料型別 陣列名字[]
//宣告一個數組不等於建立一個數組;
//Action[] 類陣列 裡面存放 Action物件 int[][] 二維陣列
陣列變數
1.先使用一個已有的型別,然後加上中括號,組合成一個數組型別,然後再宣告這個陣列型別的變數
//1.int[] a; 2.int a[]
//main方法也可以寫為 public static void main(String args[])
//陣列宣告的語法: 宣告一個 陣列變數
// 資料型別[] 陣列名
// 資料型別 陣列名字[]
//宣告一個數組不等於建立一個數組;
陣列物件
1.陣列物件,在記憶體中,就是一塊連續的記憶體空間,在這個連續的空間中,可以存放多個型別相同的資料。
2. 陣列物件中只有一個屬性(length),表示陣列的長度。
3.陣列物件中的方法,只有從父型別Object中繼承過來的方法。
4.除此之外,陣列物件中就沒有其他屬性和方法了。
//陣列的宣告 建立 初始化 以及使用
public class Arr{
public static void main(String[] args){
//宣告一個數組int型別
//建立一個長度為6的陣列
/*
*語法:
* 資料型別[] 陣列名;
* 陣列名 = 呢哇資料型別[長度];
* 資料型別[] 陣列名 = new 資料型別[長度];
*/
//陣列構建成功後陣列內部的每個位置都是有資料的 jvm會在構建陣列時會根據資料型別給一個初始值
//基本資料型別
//引用資料型別: null
int[] arr;
arr = new int[6];
//往下標為0位置設定一個數據
arr[0] = 100
int[] arr1 = new int[6];
//獲取arr1陣列中的全部的資料
for(int index = 0; index < arr1.length; index++){
System.out.println(arr1[index]);
}
//增強for
for(int number : arr1){
System.out.println(number);
}
}
}
陣列長度
陣列物件的長度:
1. 陣列長度,是指在一個數組物件中,最多可以存放多少個同一型別的資料
2. 陣列長度,必須在建立陣列物件的時候就明確指定
3. 陣列長度,一旦確定,就無法再改變
4. 陣列長度,可以為0,但是不能為負數
陣列下標
1.陣列的下標的區間為,[0,arr.length-1],假如陣列的長度為length的話,那麼陣列下標的最小值為0,陣列下標的最大值就是length-1
2.如果使用下標訪問陣列中元素的時候,下標的值超出了其可用範圍,那麼執行就會報錯:
報錯:ArrayIndexOutofBoundsException
//陣列長度一旦確定 不可修改
建立方式
//構建陣列的多種方式 構建陣列的方式不同,但是陣列構建完成後 使用沒有區別
1.先宣告 然後建立 在初始化 使用
//宣告並初始化
int[] arr = new int[3];
//初始化
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
//宣告
int[] arr1;
//構建陣列
arr1 = new int[3];
//初始化
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
2.先宣告 建立 初始化 一步完成
/*
* 資料型別[] 陣列名 = new 資料型別[] {var1,var2...};
* 資料型別[] 陣列名;
* 陣列名 = new 資料型別[]{var1,var2.....};
*/
char[] ch = new char[]{'a','b','c'};
char[] ch1;
ch1 = new char[]{'e','f','g'};
3.//陣列宣告構建初始化的簡寫方式
/*
*必須將宣告建立初始化放在一起 否則就報錯
*資料型別[] 陣列名={var1,var2...};
*/
String[] str = {"Hello","World","lidb"};
陣列的拷貝
//陣列拷貝 System.arraycopy()
public class Arr{
//需求 將陣列長度擴充套件至原來的兩倍 相當於 Arrays.copyOf
public int[] addArray(int[] arr){
//獲取傳遞過來的陣列的長度
//並且以這個長度的2倍構建新陣列
int[] arrNew = new int[arr.length*2];
//把元素組中的內容複製到新陣列中
System.arraycopy(arr,0,arrNew,0,arrNew.length);
//把新陣列返回
return arrNew;
}
public static void main(String args[]){
//需求 將陣列長度擴充套件至原來的兩倍
//原有陣列
int[] arr = {1,2,3};
Arr a = new Arr();
//這個方法完成後會有一個新陣列
int[] arrNew = a.addArray(arr);
//讓原有資料的引用指向新陣列
arr = arrNew;
}
}
陣列工具類
//陣列輔助類 Arrays
//這個類不能構建物件 所有的方法都是靜態方法
int[] arr = {1,5,2,3,6,7,9};
//排序sort
Arrays.sort(arr);
System.out.println(arr);
//arr轉換成字串打印出來
String str = Arrays.toString(arr);
System.out.println(str);
//查詢資料在陣列中的位置(排好序)
int index = Arrays.binarySearch(arr,6);
System.out.println(index);
//陣列的複製 Arrays.copyOf(原陣列,目標陣列的長度)
int arrNew = Arrays.copyOf(arr,arr.length)
System.out.println(Arrays.toString(arrNew));
//複製指定範圍 Arrays.copyOfRange(原陣列,從指定下標(包含),指定位置(不包含))
int[] arrNew1 = Arrays.copyOfRange(arr,1,3); //[1,3)
for(int num:arrNew1){
System.out.println(num);
}
//填充
Arrays.fill(arr,10); //對原陣列內部進行填充 陣列內部全是 10
1.
//求一組資料中的最大值
public class ArrEx{
//需求:一組資料(最大值)
public void maxValue(int[] arr){
//思路 假設有一個最大值(第一個元素為最大值,取陣列中存在的一個數)
int maxValue = arr[0];
//定義一個最大值所在的位置
int naxIndex = 0;
for(int i = 0; i < arr.length;i++){
if(maxValue<arr[i]){
maxValue = arr[i];
maxIndex = i;
}
}
System.out.println("最大值為:" + maxValue);
System.out.println("最大值的位置:" + maxIndex);
}
}
2.
//生成4位的隨機數
//(隨機數中要出現字母數字組合)
public class ArrEx1{
//生成隨機數的方法
/*
* 0-9 a-z A-z arr1 = {A-Z,a-z} 3個字元
*1.先找一個數組 把 z-a A-Z 儲存起來 [0,51]
*2.陣列0-9儲存 [0,9]
*/
public static void randCode(){
//生成一個數組 a-f
String str = "abcdef";
//將字串轉成字元陣列
char[] arr1 = str.toCharArray();
//生成一個數組[0,9]
str = "0123456789";
char[] arr2 = str.toCharArray();
//生成隨機數 把這個隨機數當作下標去陣列中對應位置的資料[0,5] 3個
int index1 = (int)Math.random()*6; //[0.1) 6
int index2 = (int)Math.random()*6; //[0.1) 6
int index3 = (int)Math.random()*6; //[0.1) 6
//[0.9)
int index4 = (int)Math.random()*6; //[0.1) 6
String code = "" + arr1[index1] + arr1[index2] + arr1[index3] + arr2[index4];
System.out.println(code);
}
public static void main(String[] args){
ArrEx1.randCode();
}
}
3.
//對陣列做排序
//氣泡排序
//選擇排序
//插入排序
public class ArrEx3{
//氣泡排序
/*
* int[] arr = {5,1,2,9,1};
* 第一輪:
* 1 5 2 9 1
* 1 2 5 9 1
* 1 2 5 9 1
* 1 2 5 1 9
* for(int i = 0; i < arr.length - 1 -0; i++){
* if(arr[i] > arr[i + 1]){
* //資料交換的方式 三種(中間量 異或)
* int temp = arr[i];
* arr[i] = arr[i+1];
* arr[i+1] = temp;
* }
* }
* 第二輪:
* 1 2 5 1 9
* 1 2 5 1 9
* 1 2 1 5 9
* for(int i = 0; i < arr.length -1 -1;i++){
* if(arr[i] > arr[i + 1]){
* //資料交換的方式 三種(中間量 異或)
* int temp = arr[i];
* arr[i] = arr[i+1];
* arr[i+1] = temp;
* }
* }
* 第三輪:
* 1 2 1 5 9
* 1 1 2 5 9
* for(int i = 0; i < arr.length -1 -2;i++){
* if(arr[i] > arr[i + 1]){
* //資料交換的方式 三種(中間量 異或)
* int temp = arr[i];
* arr[i] = arr[i+1];
* arr[i+1] = temp;
* }
* }
* 第四輪:
* 1 1 2 5 9
* for(int i = 0; i < arr.length -1 -3;i++){
* if(arr[i] > arr[i + 1]){
* //資料交換的方式 三種(中間量 異或)
* int temp = arr[i];
* arr[i] = arr[i+1];
* arr[i+1] = temp;
* }
* }
* //輪數 :
* for(int j = 0; j < arr.length-1; j++){
* for(int i = 0; i < arr.length-1-j;i++){
* if(arr[i] > arr[i + 1]){
* //資料交換的方式 三種(中間量 異或)
* int temp = arr[i];
* arr[i] = arr[i+1];
* arr[i+1] = temp;
* }
* }
* }
*/
public void maoPao(int[] arr){
for(int j = 0; j < arr.length-1; j++){
for(int i = 0; i < arr.length-1-j;i++){
if(arr[i] > arr[i + 1]){
//資料交換的方式 三種(中間量 異或)
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr))
}
//使用選擇排序從大到小
/*
* int[] arr = {5,1,2,9,1};
* 第一輪:[0,4]選出最大的數 以及最大數的位置
* int maxVal = arr[0];
* int maxIndex = 0;
* for(int i = 0; i < arr.length; i ++){
* if(maxVal < arr[i]){
* //交換資料
* maxVal = arr[i];
* //最大位置
* maxIndex = i;
* }
* }
*
* //把最大位置的數 arr[maxIndex] arr[0]
* int temp = arr[0];
* arr[0] = arr[maxIndex];
* arr[maxIndex] = temp;
*
*
* 第二輪:[1,4]找出最大值 跟第一個位置交換
* int maxVal = arr[1];
* int maxIndex = 1;
* for(int i = 1; i < arr.length; i ++){
* if(maxVal < arr[i]){
* //交換資料
* maxVal = arr[i];
* //最大位置
* maxIndex = i;
* }
* }
*
* //把最大位置的數 arr[maxIndex] arr[1]
* int temp = arr[1];
* arr[1] = arr[maxIndex];
* arr[maxIndex] = temp;
*
*
* 第三輪[2,4]找出最大值 跟第2個位置交換
* int maxVal = arr[2];
* int maxIndex = 2;
* for(int i = 2; i < arr.length; i ++){
* if(maxVal < arr[i]){
* //交換資料
* maxVal = arr[i];
* //最大位置
* maxIndex = i;
* }
* }
*
* //把最大位置的數 arr[maxIndex] arr[2]
* int temp = arr[2];
* arr[2] = arr[maxIndex];
* arr[maxIndex] = temp;
*
* 第四輪
* int maxVal = arr[3];
* int maxIndex = 3;
* for(int i = 3; i < arr.length; i ++){
* if(maxVal < arr[i]){
* //交換資料
* maxVal = arr[i];
* //最大位置
* maxIndex = i;
* }
* }
*
* //把最大位置的數 arr[maxIndex] arr[3]
* int temp = arr[3];
* arr[3] = arr[maxIndex];
* arr[maxIndex] = temp;
*
*
* 輪數: 輪數 = 陣列長度-1
* for(int j = 0; j < arr.length-1; j++){
* int maxVal = arr[j];
* int maxIndex = j;
* for(int i = j; i < arr.length; i ++){
* if(maxVal < arr[i]){
* //交換資料
* maxVal = arr[i];
* //最大位置
* maxIndex = i;
* }
* }
*
* //把最大位置的數 arr[maxIndex] arr[j]
* int temp = arr[j];
* arr[j] = arr[maxIndex];
* arr[maxIndex] = temp;
* }
*/
public static void xuazhe(int[] arr){
for(int j = 0; j < arr.length-1; j++){
int maxVal = arr[j];
int maxIndex = j;
for(int i = j; i < arr.length; i ++){
if(maxVal < arr[i]){
//交換資料
maxVal = arr[i];
//最大位置
maxIndex = i;
}
}
//把最大位置的數 arr[maxIndex] arr[j]
int temp = arr[j];
arr[j] = arr[maxIndex];
arr[maxIndex] = temp;
}
}
}