最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java.SE數(shù)組的一些常見(jiàn)練習(xí)題

 更新時(shí)間:2024年02月05日 08:31:12   作者:辭七七  
數(shù)組可以看成是相同類(lèi)型元素的一個(gè)集合,在內(nèi)存中是一段連續(xù)的空間,這篇文章主要給大家介紹了關(guān)于Java.SE數(shù)組的一些常見(jiàn)練習(xí)題,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. 數(shù)組轉(zhuǎn)字符串

數(shù)組轉(zhuǎn)字符串我們需要借助工具類(lèi)

代碼示例

import java.util.Arrays  //Java中的包 

public class TestDemo {
    public static int[] func() {
        return new int[]{1,2,3,4,5,6};
    }
    public static void main(String[] args) {
        int[] ret = func();

        //這個(gè)方法主要將參數(shù)的數(shù)組轉(zhuǎn)化為字符串輸出
       String s = Arrays.toString(ret);
        //Ctrl+鼠標(biāo)點(diǎn)擊,可以跳轉(zhuǎn)到這個(gè)方法的原碼
        
        System.out.println(s);
    }
}


//執(zhí)行結(jié)果
[1, 2, 3, 4, 5, 6]

使用這個(gè)方法后續(xù)打印數(shù)組就更方便一些.

Java 中提供了 java.util.Arrays 包,其中包含了一些操作數(shù)組的常用方法。

我們可以在jdk里搜索一下Arrays的用法,如圖所示:

1.1 自己實(shí)現(xiàn)一個(gè)tostring函數(shù)

定義一個(gè)myToString的方法,利用for循環(huán)和if判斷來(lái)解決問(wèn)題

代碼示例:

public class TestDemo {

    public static String myToString(int[] array){
        String ret = "[";
        for (int i = 0; i < array.length; i++) {
            ret += array[i];
           if (i != array.length -1){
               ret += ",";
           }
        }
        ret += "]";
        return ret;
    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        String ret = myToString(array);
        System.out.println(ret);
    }
}

打印結(jié)果:

2. 數(shù)組拷貝

先來(lái)看一個(gè)簡(jiǎn)單的數(shù)組拷貝:

使用for循環(huán)來(lái)完成的拷貝

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = new int[array.length];
        for (int i = 0; i < array.length; i++) {
            copy[i] = array[i];
        }
        System.out.println(Arrays.toString(copy));
    }
}

打印結(jié)果:

以下代碼是不是拷貝

答案:不是

在上述代碼中我們可以通過(guò)修改形參的值來(lái)改變實(shí)參

// array3和array2引用的是同一個(gè)數(shù)組
  // 因此array3修改空間中內(nèi)容之后,array2也可以看到修改的結(jié)果
  int[] array2 = {1,2,3,4,5};
  int[] array3 = array2;
  array3[0] = 10;
  System.out.println("newArr: " + Arrays.toString(array2));

我們可以不用for循環(huán)來(lái)拷貝數(shù)組,直接用Arrays中的copyof方法來(lái)完成

import java.util.Arrays

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = Arrays.copyOf(array,array.length);
        System.out.println(Arrays.toString(copy));
        
    }
}

//使用Arrays中copyOf方法完成數(shù)組的拷貝:
// copyOf方法在進(jìn)行數(shù)組拷貝時(shí),創(chuàng)建了一個(gè)新的數(shù)組
// array和copy引用的不是同一個(gè)數(shù)組

數(shù)組的擴(kuò)容:array.length后 *2 就是擴(kuò)大兩倍

代碼示例:

import java.util.Arrays

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = Arrays.copyOf(array,array.length*2);
        System.out.println(Arrays.toString(copy));

    }
}

運(yùn)行結(jié)果:

拷貝某個(gè)范圍

代碼示例

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        //取下標(biāo)為1到3的數(shù)字
        int[] copy = Arrays.copyOfRange(array,1,3);
        System.out.println(Arrays.toString(copy));
    }
}

