1. 程式人生 > >Java SE面向物件--07.Scanner類、Random類、ArrayList類

Java SE面向物件--07.Scanner類、Random類、ArrayList類

學習目標

  • Scanner類

  • Random類

  • ArrayList類

一、 Scanner類

1.1 什麼是Scanner類

如果想把資料改進為鍵盤錄入,提高程式的靈活性。想要完成鍵盤錄入的功能就需要使用java中的Scanner類。

例如,以下程式碼使使用者能夠從 System.in 中讀取一個數:

Scanner sc = new Scanner(System.in);
int i = sc.nextInt();//獲取一個整數

備註:System.in 系統輸入指的是通過鍵盤錄入資料。

1.2 引用型別使用步驟

導包

因為我們要使用的類本身和我們自己定義的類無關 ,所以想要使用某個類中的方法來解決需求的時候,首先需要使用import關鍵字導包,將需要使用的類匯入到我們自己書寫的類中。匯入位置放到class和package之間。引入要使用的型別。java.lang包下的所有類無需匯入。IDEA自動導包快捷鍵ALT+ENTER 格式:

import 包名.類名;

舉例:

java.util.Scanner;

建立物件

想要使用類中的方法就需要使用類的物件,先檢視該類的有無構造方法。如果有就使用該類的構造方法,建立一個該類的物件。 格式:

資料型別  變數名  =  new 資料型別(引數列表);

舉例:

Scanner sc = new Scanner(System.in);

呼叫方法

呼叫該類的成員方法,完成指定功能。後期學習或者自學的方式就是使用哪個類就去API中查詢,檢視是否提供構造方法,如果有提供就建立那個類的物件,然後使用物件呼叫類中的方法,測試方法的作用。 格式:

變數名.方法名();

舉例:

int i = sc.nextInt(); // 接收一個鍵盤錄入的整數

1.3 Scanner使用步驟

檢視類

  • java.util.Scanner :該類需要import匯入後使用。

檢視構造方法

該類提供了大量的構造方法用來建立物件,鍵盤錄入的構造方法用如下:

  • public Scanner(InputStream source) : 構造一個新的 Scanner,它生成的值是從指定的輸入流掃描的。

檢視成員方法

該類或其他類提供了大量的方法用來完成各種功能,因為方法較多,用到哪個講哪個。

  • public int nextInt()
    :將輸入資訊的下一個標記掃描為一個 int 值。

使用Scanner類,完成接收鍵盤錄入資料的操作,程式碼如下:

//1. 導包
import java.util.Scanner;
public class Demo01_Scanner {
    public static void main(String[] args) {
        //2. 建立鍵盤錄入資料的物件
        Scanner sc = new Scanner(System.in);

        //3. 接收資料
        System.out.println("請錄入一個整數:"); // 錄入前提示

        int i = sc.nextInt(); // 輸入int型別資料並將值賦值給左側變數
        double dou = sc.nextDouble(); // 輸入double型別資料並將值賦值給左側變數
        String src = sc.next(); // 輸入String型別資料並將值賦值給左側變數
        char c = sc.next().charAt(0); // 輸入char型別資料並將值賦值給左側變數
        //4. 輸出資料
        System.out.println("i=" + i + "dou=" + dou + "src="  +src + "c=" + c);
    }
}

1.4 練習

求和

鍵盤錄入兩個資料並求和,程式碼如下:

import java.util.Scanner;

public class Test01Scanner {
    public static void main(String[] args) {
        // 建立物件
        Scanner sc = new Scanner(System.in);
        // 接收資料
        System.out.println("請輸入第一個資料:");
        int a = sc.nextInt();
        System.out.println("請輸入第二個資料:");
        int b = sc.nextInt();
        // 對資料進行求和
        int sum = a + b;
        System.out.println("sum:" + sum);
    }
}

取最值

鍵盤錄入三個資料並獲取最大值,程式碼如下:

import java.util.Scanner;

