如何存儲天天的新聞信息?天天的新聞總數是不固定的,太少浪費空間,太多空間不足。
若是並不知道程序運行時會須要多少對象,或者須要更復雜方式存儲對象,可使用Java集合框架。java
Java 集合框架提供了一套性能優良、使用方便的接口和類,位於 java.util 包中。docker
接口 Collection 存儲一組不惟一,無序的對象,它有兩個子接口 List和Set。List 接口存儲一組不惟一,有序(插入順序)的對象。Set 接口存儲一組惟一,無序的對象。編程
接口 Map 存儲一組鍵值對象,提供 key 到 value 的映射數組
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 文檔中都能查到,必定要學會查看幫助文檔。this
LinkedList 採用鏈表存儲方法。插入、刪除元素時效率比較高。LinkedList提供了對頭部和尾部元素進行添加和刪除的方法。code
下面看一下操做鏈表集合對象
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接口專門處理鍵值映射數據的存儲,能夠根據鍵實現對值得操做,最經常使用的實現類是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包含了鍵和值。
迭代器用來迭代集合,經常使用的兩個方法: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;
這些包裝類的方法過多,你們能夠查閱文檔。
歡迎將查閱到的包裝類的方法發表到留言區