運(yùn)行結(jié)果:

如果下標(biāo)范圍過(guò)大,則能拷貝多少拷貝多少,其余位置用0補(bǔ)全

畫(huà)圖對(duì)比看一下拷貝和指向的區(qū)別

注意: 數(shù)組當(dāng)中存儲(chǔ)的是基本類(lèi)型數(shù)據(jù)時(shí),不論怎么拷貝基本都不會(huì)出現(xiàn)什么問(wèn)題,但如果存儲(chǔ)的是引用數(shù)據(jù)類(lèi)型,拷貝時(shí)需要考慮深淺拷貝的問(wèn)題,關(guān)于深淺拷貝在后續(xù)詳細(xì)給大家介紹。

crtl+鼠標(biāo)左鍵,單擊copyOfRange來(lái)查看他的原碼看一下他是怎么運(yùn)行的

在這里crtl+鼠標(biāo)左鍵,單擊arraycopy,來(lái)看一下他是怎么實(shí)現(xiàn)的

可以看到他的參數(shù)如下圖所示:

按照以上參數(shù)用自己代碼實(shí)現(xiàn)如下:

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] copy = new int[array.length];
        System.arraycopy(array,0,copy,0,array.length);
        System.out.println(Arrays.toString(copy));
    }
}

3. 求數(shù)組中元素的平均值

給定一個(gè)整型數(shù)組, 求平均值

代碼示例:

public static void main(String[] args) {
   int[] arr = {1,2,3,4,5,6};
   System.out.println(avg(arr));
}

public static double avg(int[] arr) {
   int sum = 0;
   for (int x : arr) {
     sum += x;
   }
   return (double)sum / (double)arr.length;
   //需要強(qiáng)轉(zhuǎn)成double型
}

  // 執(zhí)行結(jié)果
  3.5

4. 查找數(shù)組中指定元素(順序查找)

給定一個(gè)數(shù)組, 再給定一個(gè)元素, 找出該元素在數(shù)組中的位置.

代碼示例:

public static void main(String[] args) {
   int[] arr = {1,2,3,10,5,6};
   System.out.println(find(arr, 10));
}
public static int find(int[] arr, int data) {
   for (int i = 0; i < arr.length; i++) {
     if (arr[i] == data) {
       return i;//找到返回下標(biāo)
     }
   }
   return -1; // 表示沒(méi)有找到
}
// 執(zhí)行結(jié)果
3

5. 查找數(shù)組中指定元素(二分查找)

針對(duì)有序數(shù),可以使用更高效的二分查找。

什么叫有序數(shù)組?
有序分為 “升序” 和 “降序”
如 1 2 3 4 ,依次遞增即為升序。
如 4 3 2 1 ,依次遞減即為降序。

如果數(shù)組為無(wú)序數(shù)組,可以用 Arrays.sort(array)這個(gè)方法對(duì)其進(jìn)行排序

代碼所示:

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,3,2,6,4,5};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
    }
}

打印結(jié)果:

以升序數(shù)組為例,二分查找的思路是先取中間位置的元素,然后使用待查找元素與數(shù)組中間元素進(jìn)行比較:

  • 如果相等,即找到了返回該元素在數(shù)組中的下標(biāo)
  • 如果小于,以類(lèi)似方式到數(shù)組左半側(cè)查找
  • 如果大于,以類(lèi)似方式到數(shù)組右半側(cè)查找

畫(huà)圖理解

當(dāng)我們想找的是4時(shí)

代碼示例:

public static void main(String[] args) {
   int[] arr = {1,2,3,4,5,6};
   System.out.println(binarySearch(arr, 6));
}
public static int binarySearch(int[] arr, int toFind) {
   int left = 0;
   int right = arr.length - 1;
   while (left <= right) {
     int mid = (left + right) / 2;
     if (toFind < arr[mid]) {
       // 去左側(cè)區(qū)間找
       right = mid - 1;
     } else if (toFind > arr[mid]) {
       // 去右側(cè)區(qū)間找
l      eft = mid + 1;
     } else {
       // 相等, 說(shuō)明找到了
       return mid;
     }
   }
   // 循環(huán)結(jié)束, 說(shuō)明沒(méi)找到
   return -1;
}
// 執(zhí)行結(jié)果
5

可以看到,針對(duì)一個(gè)長(zhǎng)度為 10000 個(gè)元素的數(shù)組查找,二分查找只需要循環(huán) 14 次就能完成查找。隨著數(shù)組元素個(gè)數(shù)越多,二分的優(yōu)勢(shì)就越大。

我們也可以直接調(diào)用Java中的binarySearch方法來(lái)直接找下標(biāo)

代碼演示:

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,3,2,6,4,5};
        Arrays.sort(array);
        System.out.println(Arrays.binarySearch(array,5));
    }
}

運(yùn)行結(jié)果:

擴(kuò)展:Java中的Attays方法

例如:比較兩個(gè)數(shù)組兩個(gè)對(duì)應(yīng)位置數(shù)字的大小是否相等用Arrays.equals()的方法

代碼演示:

 public static void main(String[] args) {
        int[] array1 = {1,2,3,4,5};
        int[] array2 = {1,2,3,4,5};
        boolean flg = Arrays.equals(array1,array2);
        System.out.println(flg);
    }

結(jié)果為

填充一個(gè)數(shù)組時(shí)用Arrays.fill()的方法

代碼演示:

public static void main(String[] args) {
        int[] array3 = new int[10];
        Arrays.fill(array3,-1);
        System.out.println(Arrays.toString(array3));
    }

打印結(jié)果為:

也可選擇填充位置 Arrays.fill(array3,1,4,-1);,把括號(hào)里邊改成1~4下標(biāo)的數(shù)字,填充為-1

6. 數(shù)組排序(冒泡排序)

給定一個(gè)數(shù)組, 讓數(shù)組升序 (降序) 排序。

假設(shè)排升序:

  • 將數(shù)組中相鄰元素從前往后依次進(jìn)行比較,如果前一個(gè)元素比后一個(gè)元素大,則交換,一趟下來(lái)后最大元素就在數(shù)組的末尾
  • 依次從上述過(guò)程執(zhí)行,直到數(shù)組中所有的元素都排列好

我們來(lái)看一下4,8,9,3,6的排序圖

代碼示例:

public class TestDemo {
    public static void bubbleSort(int[] array) {
        //i代表的是趟數(shù)??!
        for (int i = 0; i < array.length-1; i++) {
            //j代表每一趟比較的次數(shù)
            boolean flg = false;
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    flg = true;
                }
            }
            if(flg == false) {
                break;//說(shuō)明有序了?。?!
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = {9, 5, 2, 7};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

//運(yùn)行結(jié)果
[2, 5, 7, 9]

冒泡排序性能較低。Java 中內(nèi)置了更高效的排序算法

public static void main(String[] args) {
   int[] arr = {9, 5, 2, 7};
   Arrays.sort(array);
   System.out.println(Arrays.toString(array));
}

關(guān)于 Arrays.sort 的具體實(shí)現(xiàn)算法, 我們?cè)诤竺娴呐判蛩惴ㄕn上再詳細(xì)介紹. 到時(shí)候我們會(huì)介紹很多種常見(jiàn)排序算法.

7. 數(shù)組逆序

給定一個(gè)數(shù)組,將里面的元素逆序排列。

思路設(shè)定兩個(gè)下標(biāo),分別指向第一個(gè)元素和最后一個(gè)元素,交換兩個(gè)位置的元素,然后讓前一個(gè)下標(biāo)自增,后一個(gè)下標(biāo)自減,循環(huán)繼續(xù)即可。

代碼示例:

public static void main(String[] args) {
   int[] arr = {1, 2, 3, 4};
   reverse(arr);
   System.out.println(Arrays.toString(arr));
}
public static void reverse(int[] arr) {
   int left = 0;
   int right = arr.length - 1;
   while (left < right) {
     int tmp = arr[left];
     arr[left] = arr[right];
     arr[right] = tmp;
     left++;
     right--;
   }
}

運(yùn)行結(jié)果:

庫(kù)里邊沒(méi)有方法可以直接數(shù)組逆序

8. 二維數(shù)組

二維數(shù)組本質(zhì)上也就是一維數(shù)組,只不過(guò)每個(gè)元素又是一個(gè)一維數(shù)組。
基本語(yǔ)法

數(shù)據(jù)類(lèi)型[][] 數(shù)組名稱(chēng) = new 數(shù)據(jù)類(lèi)型 [行數(shù)][列數(shù)] { 初始化數(shù)據(jù) };初始化示例:

int[][] arr = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
int[][] arr1 = new int[][]{{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};
int[][] arr2 = new int[2][3]

通過(guò)array[行][列]的坐標(biāo)來(lái)訪(fǎng)問(wèn)某一個(gè)值

圖解:

代碼示例:

int[][] arr = {
   {1, 2, 3, 4},
   {5, 6, 7, 8},
   {9, 10, 11, 12}
};
for (int i = 0; i < arr.length; i++) {
   for (int j = 0; j < arr[i].length; j++) {
     System.out.printf("%d\t", arr[i][j]);
   }
   System.out.println("");
}
// 執(zhí)行結(jié)果
1 2 3 4
5 6 7 8
9 10 11 12

二維數(shù)組的用法和一維數(shù)組并沒(méi)有明顯差別,因此我們不再贅述。

同理,還存在 “三維數(shù)組”,“四維數(shù)組” 等更復(fù)雜的數(shù)組,只不過(guò)出現(xiàn)頻率都很低。

我們?nèi)绻胫苯哟蛴《S數(shù)組要用什么呢?

我們知道一維數(shù)組的打印用Arrays.toString(),但是用它打印二維數(shù)組打印的是數(shù)組的地址

所以我們要用Arrays.deepToString()的方法直接打印二維數(shù)組

代碼演示:

int[][] arr = {
       {1, 2, 3, 4},
       {5, 6, 7, 8},
       {9, 10, 11, 12}
};
  System.out.println(Arrays.deepToString(arr));

在這里插入圖片描述

不規(guī)則的二維數(shù)組代碼演示:

public static void main(String[] args) {
        int[][] array = new int[2][];
        array[0] = new int[]{1,2,3};
        array[1] = new int[]{4,5,6,7,8,9};

        System.out.println(Arrays.deepToString(array));
    }
//運(yùn)行結(jié)果
[[1, 2, 3], [4, 5, 6, 7, 8, 9]]

可以指定二維數(shù)組的長(zhǎng)度,這時(shí)可以省略他的列

畫(huà)圖解釋?zhuān)?/p>

總結(jié) 