public class Test02Scanner {
    public static void main(String[] args) {
        // 建立物件
        Scanner sc = new Scanner(System.in);
        // 接收資料
        System.out.println("請輸入第一個資料:");
        int a = sc.nextInt();
        System.out.println("請輸入第二個資料:");
        int b = sc.nextInt();
        System.out.println("請輸入第三個資料:");
        int c = sc.nextInt();

        // 如何獲取三個資料的最大值
        int temp = (a > b ? a : b);
        int max = (temp > c ? temp : c);

        System.out.println("max:" + max);

      // 改造為使用迴圈和陣列的方式求最值

       // 建立陣列,將錄入的資料儲存到陣列中
        int[] arr = new int[3];

        // 迴圈錄入資料
        for (int i = 1; i <= 3; i++) {
            System.out.print("請輸入第" + i + "個數據:");
            // 依次將錄入的資料儲存到陣列中,下標從0開始,所以i要-1
            arr[i -1 ] = sc.nextInt();
        }
        // 對陣列進行排序
        Arrays.sort(arr); // 方法功能:對陣列進行由小到大排序(Arrays工具類後面會學到)

        // 最大值一定是陣列的最後一個下標對應的資料
        System.out.println("max = " + arr[arr.length - 1]);
    }
}

1.5 匿名物件【理解】

概念

匿名:匿名指的是沒有名字。

匿名物件:是指沒有名稱的物件。建立物件時,只有建立物件的語句,卻沒有把物件地址值賦值給某個變數。雖然是建立物件的簡化寫法,但是應用場景非常有限。

正常物件的建立格式:

類名 物件名 = new 類名(引數列表);
舉列: Scanner sc = new Scanner(System.in);
說明: =號右側的物件建立結果賦值給了左側的變數空間,可以通過變數多次引用

匿名物件建立格式:

new 類名(引數列表);
舉例: new Scanner(System.in);   new Student();
說明: new物件語句建立完物件之後沒有賦值,只能通過當前物件使用一次

匿名物件應用方式

// 演示匿名物件呼叫成員
class Person{
    // 成員變數
    String  name; // 姓名
    int age; // 年齡
    // 成員方法
    public void say() {
        System.out.println("name = " + name + " , age = " + age );
    }
}
public class PersonTest {
    public static void main(String[] args) {
        // 建立匿名物件,並呼叫成員變數賦值
        new Person().age = 19;
        new Person().name = "班長";
        /*
         建立匿名物件,並呼叫成員方法:
            輸出的結果為name = null , age = 0。原因是多次使用
            new關鍵字在建立物件,沒使用一次new關鍵字就相當於
            創建出一個物件。
        */
        new Person().say();
    }
}

匿名物件使用場景和總結

結論:

​ 1、匿名物件可以呼叫成員變數並賦值,但是這樣的使用方式並沒有意義。同時匿名物件在呼叫方法時,如果方法本身有訪問到成員變數,方法的執行結果依然沒有意義。

​ 2、匿名物件通常是在物件只需要訪問成員一次的情況下使用,如果物件需要多次的操作成員,就不能使用匿名物件來訪問。

​ 3、匿名物件可以簡化程式碼的書寫,並且匿名物件沒有指標指向引用,一旦匿名物件程式碼執行結束,這時這個物件就立刻變成垃圾。節約記憶體成本。

如果物件只使用一次,這時可以採用匿名物件,如果這個物件要使用多次,必須給物件起名。

匿名物件作為引數傳遞(理解)

public static void main(String[] args) {
        // 普通方式 傳遞物件

        // 建立Scanner物件,作為引數傳遞給show方法
        Scanner sc = new Scanner(System.in);
        // 呼叫show方法
        show(sc);

        // 使用匿名物件的方式
        show( new Scanner(System.in) );
    }

    // 引數呼叫時需要傳遞一個Scanner物件、後面大量用到這種寫法、當條件滿足再寫成lambda
    public static void show( Scanner sc ) {
        System.out.println("sc = " + sc);
    }

二、 Random類

2.1 什麼是Random類

Java中使用Random類來封裝和描述隨機數這類事物。此類的例項用於生成隨機數。

例如,以下程式碼使使用者能夠得到一個隨機數:

Random r = new Random();
int i = r.nextInt();//在整數範圍內的任意隨機數

2.2 Random使用步驟

檢視類

  • java.util.Random :該類需要 import匯入使後使用。

檢視構造方法

  • public Random():建立一個新的隨機數生成器。

檢視成員方法

  • public int nextInt(int n):返回一個偽隨機數,範圍在 0 (包括)和指定值 n (不包括)之間的 int 值。 ( java設計api原則:包頭不包尾 )

    舉例:

    • int number = r.nextInt(10);

    • 產生的資料在0到10之間,包括0,不包括10。

    • 括號裡面的10是可以變化的,如果是100,就是0-100之間的資料,包括0,不包括100.

需求:使用Random類,完成生成3個10以內的隨機整數的操作

程式碼如下:

//1. 導包
import java.util.Random;

