集合
如何存儲每天的新聞資訊?每天的新聞總數是不固定的,太少浪費空間,太多空間不足。
如果并不知道程式運作時會需要多少對象,或者需要更複雜方式存儲對象,可以使用Java集合架構。
Java 集合架構提供了一套性能優良、使用友善的接口和類,位于 java.util 包中。
接口 Collection 存儲一組不唯一,無序的對象,它有兩個子接口 List和Set。List 接口存儲一組不唯一,有序(插入順序)的對象。Set 接口存儲一組唯一,無序的對象。
接口 Map 存儲一組鍵值對象,提供 key 到 value 的映射
List 接口的實作類
ArrayList
ArrayList 實作了長度可變的數組,在記憶體中配置設定連續的空間。周遊元素和随機通路元素的效率比較高。
下面示範使用及常用方法
//Book類存儲書的資訊
public class Book {
private String name;//書名
private float price;//價格
public Book() {
super();
}
public Book(String name, float price) {
super();
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
測試類
import java.util.ArrayList;
import java.util.List;
public class TestArrayList {
public static void main(String[] args) {
List books=new ArrayList();//建立集合
//向集合中添加元素
books.add(new Book("80天環遊世界",34.6f));
books.add(new Book("Java核心技術",88));
books.add(new Book("Java程式設計思想",122));
//擷取集合的長度
System.out.println("集合的長度:"+books.size());
//指定索引移除一個元素
books.remove(0);
System.out.println("移除後集合的長度:"+books.size());
//for循環周遊 ArrayList
for (int i = 0; i < books.size(); i++) {
Book book=(Book) books.get(i);
System.out.println("書名:"+book.getName()+" 價格:"+book.getPrice());
}
//foreach 周遊 ArrayList
for (Object object : books) {
Book book=(Book) object;
System.out.println("書名:"+book.getName()+" 價格:"+book.getPrice());
}
//插入元素到指定索引,其餘元素自動後移
books.add(0, new Book("明朝那些事兒",55));
//移除指定索引元素
books.remove(2);
//清空所有元素
books.clear();
System.out.println("清空集合的長度:"+books.size());
}
}
這裡面的方法在 Java API 文檔中都能查到,一定要學會檢視幫助文檔。
LinkedList
LinkedList 采用連結清單存儲方法。插入、删除元素時效率比較高。LinkedList提供了對頭部和尾部元素進行添加和删除的方法。
下面看一下操作連結清單集合
import java.util.LinkedList;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList books=new LinkedList();//建立連結清單集合
//向集合中添加元素
books.add(new Book("80天環遊世界",34.6f));
//向集合首部添加元素
books.addFirst(new Book("Java核心技術",88));
//向集合尾部添加元素
books.addLast(new Book("Java程式設計思想",122));
System.out.println(books.size());
//擷取第一個
Book book1=(Book) books.getFirst();
System.out.println("書的名字:"+book1.getName());
//擷取最後一個
Book lastBook=(Book) books.getLast();
System.out.println("最後一本書的名字:"+lastBook.getName());
//移除第一個元素
books.removeFirst();
System.out.println("集合長度:"+books.size());
//移除最後一個元素
books.removeLast();
System.out.println("集合長度:"+books.size());
}
}
LinkedList也實作于List接口,是以在ArrayList示例中使用的方法LinkedList都有,LinkedList獨有的方法在上例中,單獨記憶即可。
Map
Map接口專門處理鍵值映射資料的存儲,可以根據鍵實作對值得操作,最常用的實作類是HashMap,Map的鍵不允許重複。
import java.util.HashMap;
import java.util.Map;
public class TestMap {
public static void main(String[] args) {
Map map=new HashMap();
map.put("h", "hello");//向集合中添加鍵和值的映射
map.put("b1", new Book("Java核心技術",88));
System.out.println("集合長度:"+map.size());
map.remove("h");//通過指定的鍵移除鍵和值
//根據鍵擷取指定的值
Book book=(Book) map.get("b1");
System.out.println("書名:"+book.getName());
//周遊Map的值的集合
for (Object temp : map.values()) {
System.out.println(temp);
}
//清空集合
map.clear();
System.out.println("集合長度:"+map.size());
}
}
泛型集合
下面代碼在使用時有沒有問題:
Book book=(Book) books.get(i);
List和Map添加元素時都是Object類型,在強制類型轉換時容易發生異常。JDK1.5使用泛型改寫了集合架構中的接口和類。
使用泛型時要加上一對“<>”,在尖括号内寫上限定的資料類型。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
List<String> names=new ArrayList<String>();
names.add("張三");//隻能添加 String 類型元素
names.get(0).substring(0);//傳回的類型也是指定的類型
//Map在使用時需要同時指定鍵和值的類型
Map<String,String> map=new HashMap<String,String>();
map.put("h", "hello");//鍵和值都隻能是指定的類型
}
}
指定完類型後,元素就是指定的類型的元素,那這樣在存資料和取資料都是指定類型,不需要類型轉換。
使用泛型後,集合的周遊也更加友善,其中示範了foreach周遊Map的三種方法。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class TestEach {
public static void main(String[] args) {
//List的周遊
List<Book> books=new ArrayList<Book>();
books.add(new Book("80天環遊世界",34.6f));
books.add(new Book("Java核心技術",88));
books.add(new Book("Java程式設計思想",122));
//books.add("aaa");//去掉注釋試試
for (Book book : books) {
System.out.println(book.getName());
}
//Map的周遊
Map<String,Book> bookMap=new HashMap<String,Book>();
bookMap.put("java", new Book("Java入門到精通",122));
bookMap.put("docker", new Book("docker入門到精通",122));
//1.周遊鍵擷取值
for (String key : bookMap.keySet()) {
Book book=bookMap.get(key);
System.out.println(book.getName());
}
System.out.println("==============");
//2.周遊值
for (Book book : bookMap.values()) {
System.out.println(book.getName());
}
System.out.println("--------------");
//3.同時周遊鍵和值
for (Entry<String, Book> entry : bookMap.entrySet()) {
String key=entry.getKey();
Book value=entry.getValue();
System.out.println("key:"+key+" value:"+value.getName());
}
}
}
map.keySet() 傳回的是一個 Set 集合,這也是Map的鍵不能重複的原因。entrySet()方法傳回了Entry的集合,Entry包含了鍵和值。
疊代器 Iterator
疊代器用來疊代集合,常用的兩個方法:hasNext()傳回布爾值,判斷是否存在另一個可通路的元素。next()傳回要通路的下一個元素,可以指定為泛型,這樣不需要類型轉換。
下面看一下 List 集合和 Map 使用疊代器。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class TestIterator {
public static void main(String[] args) {
List<Book> books=new ArrayList<Book>();
books.add(new Book("80天環遊世界",34.6f));
books.add(new Book("Java核心技術",88));
books.add(new Book("Java程式設計思想",122));
//擷取疊代器
Iterator<Book> i=books.iterator();
while(i.hasNext()) {
Book book=i.next();
System.out.println("圖書名字:"+book.getName());
}
//Map可以疊代鍵或值
Map<String,Book> bookMap=new HashMap<String,Book>();
bookMap.put("java", new Book("Java入門到精通",122));
bookMap.put("docker", new Book("docker入門到精通",122));
//擷取鍵的疊代器
Iterator<String> iKey=bookMap.keySet().iterator();
while(iKey.hasNext()) {
String key=iKey.next();
System.out.println(key);
}
//值的疊代器寫法類似
Iterator<Book> iValue=bookMap.values().iterator();
while(iValue.hasNext()) {
Book value=iValue.next();
System.out.println(value.getPrice());
}
}
}
疊代器可以和其他循環用法結合,大家可以自己嘗試。
包裝類
先看一下這段代碼是否能編譯呢?
List<int> nums=new ArrayList<int>();
編譯器會提示隻能寫引用類型,java為每個基本資料類型都提供了引用類型。
基本類型 | 引用類型 |
---|---|
int | Integer |
double | Double |
float | Float |
byte | Byte |
long | Long |
這些引用類型指派時可以指派對應的基本類型
Integer i=1;
Float f=2.2f;
也可以像引用類型那樣初始化為null
Integer i=null;
這些包裝類的方法過多,大家可以查閱文檔。
歡迎将查閱到的包裝類的方法發表到留言區