java集合框架
圖片網(wǎng)上一大堆遗座。
Collection接口
- List接口
ArrayList舀凛、LinkedList、Vector途蒋、Stack - Set接口
HashSet猛遍、LinkedHashSet、TreeSet
Map接口
- HashMap号坡、Hashtable懊烤、LinkedHashMap、TreeMap
Collection(因?yàn)榇_定大小的數(shù)組不能滿足動(dòng)態(tài)改變內(nèi)存分配大小的問(wèn)題宽堆,所以有集合)
Collection
boolean add(E e) //向集合中添加一個(gè)元素腌紧,若添加元素后集合發(fā)生了變化就返回true,若沒(méi)有發(fā)生變化畜隶,就返回false壁肋。
boolean addAll(Collection<? extends E> c) //添加給定集合c中的所有元素到該集合中
void clear() //(optional operation).
boolean contains(Object o) //判斷該集合中是否包含指定對(duì)象
boolean containsAll(Collection<?> c)
boolean equals(Object o)
int hashCode()
boolean isEmpty()//size==0?
Iterator<E> iterator()
boolean remove(Object o) //移除給定對(duì)象的一個(gè)實(shí)例(有的具體集合類(lèi)型允許重復(fù)元素)
boolean removeAll(Collection<?> c) //移除元素集合c
boolean retainAll(Collection<?> c) //僅保留給定集合c中的元素
int size()
Object[] toArray()
<T> T[] toArray(T[] a)
代碼列舉
public class Demo {
public static void main(String[] args) {
Collection datas = new LinkedList();//可以不像數(shù)組那樣指定大小
datas.add("aaa");//添加元素
System.out.println(datas.add("bbb"));//true
if (!datas.contains("ccc")) {
datas.add("ccc");
}
///////////////////////////////////////////
Collection datas1 = new ArrayList();
datas1.add("aaa");
datas1.add("bbb");
//判斷子集合中的所有對(duì)象是否存在
if (datas.containsAll(datas1)) {//true
System.out.println("datas包含datas1");//輸出
}
Collection datas3 = new ArrayList(10);
datas3.add("eee");
datas3.add("fff");
datas3.add("ggg");
datas.addAll(datas3);
//////////////////////////////////////////
System.out.println(datas);//[aaa, bbb, ccc, eee, fff, ggg]
System.out.println(datas.size());//6
datas.remove("ccc");
datas.retainAll(datas3);
System.out.println(datas);//[eee, fff, ggg]
datas.clear();
System.out.println(datas.size());//0
Iterator iterator = datas1.iterator();//迭代器
while (iterator.hasNext()) {
System.out.println(iterator.next());//輸出datas1中所有元素
}
}
}
List(存儲(chǔ)對(duì)象有序,可以包含重復(fù)元素)
-
方法相比Collection多了如下:
E get(int var1);//返回指定下標(biāo)的元素 E set(int var1, E var2);//修改指定下標(biāo)的值 void add(int var1, E var2);//在指定位置添加元素 int indexOf(Object var1);//返回指定元素的下標(biāo) int lastIndexOf(Object var1);//返回指定元素的最后一個(gè)的下標(biāo) ListIterator<E> listIterator();//迭代器 List<E> subList(int var1, int var2);//鏈表截取
代碼例舉:
/**
* List
*/
public class Demo {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("aaa");
list1.add("bbb");
list1.add("ccc");
list1.add("ddd");
list1.add("eee");
list1.add("fff");
list1.add("ggg");
System.out.println(list1.get(4));//eee
System.out.println(list1);//[aaa, bbb, ccc, ddd, eee, fff, ggg]
list1.set(2, "eee");
list1.add(3, "zzz");//指定位置添加元素
System.out.println(list1);//[aaa, bbb, eee, zzz, ddd, eee, fff, ggg]
System.out.println(list1.indexOf("eee"));//2
System.out.println(list1.lastIndexOf("eee"));//5
System.out.println(list1.subList(2, 4));//返回[2,4)左右開(kāi)的元素//[eee, zzz]
}
}
ArrayList(底層數(shù)組實(shí)現(xiàn)(查詢快籽慢,增刪慢))
當(dāng)容量不夠的時(shí)候添加的容量是當(dāng)前的1.5倍
Vector基本用法和ArrayList一樣浸遗,區(qū)別是線程安全(基本不用)
-
底層數(shù)組實(shí)現(xiàn)(查詢快,增刪慢)
/** * ArrayList 基本用法同上 */ public class Demo { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<String>(); list1.add("aaa"); list1.add("bbb"); list1.add("ccc"); list1.add("ddd"); list1.add("eee"); list1.add("fff"); list1.add("ggg"); //錯(cuò)誤寫(xiě)法 /* for (String s : list1) { list1.remove(s);//Exception in thread "main" java.util.ConcurrentModificationException }*/ Iterator<String> iterator = list1.iterator(); //錯(cuò)誤寫(xiě)法 /* while (iterator.hasNext()) { iterator.remove();//Exception in thread "main" java.lang.IllegalStateException }*/ //正確寫(xiě)法 while (iterator.hasNext()) { iterator.next(); iterator.remove(); } System.out.println(list1); } }
LinkedList(用鏈表實(shí)現(xiàn)(增刪快箱亿,查詢慢))
void addFirst(E element);
void addLast(E element);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
boolean add(E e) //把元素e添加到鏈表末尾
void add(int index, E element) //在指定索引處添加元素
都可以從字面上了解它的方法含義跛锌。
- 用鏈表實(shí)現(xiàn)(增刪快,查詢慢)
LinkedList源碼剖析
Set(存儲(chǔ)元素?zé)o序届惋,不能有重復(fù)元素)
HashSet
/**
* Set
* 存儲(chǔ)對(duì)象無(wú)序察净,并且唯一
* 如何判斷對(duì)象的唯一性:根據(jù)Object提供的 int hashCode()和boolean equals(Object obj)方法
* 唯一性的過(guò)程: 先調(diào)用對(duì)象的hashCode()方法驾茴,如果哈希值不相同,則直接添加到集合中氢卡,
* 若哈希值相同锈至,則會(huì)調(diào)用eqauls()方法判斷內(nèi)容是否相同,若返回false译秦,則表示內(nèi)容不同峡捡,
* 那么將其添加到集合中,反之筑悴,返回true時(shí)们拙,則不添加到集合中
*/
public class Demo {
public static void main(String[] args) {
Set set = new HashSet();
set.add("aaa");//添加的時(shí)候就判斷唯一性
set.add("bbb");
set.add("ccc");
set.add("aaa");
set.add("ddd");
set.add("aacca");
set.add("aaa");
System.out.println(set);//[aaa, ccc, bbb, ddd, aacca]
Boolean b = false;
//注:hashCode()相同時(shí),并不一定代表是同一類(lèi)型的對(duì)象
System.out.println(b.hashCode() + "," + new Integer(1237).hashCode());
}
}
TreeSet(比HashSet多了一個(gè)排序功能)
/**
* TreeSet: 數(shù)據(jù)結(jié)構(gòu)是黑紅二叉樹(shù)阁吝,保存數(shù)據(jù)的唯一性同HashSet砚婆,同時(shí)增加的對(duì)象必須是可排序的
* <p>
* 排序方式:
* 1、 增加的對(duì)象類(lèi)突勇,實(shí)現(xiàn)Comparable接口
* 2装盯、 創(chuàng)建比較器,需要?jiǎng)?chuàng)建類(lèi)甲馋,并實(shí)現(xiàn)Comparator接口
*/
public class Demo {
public static void main(String[] args) {
TreeSet treeSet = new TreeSet();
//添加對(duì)象時(shí)埂奈,先確保對(duì)象的唯一性,再調(diào)用String.compareTo(Object obj)比較大小
//默認(rèn)排序方式:從小到大排序(依字符的ASCII碼值或字符串長(zhǎng)度)
treeSet.add("aaa");
treeSet.add("ccc");
treeSet.add("bbb");
treeSet.add("aaa");
treeSet.add("eee");
Iterator iterator = treeSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println(treeSet);//[aaa, bbb, ccc, eee]
}
}
TreeSet添加的元素必須實(shí)現(xiàn)Comparable接口
/**
* 實(shí)現(xiàn)Comparable接口
*/
public class Demo {
public static void main(String[] args) {
//方法一
TreeSet<Person> treeSet = new TreeSet();
treeSet.add(new Person("111"));
treeSet.add(new Person("444"));
treeSet.add(new Person("111"));
treeSet.add(new Person("222"));
treeSet.add(new Person("333"));
System.out.println(treeSet);//[111, 222, 333, 444]
//////////////////////////
//方法二
TreeSet<Animal> treeSet1 = new TreeSet(new MyCompartor());
treeSet1.add(new Animal(111));
treeSet1.add(new Animal(444));
treeSet1.add(new Animal(111));
treeSet1.add(new Animal(222));
treeSet1.add(new Animal(333));
System.out.println(treeSet1);//[111, 222, 333, 444]
}
//方法一
static class Person implements Comparable {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public int compareTo(Object o) {
return this.name.compareTo(((Person) o).name);
}
@Override
public String toString() {
return this.name;
}
}
//方法二
static class Animal {
private int age;
public Animal(int age) {
this.age = age;
}
@Override
public String toString() {
return this.age + "";
}
}
static class MyCompartor implements Comparator<Animal> {
@Override
public int compare(Animal animal, Animal t1) {
return animal.age - t1.age;
}
}
}