public class Demo01_Random {
    public static void main(String[] args) {
        //2. 建立鍵盤錄入資料的物件
        Random r = new Random();
        // 使用迴圈,快速完成3個隨機數的乘車
        for(int i = 0; i < 3; i++){
            //3. 隨機生成一個數據
            int number = r.nextInt(10);
            //4. 輸出資料
            System.out.println("number:"+ number);
        }       
    }
}

備註:建立一個Random物件,每次呼叫nextInt(n)方法,都會生成一個隨機數。

2.3 練習

獲取隨機數

獲取1-n之間的隨機數,包含n,程式碼如下:

// 導包
import java.util.Random;

public class Test01Random {
    public static void main(String[] args) {
        int n = 100; 
        // 建立物件
        Random r = new Random();
        // 獲取隨機數
        int number = r.nextInt(n) + 1;
        // 輸出隨機數
        System.out.println("number:" + number);
    }
}

猜數字小遊戲案例

需求:猜數字小遊戲案例,系統產生一個1-100之間的隨機數,請猜出這個資料是多少。

案例程式碼如下所示:

import java.util.Random;
import java.util.Scanner;

// 猜數字遊戲程式碼演示
public class Test_Random {
    public static void main(String[] args) {
        // 生成一個隨機數
        Random r = new Random();
        int ran_number = r.nextInt(100) + 1;
        //System.out.println( ran_number );
        // 鍵盤錄入
        Scanner sc = new Scanner(System.in);
        // 迴圈開始猜數字是否猜對
        while (true) {
            // 輸入猜的數字
            System.out.print("請輸入要猜的數字:");
            int guessNumber = sc.nextInt();

            // 比較錄入的數字和系統產生的隨機數是否相等
            if ( ran_number == guessNumber) {
                System.out.println("恭喜您猜對了!真聰明!!");
                break; // 相等不用繼續猜,結束迴圈

            // 如果不相等在比較其他可能, 如果隨機數比錄入的數字小說明猜大了
            } else if (ran_number < guessNumber) {
                System.out.println("猜大了!!");

            // 進入else說明前面兩種關係都不成立,只能是猜小了
            }else {
                System.out.println("猜小了!!");
            }
        }
    }
}

三、 ArrayList類(very important)

3.1 物件陣列

​ 只能存引用型別的集合、底層用的是陣列

描述學生類,建立3個學生物件並儲存,程式碼如下:

class Student {
  private String name;
  private int age;
  public Student() {
  }
  public Student(String name, int age) {
    this.name = name;
    this.age = age;
  }
  public String getName() {
    return name;
  }
  publicvoid setName(String name) {
    this.name = name;
  }
  publicint getAge() {
    return age;
  }
  publicvoid setAge(int age) {
    this.age = age;
  }
}
public class Test01StudentArray {
  public static void main(String[] args) {
    //建立學生陣列
    Student[] students = new Student[3];

    //建立學生物件
    Student s1 = new Student("曹操",40);
    Student s2 = new Student("劉備",35);
    Student s3 = new Student("孫權",30);

    //把學生物件作為元素賦值給學生陣列
    students[0] = s1;
    students[1] = s2;
    students[2] = s3;

    //遍歷學生陣列
    for(int x=0; x<students.length; x++) {
      Student s = students[x];
      System.out.println(s.getName()+"---"+s.getAge());
    }
  }
}

當我們可以隨著程式執行增加的新的資料時就要用到ArrayList

Java提供了另一個容器java.util.ArrayList 集合類,讓我們可以更便捷的儲存和操作物件資料。

3.2 集合概述

什麼是集合?

​ 集合也是一種容器,作用是用來儲存物件的。隨著我們學習技術的深入,那麼我們在程式中建立的物件也會越來越多。這時在程式中就要想辦法先把這些物件給儲存起來,然後在需要使用這些物件的時候再從容器中把物件取出,最後使用這些物件。

3.3 集合與陣列區別

1)從長度來講:

​ 陣列:需要固定長度。

​ 集合:長度可以改變,可以根據儲存的資料進行擴容。

2)從儲存內容上:

​ 陣列:可以儲存基本型別資料,同時可以儲存引用型別的資料

集合:只能儲存引用型別的資料,也就是說集合只能儲存類的物件。

3)從儲存型別上:

​ 陣列:只能儲存相同型別的資料。

​ 集合:可以儲存不同型別的資料,集合中可以儲存任意型別的引用資料型別。

3.4 ArrayList類

