【Java12】ArrayList類,Object類
阿新 • • 發佈:2021-01-25
文章目錄
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站/知乎/微信公眾號:碼農程式設計錄