Java ArrayList中存放引用數(shù)據(jù)類型的方式
ArrayList中存放引用數(shù)據(jù)類型
ArrayList中存放引用類型時(shí),存放的是一個(gè)引用,因此在放入ArrayList之后再進(jìn)行改動(dòng)會(huì)影響到ArrayList中的值
看下面一個(gè)例子
import java.util.ArrayList;
public class Student implements Cloneable{
private int age;
private String name;
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<Student>();
Student st = new Student();
st.age = 10;
st.name = "marco";
students.add(st);
st.age = 20; //修改age值
System.out.println(students.get(0).age); //輸出為20
}
}
同樣,如果ArrayList中存放的也是ArrayList類型,如ArrayList<ArrayList<Integer>>,對(duì)里面ArrayList的修改同樣會(huì)影響到外層的ArrayList,如果想不受到影響可以在放入ArrayList時(shí)進(jìn)行clone操作,對(duì)于ArrayList來說可以使用new ArrayList<ArrayList<Integer>>(list)來進(jìn)行復(fù)制。
Java 引用數(shù)據(jù)類型 ArrayList集合
引用數(shù)據(jù)類型(類)
分類
提到引用數(shù)據(jù)類型(類),其實(shí)我們對(duì)它并不陌生,如使用過的Scanner類、Random類。
我們可以把類的類型為兩種:
- 第一種,Java為我們提供好的類,如Scanner類,Random類等,這些已存在的類中包含了很多的方法與屬性,可供我們使用。
- 第二種,我們自己創(chuàng)建的類,按照類的定義標(biāo)準(zhǔn),可以在類中包含多個(gè)方法與屬性,來供我們使用。
類的定義和使用
java代碼映射成現(xiàn)實(shí)事物的過程就是定義類的過程。
我們就拿一部手機(jī)進(jìn)行分析,它能用來做什么呢?它可以打電話,上網(wǎng),聊微信等,這些就是手機(jī)所提供的功能,也就是方法;手機(jī)也有它的特征,如顏色、尺寸大小、品牌型號(hào)等,這些就是手機(jī)的特征,也就是屬性。
目前,我們只關(guān)注類中的屬性,類中的方法在面向?qū)ο蟛糠衷龠M(jìn)行學(xué)習(xí)。
類的定義格式
創(chuàng)建java文件,與類名相同
public class 類名{
數(shù)據(jù)類型 屬性名稱1;
數(shù)據(jù)類型 屬性名稱2;
…
}
例如:
public class Phone {
/*
* 屬性
*/
String brand;// 品牌型號(hào)
String color;// 顏色
double size; // 尺寸大小
}
類的使用方式
有如下步驟
- 導(dǎo)包:我們將所有的類放到同一個(gè)文件夾下,可以避免導(dǎo)包。
- 創(chuàng)建對(duì)象:數(shù)據(jù)類型 變量名 = new 數(shù)據(jù)類型();
- 調(diào)用方法:目前我們定義的自定義類不涉及方法,只是屬性(自定義類中的方法部分在面向?qū)ο蟛糠种v解)
- 訪問屬性:變量名.屬性(這是當(dāng)前的方式,后期會(huì)采取調(diào)用方法的方式替代掉直接訪問的方式來完成對(duì)屬性的訪問。)
當(dāng)有了Phone數(shù)據(jù)類型的變量后,我們就可以使用Phone類中的屬性了。對(duì)屬性的訪問我們來演示一下,如下所示:
public class Test {
public static void main(String[] args) {
//定義了一個(gè)Phone類型的變量p
Phone p = new Phone();
/*
* 通過p,使用Phone中的屬性
*/
//訪問p中的brand品牌屬性
p.brand = "蘋果6s";
//訪問p中的color顏色屬性
p.color = "白色";
//訪問p中的size尺寸大小屬性
p.size = 5.5;
System.out.println("手機(jī)品牌為" + p.brand);
System.out.println("手機(jī)顏色為" + p.color);
System.out.println("手機(jī)尺寸大小為" + p.size);
}
}
自定義類的內(nèi)存圖演示:
上述代碼中,通過類Phone創(chuàng)建出來的變量p,它相當(dāng)于我們生活中的盒子,里面包含了它能夠使用的屬性。
通過 p.屬性名 就可以對(duì)屬性進(jìn)行操作
與引用類型數(shù)組類似,引用類型的自定義類型的變量,直接變量時(shí),結(jié)果為對(duì)象地址值,這里可以通過內(nèi)存圖簡(jiǎn)單解釋。