集合容器從jdk1.2之後形成了一個龐大的繼承體系,而我們這裡先學習集合中的一種,叫做ArrayList集合類,

後面會學到 二大體系:collection 單列集合(List、Set)、Map 雙列集合(hashMap)

java.util.ArrayList是大小可變的陣列的實現,儲存在集合內的資料稱為元素。此類提供一些方法來操作內部儲存的元素。ArrayList 中可不斷新增元素,其大小也自動增長。

3.5 ArrayList使用步驟

檢視類

  • java.util.ArrayList <E> :該類需要 import匯入使後使用。

<E> ,表示一種指定的資料型別,叫做泛型。E ,取自Element(元素)的首字母。在出現E 的地方,我們使用一種引用資料型別將其替換即可,表示我們將儲存哪種引用型別的元素。程式碼如下:

ArrayList<String>,ArrayList<Student>

檢視構造方法

  • public ArrayList():構造一個內容為空的集合。

基本格式:

ArrayList<String> list = new ArrayList<String>();

在JDK 7後,右側泛型的尖括號之內可以留空,但是<>仍然要寫。簡化格式:

ArrayList<String> list = new ArrayList<>();

檢視成員方法

  • public boolean add(E e): 將指定的元素新增到此集合的尾部。

    引數 E e,在構造ArrayList物件時,<E>指定了什麼資料型別,那麼add(E e)方法中,只能新增什麼資料型別的物件。

需求:使用ArrayList類,儲存三個字串元素

程式碼如下:

public class Test02StudentArrayList {
    public static void main(String[] args) {
        //建立集合物件
        ArrayList<String> list = new ArrayList<>();

        //定義字串物件
        String s1 = "曹操";
        String s2 = "劉備";
        String s3 = "孫權";

        //列印ArrayList集合
        System.out.println(list);

        //把字串作為元素新增到集合
        list.add(s1);
        list.add(s2);
        list.add(s3);

        //列印ArrayList集合
        System.out.println(list);
    }
}

3.4 常用方法和遍歷

對於元素的操作,基本體現在——增、刪、改、查。常用的方法有:

  • public boolean add(E e):將指定的元素新增到此集合的尾部。

  • public E remove(int index) :移除此集合中指定位置上的元素。返回被刪除的元素。

  • public E get(int index) :返回此集合中指定位置上的元素。返回獲取的元素。

    public e set(int index, E element) 用指定的元素替換此列表中指定位置的元素、返回原來的元素。

  • public int size() :返回此集合中的元素數。遍歷集合時,可以控制索引範圍,防止越界。

這些都是最基本的方法,操作非常簡單,程式碼如下:

public class Demo01ArrayListMethod {
    public static void main(String[] args) {
        //建立集合物件
        ArrayList<String> list = new ArrayList<String>();

        //新增元素
        list.add("hello");
        list.add("world");
        list.add("java");

        //public E get(int index):返回指定索引處的元素
        System.out.println("get:"+list.get(0));
        System.out.println("get:"+list.get(1));
        System.out.println("get:"+list.get(2));

        //public int size():返回集合中的元素的個數
        System.out.println("size:"+list.size());

        //public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
        System.out.println("remove:"+list.remove(0));

        //遍歷輸出
        for(int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
        }
    }
}

3.5 如何儲存基本資料型別

ArrayList集合不能儲存基本型別,只能儲存引用型別的資料。類似<int>屬於基本不能寫,但是儲存基本資料型別對應的包裝型別是可以的。所以java將基本型別資料包裝成對應的包裝類,然後使用對應類中的方法,這樣就可以有更廣泛的操作了。這樣也符合java的萬物皆物件的理論。

所以,想要儲存基本型別資料,<>中的資料型別,必須轉換後才能編寫,轉換寫法如下:

基本型別 基本型別包裝類
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

我們發現,只有IntegerCharacter需要特殊記憶,其他基本型別只是首字母大寫即可。那麼儲存基本型別資料,程式碼如下:

public class Demo02ArrayListMethod {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        System.out.println(list);     
    }
}

3.6 ArrayList練習

數值新增到集合

生成6個1~33之間的隨機整數,新增到集合,並遍歷

