1. 程式人生 > 其它 >【Java12】ArrayList類,Object類

【Java12】ArrayList類,Object類

技術標籤:Javajavaobject資料結構

文章目錄


1.ArrayList類

1.1 引入—物件陣列

假設儲存int型別資料,建立int陣列int[] arr=new int[3];假設我們要儲存String型別的資料,則需要建立String型別的陣列,String[] arr=new String[3];

package cn.itcast.sh.demo;

public class
Student { String name; int age; //定義建構函式給屬性初始化值 public Student(String name, int age) { this.name = name; this.age = age; } //給屬性生成get和set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void
setAge(int age) { this.age = age; } }
package cn.itcast.sh.demo;

public class ArrayDemo {
	public static void main(String[] args) {
		//建立Student型別的陣列
		Student[] arr=new Student[3];
		//建立Student類的物件
		Student s1=new Student("heixuanfeng",19);
		Student s2=new Student("bandao"
,18); Student s3=new Student("zhujiao",20); //將學生物件儲存到陣列中 arr[0]=s1; arr[1]=s2; arr[2]=s3; for (int i = 0; i < arr.length; i++) { //通過陣列名和下標取出Student類的陣列中的資料 arr[i] Student s=arr[i]; System.out.println(s.getName()+"====="+s.getAge()); } } }

上面用陣列重複程式碼太多,目前只學習了2種儲存資料的容器:變數 、陣列基本資料型別變數只能儲存基本資料型別,不能儲存物件。引用變數是可以儲存物件的,但是引用變數只能儲存一個物件。

集合容器可以解決上述辦法且還可以簡化上述程式碼的書寫。

1.2 集合與陣列區別

1)長度
陣列:需要固定長度。
集合:長度可以改變,可以根據儲存的資料進行擴容。
2)儲存內容
陣列:可以儲存基本型別資料,還可以儲存引用型別的資料。
集合:只能儲存引用型別的資料,也就是說集合只能儲存類的物件。
3)儲存型別
陣列:只能儲存相同型別的資料。
集合:可以儲存不同型別的資料。(變,只對,不)

1.3 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 = "孫權";        
        System.out.println(list); //[] //列印ArrayList集合
        list.add(s1);
        list.add(s2);
        list.add(s3);
        System.out.println(list); //[曹操, 劉備, 孫權]
    }
}

1.4 常用方法和遍歷

對於元素的操作—增、刪、查。

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));  //get:hello
        System.out.println("get:"+list.get(1));  //get:world
        System.out.println("get:"+list.get(2));  //get:java
       
        //public int size():返回集合中的元素的個數
        System.out.println("size:"+list.size());  //size:3
        
        //public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
        System.out.println("remove:"+list.remove(0)); //remove:hello
        
        for(int i = 0; i < list.size(); i++){
        	System.out.println(list.get(i));  //world java
        }
    }
}

2.Object類

package com.itheima00.question;

public class Demo01 {
    public static void main(String[] args) {
//        C c = new C();
//        c.method02(); // 可以 //static,final修飾的方法都是可以被繼承,但不能重寫
//        c.method01(); // 錯誤 //interface靜態方法不能被繼承,但是class靜態方法可以被繼承

        B b = new C(); //向上轉型,靜態和物件無關,屬於類的。所以面向物件三大特性和靜態無關
		// B b = null;這樣寫下行也一樣,因為和物件無關
        b.method02(); //b method02,不是c method02, 靜態 和 多型 衝突了
    }
}
interface A{
    static void method01(){ //介面中靜態方法不能繼承,肯定不能重寫
    }
}
class B{
    static int i;
    static void method02(){//類中靜態方法可以繼承,但也不能重寫(原因: 靜態方法屬於類的->重寫就多型衝突了,如上b.method02();)
        System.out.println("b method02");
    }
}
class C extends B implements A{
    static void method04(){
        System.out.println("c method02");
    }
    void method03(){ //如下都可以,但注意許可權問題
        super.method02();
        System.out.println(i);
    }
}

2.1 toString