ArrayList 集合
ArrayList集合是程序中最常見的一種集合,它屬于引用數(shù)據(jù)類型(類)。在ArrayList內(nèi)部封裝了一個(gè)長(zhǎng)度可變的數(shù)組,當(dāng)存入的元素超過數(shù)組長(zhǎng)度時(shí),ArrayList會(huì)在內(nèi)存中分配一個(gè)更大的數(shù)組來存儲(chǔ)這些元素,因此可以將ArrayList集合看作一個(gè)長(zhǎng)度可變的數(shù)組。
創(chuàng)建
導(dǎo)包:import java.util.ArrayList;
創(chuàng)建對(duì)象:與其他普通的引用數(shù)據(jù)類型創(chuàng)建方式完全相同,但是要指定容器中存儲(chǔ)的數(shù)據(jù)類型:
ArrayList<要存儲(chǔ)元素的數(shù)據(jù)類型> 變量名 = new ArrayList<要存儲(chǔ)元素的數(shù)據(jù)類型>();
l 集合中存儲(chǔ)的元素,只能為<>括號(hào)中指定的數(shù)據(jù)類型元素;
l “<要存儲(chǔ)元素的數(shù)據(jù)類型>”中的數(shù)據(jù)類型必須是引用數(shù)據(jù)類型,不能是基本數(shù)據(jù)類型;
下面給出8種基本數(shù)據(jù)類型所對(duì)應(yīng)的引用數(shù)據(jù)類型表示形式:
|
基本數(shù)據(jù)類型 |
對(duì)應(yīng)的引用數(shù)據(jù)類型表示形式 |
|
byte |
Byte |
|
short |
Short |
|
Int |
Integer |
|
long |
Long |
|
float |
Float |
|
double |
Double |
|
char |
Character |
|
boolean |
Boolean |
下面是一些創(chuàng)建arraylist的實(shí)例:
存儲(chǔ)String類型的元素 ArrayList<String> list = new ArrayList<String>(); 存儲(chǔ)int類型的數(shù)據(jù) ArrayList<Integer> list = new ArrayList<Integer>(); 存儲(chǔ)Phone類型的數(shù)據(jù) ArrayList<Phone> list = new ArrayList<Phone>();
方法
| 返回值類型 | 方法和描述 |
|---|---|
| boolean | add(E e)
將指定的元素添加到集合中
|
| void | add(int index, E element)
在列表中指定的位置上插入指定的元素。
|
| boolean | addAll(Collection<? extends E> c)
追加指定集合的所有元素到這個(gè)列表的末尾,按他們的指定集合的迭代器返回。
|
| boolean | addAll(int index, Collection<? extends E> c)
將指定集合中的所有元素插入到該列表中,從指定位置開始。
|
| void | clear()
從這個(gè)集合中移除所有的元素。
|
| Object | clone()
返回該 ArrayList實(shí)例淺拷貝。
|
| boolean | contains(Object o)
返回 true如果這個(gè)列表包含指定元素。
|
| void | ensureCapacity(int minCapacity)
增加集合的容量,雖說arraylist本省就是可變的,但當(dāng)你可以預(yù)先確定一定容量時(shí),可以增加效率
|
| E | get(int index)
返回此列表中指定元素的位置
|
| int | indexOf(Object o)
返回此列表中指定元素的第一個(gè)出現(xiàn)的索引,或-如果此列表不包含元素,或- 1。
|
| boolean | isEmpty()
返回 true如果此列表不包含元素。
|
| Iterator<E> | iterator()
在這個(gè)列表中的元素上返回一個(gè)正確的順序。
|
| int | lastIndexOf(Object o)
返回此列表中指定元素的最后一個(gè)發(fā)生的索引,或-如果此列表不包含元素,或- 1。
|
| ListIterator<E> | listIterator()
返回列表元素的列表迭代器(在適當(dāng)?shù)捻樞颍?/div>
|
| ListIterator<E> | listIterator(int index)
在列表中的元素上返回列表迭代器(在適當(dāng)?shù)捻樞颍?,從列表中的指定位置開始。
|
| E | remove(int index)
移除此列表中指定位置的元素。
|
| boolean | remove(Object o)
從該列表中移除指定元素的第一個(gè)發(fā)生,如果它是存在的。
|
| boolean | removeAll(Collection<?> c)
從這個(gè)列表中移除包含在指定集合中的所有元素。
|
| boolean | removeIf(Predicate<? super E> filter)
刪除滿足給定謂詞的這個(gè)集合的所有元素。
|
| protected void | removeRange(int fromIndex, int toIndex)
從列表中刪除所有的元素的索引 fromIndex之間,包容性,和 toIndex,獨(dú)家。
|
| void | replaceAll(UnaryOperator<E> operator)
用將運(yùn)算符應(yīng)用到該元素的結(jié)果替換此列表中的每個(gè)元素。
|
| boolean | retainAll(Collection<?> c)
僅保留包含在指定集合中的列表中的元素。
|
| E | set(int index, E element)
用指定元素替換此列表中指定位置的元素。
|
| int | size()
返回此列表中元素的數(shù)目。
|
| void | sort(Comparator<? super E> c)
分類列表使用提供的 Comparator比較元素。
|
| Spliterator<E> | spliterator()
創(chuàng)建一個(gè)后期綁定和快速失敗 Spliterator超過此列表中的元素。
|
| List<E> | subList(int fromIndex, int toIndex)
返回一個(gè)視圖之間的指定 fromIndex,包容,和 toIndex這份名單的部分,獨(dú)家。
|
| Object[] | toArray()
返回一個(gè)數(shù)組,包含在這個(gè)列表中的所有元素在適當(dāng)?shù)捻樞颍◤牡谝粋€(gè)到最后一個(gè)元素)。
|
| <T> T[] | toArray(T[] a)
返回一個(gè)數(shù)組,包含在這個(gè)列表中的所有元素在適當(dāng)?shù)捻樞颍◤牡谝坏阶詈笠粋€(gè)元素);返回?cái)?shù)組的運(yùn)行時(shí)類型是指定的數(shù)組的運(yùn)行時(shí)類型。
|
| void | trimToSize()
裝飾這 ArrayList實(shí)例是列表的當(dāng)前容量。
|
下面是一些實(shí)例:
import java.util.ArrayList;
public class ArrayListDemo01 {
public static void main(String[] args) {
// 創(chuàng)建ArrayList集合
ArrayList<String> list = new ArrayList<String>();
// 向集合中添加元素
list.add("stu1");
list.add("stu2");
list.add("stu3");
list.add("stu4");
// 獲取集合中元素的個(gè)數(shù)
System.out.println("集合的長(zhǎng)度:" + list.size());
// 取出并打印指定位置的元素
System.out.println("第1個(gè)元素是:" + list.get(0));
System.out.println("第2個(gè)元素是:" + list.get(1));
System.out.println("第3個(gè)元素是:" + list.get(2));
System.out.println("第4個(gè)元素是:" + list.get(3));
}
}
注意:ArrayList集合相當(dāng)于是一個(gè)長(zhǎng)度可變的數(shù)組,所以訪問集合中的元素也是采用索引方式訪問,第一個(gè)元素存儲(chǔ)在索引0的位置,第二個(gè)元素存儲(chǔ)在索引1的位置,依次類推
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析電子郵件的基本概念及JavaMail API郵件功能使用
這篇文章主要介紹了電子郵件的基本概念及JavaMail API郵件功能使用,包括用Java來發(fā)送郵件的示例,需要的朋友可以參考下2016-02-02
動(dòng)態(tài)更改Spring定時(shí)任務(wù)Cron表達(dá)式的優(yōu)雅方案實(shí)例詳解
spring定時(shí)器非常強(qiáng)大,但是有時(shí)候我們需要在不需要重啟應(yīng)用就可以動(dòng)態(tài)的改變Cron表達(dá)式的值,下面這篇文章主要給大家介紹了關(guān)于動(dòng)態(tài)更改Spring定時(shí)任務(wù)Cron表達(dá)式的優(yōu)雅方案,需要的朋友可以參考下2022-12-12
一文帶你看懂Java8中的lambda表達(dá)式和方法引用
Lambda 表達(dá)式是 Java 8 引入的一項(xiàng)重要特性,它提供了一種簡(jiǎn)潔、清晰且靈活的語法來表示可傳遞的匿名函數(shù),下面就跟隨小編一起學(xué)習(xí)一下Java8中的lambda表達(dá)式和方法引用的相關(guān)知識(shí)吧2023-12-12
Java中Controller引起的Ambiguous?mapping問題及解決
這篇文章主要介紹了Java中Controller引起的Ambiguous?mapping問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式
這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java 實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽文件夾是否有新文件增加并上傳服務(wù)器功能
本文中主要陳述一種實(shí)時(shí)監(jiān)聽文件夾中是否有文件增加的功能,可用于實(shí)際文件上傳功能的開發(fā)。本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-09-09
帶你重新認(rèn)識(shí)Java動(dòng)態(tài)代理
這篇文章主要為大家介紹了Java的動(dòng)態(tài)代理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-11-11
基于SpringBoot項(xiàng)目實(shí)現(xiàn)Docker容器化部署的主要步驟
部署SpringBoot項(xiàng)目到Docker容器涉及選擇Java運(yùn)行時(shí)環(huán)境的基礎(chǔ)鏡像、構(gòu)建包含應(yīng)用程序的Docker鏡像、編寫Dockerfile、使用docker build命令構(gòu)建鏡像和使用docker run命令運(yùn)行Docker容器等步驟2024-10-10