到此這篇關(guān)于Java.SE數(shù)組的一些常見(jiàn)練習(xí)題的文章就介紹到這了,更多相關(guān)Java.SE數(shù)組練習(xí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java分支循環(huán)與數(shù)組核心知識(shí)點(diǎn)總結(jié)

    Java分支循環(huán)與數(shù)組核心知識(shí)點(diǎn)總結(jié)

    這篇文章主要介紹了Java分支循環(huán)與數(shù)組核心知識(shí)點(diǎn)總結(jié)的相關(guān)資料,理解循環(huán)與分支結(jié)構(gòu)是掌握編程的基礎(chǔ),重復(fù)執(zhí)行操作的循環(huán)和基于條件的執(zhí)行路徑分支有助于構(gòu)建復(fù)雜的程序邏輯,需要的朋友可以參考下
    2026-01-01
  • Spring Cloud Gateway詳細(xì)使用最佳實(shí)踐

    Spring Cloud Gateway詳細(xì)使用最佳實(shí)踐

    Spring Cloud Gateway 是 Spring Cloud 生態(tài)系統(tǒng)中的現(xiàn)代化 API 網(wǎng)關(guān)組件,用于構(gòu)建微服務(wù)架構(gòu)中的統(tǒng)一入口網(wǎng)關(guān),本文介紹Spring Cloud Gateway詳細(xì)使用最佳實(shí)踐,感興趣的朋友一起看看吧
    2025-11-11
  • Java解析方法的調(diào)用關(guān)系示例詳解

    Java解析方法的調(diào)用關(guān)系示例詳解

    這篇文章主要介紹了Java解析方法的調(diào)用關(guān)系,方法在Java編程中用于封裝重復(fù)的代碼,提高代碼復(fù)用性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • SpringBoot多環(huán)境配置及日志記錄器詳解

    SpringBoot多環(huán)境配置及日志記錄器詳解

    這篇文章主要介紹了SpringBoot多環(huán)境配置及日志記錄器詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Spring5新特性之Reactive響應(yīng)式編程

    Spring5新特性之Reactive響應(yīng)式編程

    這篇文章主要介紹了Spring5新特性之Reactive響應(yīng)式編程,響應(yīng)式編程是一種編程范式,通用和專(zhuān)注于數(shù)據(jù)流和變化的,并且是異步的,下文更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • java8中:: 用法示例(JDK8雙冒號(hào)用法)

    java8中:: 用法示例(JDK8雙冒號(hào)用法)

    這篇文章主要給大家介紹了關(guān)于java8 中的:: 用法(JDK8雙冒號(hào)用法)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java使用easyExcel實(shí)現(xiàn)Excel文件解析

    Java使用easyExcel實(shí)現(xiàn)Excel文件解析

    這篇文章主要為大家詳細(xì)介紹了Java如何使用easyExcel實(shí)現(xiàn)Excel文件解析,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Java指令重排引發(fā)問(wèn)題及解決方案

    Java指令重排引發(fā)問(wèn)題及解決方案

    指令重排是JVM在解釋執(zhí)行Java代碼時(shí)對(duì)指令順序進(jìn)行重新排列的一種優(yōu)化技術(shù),本文主要介紹了Java指令重排引發(fā)問(wèn)題及解決方案,感興趣的可以了解一下
    2023-08-08
  • Java 線(xiàn)程池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 線(xiàn)程池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    系統(tǒng)啟動(dòng)一個(gè)新線(xiàn)程的成本是比較高的,因?yàn)樗婕暗脚c操作系統(tǒng)的交互。在這種情況下,使用線(xiàn)程池可以很好的提供性能,尤其是當(dāng)程序中需要?jiǎng)?chuàng)建大量生存期很短暫的線(xiàn)程時(shí),更應(yīng)該考慮使用線(xiàn)程池
    2017-05-05
  • Java8新特性之線(xiàn)程安全日期類(lèi)

    Java8新特性之線(xiàn)程安全日期類(lèi)

    這篇文章主要介紹了Java8新特性之線(xiàn)程安全日期類(lèi),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

浦江县| 依安县| 监利县| 斗六市| 盐边县| 宿州市| 通海县| 余干县| 同江市| 巧家县| 内丘县| 泗阳县| 靖西县| 井陉县| 襄樊市| 定边县| 北川| 上思县| 白沙| 博爱县| 房山区| 双辽市| 怀来县| 顺义区| 广平县| 那曲县| 思南县| 金秀| 澄江县| 嘉禾县| 新巴尔虎左旗| 莫力| 平安县| 凤山县| 安图县| 永善县| 漯河市| 卓资县| 伊川县| 深泽县| 鄱阳县|