在這裡插入圖片描述

package com.itheima01.object;
import java.util.ArrayList;
/*
*   Object類 : 所有類除Object本身之外(包括陣列)的父類是Object
*   1.  String toString()  返回該物件的字串表示。
*   2.  boolean equals(Object obj)  指示其他某個物件是否與此物件“相等”。
*  
*   toString方法:0. Object中的tostring方法: 物件型別包名類名 + 記憶體地址
*       1. 結論: 如果直接列印物件,呼叫這個物件的toString方法
 *       println(String s) : s會被直接列印
 *       println(Object obj) 原始碼
 *           (obj == null) ? "null" : obj.toString(); 判空 : 避免空指標異常   
		2. 運用:
 *          1. 列印物件記憶體地址是沒有意義, 想要列印物件的屬性值 (方便測試)
 *          2. 解決: 這個類重寫toString方法
 */
public class ObjectDemo01 {
    public static void main(String[] args) {
//        method01(); 

//        Person p = new Person();
        Person p = new Person("zs",18);
        System.out.println(p); //[email protected]  型別包名類名+ 記憶體地址
        System.out.println(p.toString()); //同上 //類中重寫了toString方法後,p和p.toString()兩個都打印出:Person{name='zs',age=18}

        ArrayList<String> list = new ArrayList<>();
        list.add("zs");
        list.add("ls");
        list.add("ww"); //列印引用型別,如果列印的不是記憶體地址,說明重寫了toString
        System.out.println(list.toString()); // [zs,ls,ww]
    }

    public static void method01(){
        int[] array = {1,2,3};
        System.out.println(array.length); //3
        
        String json = array.toString();
        boolean result = array instanceof Object; //驗證陣列的父類是不是Object
        System.out.println(result); //true
    }  
}
class Person{
    String name;
    int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

   /* @Override
    public String toString() {
//        return super.toString();
        String msg = "name:" + name + ",age=" + age;
        return msg;
    }*/
 
   //快捷鍵: alt + insert -> toString 效果如下
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在這裡插入圖片描述

2.2 equals方法

package com.itheima01.object;
import java.util.Objects;
/*
*   Object類中的equals方法
*       1. 預設 :  ==   比較的是記憶體地址
*       2. 運用: 1. 比較記憶體地址已經有== , equals這樣設計沒有意義的
*             2. 想要比較兩個物件的屬性(包括身份證號)是否完全一致 , 實際推斷為是同一物件
*			(實際含義和java記憶體含義不一樣,雖然各自new記憶體不一樣)
*	
*      解決: 重寫equals (兩個物件逐一比較每個屬性,如果兩個物件每個屬性都相同,返回true,否則返回false)
*      快捷鍵:  alt + insert -> equals and hashcode。  equals最主要運用: 雜湊表
*/
public class ObjectDemo02 { 
    public static void main(String[] args) {
        Student s1 = new Student("zs", 18);
        Student s2 = new Student("zs", 18);
        System.out.println(s1 == s2);//false:引用型別比較的是記憶體地址(new出來的記憶體地址肯定不一樣)
        System.out.println(s1.equals(s2)); // false同上,比較的是記憶體地址,如下重寫equals()後為true
    }
}
class Student{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }    
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    /*
        this : s1
        obj : s2
            name ,age -> Student
     */
   /* @Override
    public boolean equals(Object obj) {
        boolean result = obj instanceof Student; //如果是學生型別才繼續往下走
        //boolean result = this.getClass() == obj.getClass();//原始碼中這樣寫,同上
        
        if (!result){ //如果你傳入不是student型別, 兩個絕不一樣,直接return false
            return false; //result為false時,!result為true進入if內return false
        }
        
        //向下轉型: 呼叫子類特有屬性和方法
        Student s2 = (Student) obj;
        boolean result2 = this.name.equals(s2.name);
        if(!result2){
            return false;
        }
        return this.age == s2.age;
    }*/

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

B站/知乎/微信公眾號:碼農程式設計錄
在這裡插入圖片描述