public class Test01ArrayList {
    public static void main(String[] args) {
        // 建立Random 物件
        Random random = new Random();

        // 建立ArrayList 物件
        ArrayList<Integer> list = new ArrayList<>();

        // 新增隨機數到集合
        for (int i = 0; i < 6; i++) {
            int r = random.nextInt(33) + 1;
            list.add(r);
        }

        // 遍歷集合輸出
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

物件新增到集合

自定義4個學生物件,新增到集合,並遍歷

public class Test02ArrayList {
    public static void main(String[] args) {
        //建立集合物件
        ArrayList<Student> list = new ArrayList<Student>();

        //建立學生物件
        Student s1 = new Student("趙麗穎",18);
        Student s2 = new Student("唐嫣",20);
        Student s3 = new Student("景甜",25);
        Student s4 = new Student("柳巖",19);

        //把學生物件作為元素新增到集合中
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);

        //遍歷集合
        for(int x = 0; x < list.size(); x++) {
            Student s = list.get(x);
            System.out.println(s.getName()+"---"+s.getAge());
        }
    }
}

列印集合方法

定義以指定格式列印集合的方法(ArrayList型別作為引數),使用{}擴起集合,使用@分隔每個元素。格式參照 {元素@元素@元素}。

public class Test03ArrayList {
    public static void main(String[] args) {
        // 建立集合物件
        ArrayList<String> list = new ArrayList<String>();

        // 新增字串到集合中
        list.add("張三丰");
        list.add("宋遠橋");
        list.add("張無忌");
        list.add("殷梨亭");

        // 呼叫方法
        printArrayList(list);
    }

    public static void printArrayList(ArrayList<String> list) {
        // 拼接左括號
        System.out.print("{");
        // 遍歷集合
        for (int i = 0; i < list.size(); i++) {
            // 獲取元素
            String s = list.get(i);
            // 拼接@符號
            if (i != list.size() - 1) {
                System.out.print(s + "@");
            } else {
                // 拼接右括號
                System.out.print(s + "}");
            }
        }
    }
}

獲取集合方法

定義獲取所有偶數元素集合的方法(ArrayList型別作為返回值)。

分析:將生成的1-1000的隨機數新增到集合ArrayList中,一共新增10個隨機數。

public class Test04ArrayList {
    public static void main(String[] args) {
        // 建立Random 物件
        Random random = new Random();
        // 建立ArrayList 物件
        ArrayList<Integer> list = new ArrayList<>();

        // 新增隨機數到集合
        for (int i = 0; i < 10; i++) {
            int r = random.nextInt(1000) + 1;
            list.add(r);
        }
        // 呼叫偶數集合的方法
        ArrayList<Integer> arrayList = getArrayList(list);
        System.out.println(arrayList);
    }

    public static ArrayList<Integer> getArrayList(ArrayList<Integer> list) {
        // 建立小集合,來儲存偶數
        ArrayList<Integer> smallList = new ArrayList<>();

        // 遍歷list
        for (int i = 0; i < list.size(); i++) {
            // 獲取元素
            Integer num = list.get(i);
            // 判斷為偶數,新增到小集合中
            if (num % 2 == 0){
                smallList.add(num);
            }
        }
        // 返回小集合
        return smallList;
    }
}

**

補充內容:集合遍歷總結(瞭解)

** Java集合遍歷的幾種方法:

Map遍歷方式:

1、通過獲取所有的key按照key來遍歷
//Set<Integer> set = map.keySet(); //得到所有key的集合
for (Integer in : map.keySet()) {
    String str = map.get(in);//得到每個key多對用value的值
}

2、通過Map.entrySet使用iterator遍歷key和value
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
     Map.Entry<Integer, String> entry = it.next();
       System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}

3、通過Map.entrySet遍歷key和value,推薦,尤其是容量大時
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    //Map.entry<Integer,String> 對映項(鍵-值對)  有幾個方法:用上面的名字entry
    //entry.getKey() ;entry.getValue(); entry.setValue();
    //map.entrySet()  返回此對映中包含的對映關係的 Set檢視。
    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}

4、通過Map.values()遍歷所有的value,但不能遍歷key
for (String v : map.values()) {
    System.out.println("value= " + v);
}

List遍歷方式:
第一種:
for(Iterator iterator = list.iterator();iterator.hasNext();){                    
    int i = (Integer) iterator.next();                   
    System.out.println(i);               
}
第二種:
Iterator iterator = list.iterator();
while(iterator.hasNext()){
    int i = (Integer) iterator.next();
    System.out.println(i);
}
第三種:
for (Object object : list) { 
    System.out.println(object); 
}
第四種:
for(int i = 0 ;i<list.size();i++) {  
    int j= (Integer) list.get(i);
    System.out.println(j);  
}