目录
什么是集合
集合和数组很像,是一个放置数据的容器,但他存放的都是java中最常见的东西:对象。
为什么要有集合
程序总是在运行时才知道某些条件,从而去创建对象。但在这之前并不知道对象的数量与类型,也就不能依靠创建命名的引用来持有每一个对象,也就需要在任意时刻和任意位置创建任意数量的对象。那这些对象存哪呢?我们知道,存很多东西的时候,我们第一个想到的就是数组,但数组是静态的,长度已定,所以不能符合我们创建任意数量的要求。咋整呢?于是乎集合应运而生~
怎么用集合
集合的特点:
1,用于存储对象的容器。
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型值。
集合有很多种,大类呢咱们可以分为:Collection集合和Map
为什么这么分呢?
Collection:是独立元素的序列,就好像数组一样,他是一个个的独立的对象,比如说[cat,dog,fish],这就是一个集合,包含三个独立对象。
Map:是一组成对的“键值对”对象,{键,值} 比如说{1,cat}{2,dog}{3,fish}。他有啥好的呢?Map又叫地图,它允许你用键对象来寻找值对象,有点数组下标找数组内容的味道在里面,也像字典里用拼音来找字一样,所以Map也叫“关联数组”,“字典”。
那那么张大图,写的都是啥呢?
我们可以看到,Collection和Map都写着<<接口>>他们两个是高度抽象出来的“爷爷”辈的人物,位高权重的,平时咱们可惹不起。
Collection底下分管着Queue接口(队列)List接口(列表)和Set接口(集)三个得力干将,咱们主要用的呢,都是得力干将们的具体实现。
Map人丁没那么兴旺,主要用的呢,就是TreeMap、HashMap、HashTable。
集合和数组之间的区别
1、数组可以存储基本数据类型和引用数据类型(对象),但只能存储同一种。而集合只能存储引用数据类型(对象),但可以存储不同类型的对象(但我们并不这样做)。
2、数组是静态的,一旦创建长度无法改变。集合容量是动态的,达到条件后可以对集合进行扩容。
3、底层实现不同,数组底层是顺序表,而集合的底层实现有多种结构,比如顺序表、散列表和树等。
而具体的List、Set、Map一篇文章讲不清楚,我们得分多几篇文章来,结合源码,慢慢说明白~
下面我们先讲讲顶层的接口,他们所具有的功能。
Collection接口
作为顶层Collection,它所具有的功能应该是提炼到了最极致的,作为该类型集合(独立序列)应该都需要拥有的功能,具体的实现呢,需要交给具体的结构咯。
咱们先从出生说起,集合作为“数组的补充”,他应该具备什么功能呢?照搬一下数组,基础属性是必须的吧,增删改查是必须的吧,数组还能遍历,咱们也得遍历一下吧。
1、增
boolean add(Object obj):
boolean addAll(Collection coll):
看方法便知道,“增”操作起码有两种,一是增单个对象,二是将一整个集合都增加进来,最后返回的就是“增”这个操作是否成功。
2、删
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
“删”的前两种情况和“增”大同小异,第三种clear是什么呢?就是从该集合中删除所有元素,将集合彻底取空。
3、改
前面说过,Collection是独立元素的序列,在[cat,dog,fish]中将fish改成rat,不就是删掉fish以后增加rat么,所以
4、查
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。
下面是Collection所有的方法,咱们不一一赘述了。
来个例子~
public class DJ_CollectionDemo {
public static void main(String[] args) {
Collection coll = new ArrayList(); //ArrayList后面会说到滴,这里可以先略过,直接看作Collection
show(coll);
}
public static void show(Collection coll) {
// 1.添加元素
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
System.out.println(coll);// [abc1, abc2, abc3] 打印集合会打印集合里的所有值:一个字符串整体
// 2.删除集合
coll.remove("abc2");
System.out.println(coll);// [abc1, abc3] remove会改变集合长度
// coll.clear();
// System.out.println();// 无内容
// 判断
System.out.println(coll.contains("abc4"));// false
System.out.println(coll.contains("abc1"));// true
}
public class DJ_CollectionDemo {
public static void main(String[] args) {
Collection c1 = new ArrayList();
Collection c2 = new ArrayList();
show(c1, c2);
}
//关于ALL类的
public static void show(Collection c1, Collection c2) {
// 给c1添加元素。
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
// 给c2添加元素。
c2.add("abc1");
c2.add("abc2");
c2.add("abc4");
//演示addAll
c1.addAll(c2);//将c2中的元素添加到c1中。
System.out.println(c1);//[abc1, abc2, abc3, abc1, abc2, abc4]
// 演示removeAll
boolean b = c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除。
System.out.println("removeAll:"+b);//true
System.out.println(c1);//[abc3]
// 演示containsAll
boolean b2 = c1.containsAll(c2);
System.out.println("containsAll:"+b2);//false
// 演示retainAll
c2.add("abc3");//c1通过removeAll已经只剩abc3了。c2加一个以演示下面方法
boolean b3 = c1.retainAll(c2);// 取交集,保留和指定的集合相同的元素,而删除不同的元素。
// 和removeAll功能相反 。
System.out.println("retainAll:" + b3);//true
System.out.println("c1:" + c1);//[abc3]
}
5、获取
int size():
Iterator iterator():
public class DJ_IteratorDemo {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll); //[abc1, abc2, abc3, abc4]
//使用了Collection中的iterator()方法。 调用集合中的迭代器方法,是为了获取集合中的迭代器对象。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next()); //类似指针,一开始指向第一个,然后往下指
}
for(Iterator it2 = coll.iterator(); it.hasNext(); ){//优点:若迭代器用过以后就不用了,这种方法能省一点内存
System.out.println(it.next());
}
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());//java.util.NoSuchElementException
}
}
Map接口
那么同理,Map接口也应该是作为“关联数组”里都需要的功能。有什么呢?增删改查了解一下~
1、增
value put(key,value):返回前一个和key关联的值,如果没有返回null.
void putAll(Map<? extends K, ? extends V> m);
2、删
void clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。
3、改
default V replace(K key, V value);
default boolean replace(K key, V oldValue, V newValue)
4、判断
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
5,获取。
value get(key):通过键获取值,如果没有该键返回null。
int size(): 获取键值对的个数。
boolean containsKey(Object key); Map中是否包含此Key
boolean containsValue(Object value);Map中是否包含此Value
public class DJ_MapDemo {
public static void main(String[] args) {
Map<Integer, String> map=new HashMap<Integer, String>();
method(map);
}
public static void method(Map<Integer,String> map) {
//添加元素
System.out.println(map.put(8, "caidj"));//null
System.out.println(map.put(8, "chenp")); //caidj 存相同键,系统会覆盖
map.put(5, "value5");
map.put(2, "value2");
System.out.println(map);//{2=value2, 5=value5, 8=chenp}
System.out.println("******************");
//删除元素
System.out.println("remove:"+map.remove(2));//remove:value2
System.out.println(map);//{5=value5, 8=chenp}
System.out.println("******************");
//判断
System.out.println("containskey:"+map.containsKey(5));
System.out.println("******************");//containskey:true
System.out.println("get:"+map.get(5));//get:value5
}
}
public class DJ_MapDemo {
public static void main(String[] args) {
Map<Integer, String> map=new HashMap<Integer, String>();
method_2(map);
}
public static void method_2(Map<Integer, String> map) {
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
//取出map中所有的元素
//法一:
//原理:通过keySet方法获取map中所有的键所在的Set集合,通过set的迭代器获取每一个键
//再对每一个键获取其对应的值即可
Set<Integer> keySet = map.keySet();
Iterator<Integer> iterator = keySet.iterator();
while(iterator.hasNext()) {
Integer keySet1 =iterator.next();
String string=map.get(keySet1);
System.out.println(keySet1+":"+string);
}
/*法二:entrySet
* 通过Map转成set就可以迭代。
* 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry(类型)
*/
/*
* Set<Map.Entry<Integer, String>> entrySet =map.entrySet();
* Iterator<Map.Entry<Integer, String>> iterator2=entrySet.iterator();
while(iterator2.hasNext()) {
Map.Entry<Integer, String> me = iterator2.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
*/
}
}