淺談:在開發中我們肯定用到過數組,由於數組的長度是不變的,所以有的時候在開發中會造成不必要的麻煩,比如浪費內存資源,有的人說:“在寫代碼的時候,如果數組的內存不夠用,那我們不是可以重新創建一個數組嗎?”確實可以,但是如果你有一百個數組都不能用了,也就是說你要再次創建一百個數組嗎?我很想說這樣的代碼誰會用呢?你要想一想java的存儲機制,每創建一個對象都要存儲在內存裏的,只是對於使用者並不知道而已,這樣頻繁的創建對象,雖然有垃圾回收機制,其次垃圾回收算法的不完備性,早先採用的某些垃圾回收算法就不能保證100%收集到所有的廢棄內存,當然隨着垃圾回收算法的不斷改進以及軟硬件運行效率的不斷提升,這些問題都可以迎刃而解,但是依然會降低代碼的效率,不要認爲數組寫好了就再也不用改了,其實在生活中爲了適應社會,我們的代碼也要跟的上時代,如果一點變化就全部修改,誰會願意呢?更何況就不存在數組太大用不完嗎?比如數組能存100個數,現在只能存10個數,那其他空間不是浪費了嗎?不是說數組沒用,數組是java語言中內置的數據類型,是線性排列的,執行效率或者類型檢查都是最快的,只是長度不變,如果又不知道自己到底需要多大的空間,很容易造成資源浪費,不利於我們開發,相反集合就解決了這個問題,集合的長度是可變的,其實集合就是特殊的數組,當然了既然是特殊的數組,那有什麼特殊的呢?舉例說明
數組的創建和使用:
public static void main(String[] args) {
int p[]=new int[10];
for(int i=0;i<p.length;i++){
p[i]=i;
}
for(int i=0;i<p.length;i++){
System.out.print(p[i]);
}
}
通過觀察數組只能創建基本類型的數組,也就是隻能存放基本類型的數據,有的人說可以創建類型呀,那我就再舉個例子吧
class Q{
int number=0;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
@Override
public String toString() {
return "Qwer [number=" + number + "]";
}
}
public class qwer {
public static void main(String[] args) {
Q p[]=new Q[10];
for(int i=0;i<p.length;i++){
Q q=new Q();
q.setNumber(i);
p[i]=q;
}
for(int i=0;i<p.length;i++){
System.out.print(p[i].getNumber());
}
}
}
輸出:0123456789
確實可以創建類型,依然能夠完成操作,但是你能存放其他的類型不?不行了吧,你不要告訴我,我就再創建一個類型吧,那要是類型很多呢?這個時候並不是一個好的選擇,但是集合就是存放對象引用的,而且集合包含很多的方法滿足我們的生活需求。
通過上圖我們可以看到都是從Object類繼承過來的,我們就先進入集合的第一部分吧!
- Collection接口
Collection接口的常用方法
1、add(E e) 將指定的對象添加到集合裏
2、remove(Object o) 將指定的對象從集合中移除
3、isEmpty() 判斷當前集合是否爲空,返回boolean類型
4、iterator() 返回在此Collection的元素上進行迭代的迭代器。
5、size() 返回當前集合的長度,也就是集合裏元素的個數
public static void main(String [] args){
Collection<String> list=new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator=list.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next());
}
System.out.println();
list.remove("2");
Iterator<String> iterator2=list.iterator();
while(iterator2.hasNext()){
System.out.print(iterator2.next());
}
}
輸出:123
13
- list集合
list接口繼承了Collection,因此包含了collection中的所有的方法,list接口還定義了兩個非常重要的方法
get(int index):獲得指定索引位置的元素。
set(int index,Object obj):將集合指定索引位置的對象改爲指定的對象。
list接口的常用實現類有ArrayList與LinkedList
經常在開發中用ArrayList,ArrayList類實現了可變的數組,允許保存所有的元素,包括null,並可根據索引位置集合進行快速的隨機訪問:缺點就是插入和刪除比較慢。
簡單舉例說明list集合的使用
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
很明顯集合的索引也是從0開始的
3. set集合
不能包含重複的對象
4. Map集合
Map接口提供了將key映射到值的對象。一個映射不能包含重複的key,每個key最多隻能映射到一個值,Map接口中同樣提供了集合中常用的方法.
put(K key,V value)向集合中加添指定的key與value的映射關係
containsKey(Object obj) 如果此映射包含指定key的映射關係,則返回true
containsValue(Object value)如果此映射將一個或多個key映射到指定值,則返回true
get(Object obj)如果存在指定的key對象,則返回該對象對應的值,否則則返回null
keySet()返回該集合中的所有key對象形成的Set集合
values()返回該集合中所有值對象形成的Collection集合
public static void main(String[] args) {
Map<String, Object> map=new HashMap<String, Object>();
map.put("1","我是1");
map.put("2","我是2");
Set<String> set=map.keySet();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
Collection<Object> collection=map.values();
Iterator<Object> iterator2 = collection.iterator();
while(iterator2.hasNext()){
System.err.println(iterator2.next());
}
}