一.集合
1.collection集合
collection本身是一个接口,不能实例化,只能通过自实现类实例化
先说一说集合和数组的区别:
1)长度的区别
数组:长度是固定的
集合: 长度是可变的
2)内容的区别
数组:只能存储同一种类型的元素 int[] arr = new int[3] ;
集合:他可以存储任意类型的元素
3)存储数据类型的问题
数组:既可以存储基本数据类型,又可以存储引用数据类型 … String[] Student[]
集合: 只能存储引用数据类型
1.1collection集合的基本功能
- boolean add(Object e):添加任意类型的元素
- boolean remove(Object o):删除指定的元素
- void clear() : 暴力删除(删除集合中的所有元素)
- boolean contains(Object o) :是否包含指定的元素,如果包含,返回true
- boolean isEmpty():判断集合是否为空
- Iterator iterator():获取集合的迭代器(集合专用遍历方式)(单独讲)
- Object[] toArray():将集合转换成对象数组(单独讲)
- int size():获取集合的元素数
- boolean retainAll(Collection c):一个集合对另一个集合取交集
1.2collection集合基本功能的代码示例
package com.qianfeng;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
Collection c = new ArrayList() ;
//添加元素
c.add("1");
c2.add("1");
c.add("2");
c2.add("2");
c.add("3");
c2.add("3");
c.add(4);
c.add('a');
c.add("爱java,爱生活");
c2.add("爱java,爱生活");
System.out.println(c);
c.remove(4);//删除元素4
c.remove('a');//删除字符'a'
System.out.println(c);
System.out.println("size():" + c.size());//元素数
System.out.println("isEmpty:" + c.isEmpty());//判断是否为空
System.out.println("contains:" + c.contains("2"));//判断是否包含这个元素
c.clear();//暴力删除所有元素
System.out.println(c);
System.out.println("c2.retainAll(c)" + c2.retainAll(c));
//如果一个集合A对一个集合B取交集,交集的元素保存在A集合中,B集合不变的
//返回值boolean表达的意思A集合中的元素,是否发生变化,如果没有发生变化,
//返回false;如果变化,返回true
}
}
输出结果:
[1, 2, 3, 4, a, 爱java,爱生活]
[1, 2, 3, 爱java,爱生活]
size():4
isEmpty:false
contains:true
[]
true
1.3collection集合的遍历方式
package com.qianfeng;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.omg.PortableInterceptor.Interceptor;
public class CollectionDemo {
public static void main(String[] args) {
Collection c = new ArrayList();
// 添加元素
c.add("我");
c.add("爱");
c.add("学");
c.add("Java");
System.out.println(c);
// 方法一:将集合转换成Object数组
Object[] obj = c.toArray();
for (int i = 0; i < obj.length; i++) {
String s = (String) obj[i];// 进行强转
System.out.println(s + "---" + s.length());// 输出元素s和所对应的长度
}
System.out.println("-----------------------------");
// 方法二:collection迭代器
Iterator it = c.iterator();
while (it.hasNext()) {// 判断是否有下个元素
String s = (String) it.next();
System.out.println(s + "---" + s.length());
}
}
}
输出结果
[我, 爱, 学, Java]
我---1
爱---1
学---1
Java---4
-----------------------------
我---1
爱---1
学---1
Java---4
2.List集合
2.1List集合的三个子实现类的特点?
- ArrayList
底层数据结构:数组----->查询快,增删慢
从线程角度考虑:此实现不是同步的---->线程不安全---->执行效率高! - LinkedList:
底层数据结构:链接列表(链表)---->查询慢,增删快
从线程角度考虑:此实现不是同步的----->线程不安全---->执行效率高! - Vector:
底层数据库结构:可增长的数组实现---->查询快.增删慢
线程方面: 线程安全—>同步----->执行效率低!
如果一些需求中:没有指定具体的集合---->都去使用ArrayList (除 多线程环境外)
2.2ArrayList集合
package com.qianfeng_01;
import java.util.ArrayList;
import java.util.List;
/*
* List的集合的特有功能:
* void add(int index,Object element):在指定的位置处添加元素
Object remove(int index):删除指定索引处的元素
Object get(int index):获取功能: 获取指定索引处的元素
结合size():获取集合元素 普通for循环(第三种遍历方式)
遍历元素:
1)迭代器
2)普通for循环:get(int index) 和 size()相结合
3)增强for循环(替代迭代器的)
Object set(int index,E element):在指定位置处,修改元素内容
ListIterator listIterator(): list集合的专有遍历方式:列表迭代器
*
* */
public class ListDemo2 {
public static void main(String[] args) {
//创建List集合对象
List list = new ArrayList() ;
//添加元素
list.add("hello") ;
list.add("world") ;
list.add("Java") ;
list.add("JavaEE") ;
//void add(int index,Object element):在指定的位置处添加元素
list.add(2, "android");
//Object remove(int index):删除指定索引处的
//元素 :返回被删除的元素
System.out.println(list.remove(2)) ;
System.out.println("get():"+list.get(3));
//Object set(int index,Object element):在指定位置处,修改元素内容
System.out.println("set():"+list.set(3, "go"));
System.out.println("list:"+list);
}
}
运行结果:
android
get():JavaEE
set():JavaEE
list:[hello, world, Java, go]
2.3ArrayList集合的遍历
package com.qianfeng_arraylist;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class ArrayListDemo {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList array = new ArrayList() ;
//给集合中添加元素
array.add("hello") ;
array.add("hello") ;
array.add("world") ;
array.add("world") ;
array.add("java") ;
array.add("java") ;
//方式一:转换成Object数组
Object[] objs = array.toArray() ;
for(int x = 0 ; x < objs.length ; x ++) {
String s = (String)(objs[x]) ;
System.out.println(s+"---"+s.length());
}
System.out.println("-----------------------");
//方式二:使用Collection的迭代器
Iterator it = array.iterator() ;
while(it.hasNext()) {
String s = (String)(it.next()) ;
System.out.println(s+"---"+s.length());
}
System.out.println("-----------------------");
//方式3:使用List集合的列表迭代器
ListIterator lit = array.listIterator() ;
while(lit.hasNext()) {
String s = (String)(lit.next()) ;
System.out.println(s+"---"+s.length());
}
System.out.println("-----------------------");
//方式4:
//Object get(int index) 和int size()方法相集合:普通for循环...
for (int i = 0; i < array.size(); i++) {
String s = (String)(array.get(i)) ;
System.out.println(s+"---"+s.length());
}
}
}
2.4LinkedList集合
package com.qianfeng.linkedlist_01;
import java.util.LinkedList;
/*
* LinkedList:
* 此类的底层数据结构是链接列表,查询慢,增删快
* 线程不安全---不同步---执行效率高
*
*
* 特有功能:
* 添加
* public void addFirst(Object e):将指定元素始终在链表开头添加
* public void addLast(Object e):将指定的元素在链表的末尾添加
* 获取
public Object getFirst() :获取链表的第一个元素
public Object getLast() :获取链表的最后一个元素
删除
public Object removeFirst():删除链表第一个元素
public Object removeLast() :删除链表最后一个元素
* */
public class LinkedListDemo {
public static void main(String[] args) {
//创建一个LinkeList集合对象
LinkedList link = new LinkedList() ;
//public void addFirst(Object e)
link.add("hello") ;
link.add("world") ;
link.add("java") ;
link.addFirst("javaee");
link.addFirst("android");
// public void addLast(Object e)
link.addLast("go");
link.addLast("R");
//public Object getFirst() :获取链表的第一个元素,返回被获取的元素
System.out.println("getFirst():"+link.getFirst());
//public Object getLast() :获取链表的最后一个元素
System.out.println("getLast():"+link.getLast());
//public Object removeFirst():删除链表第一个元素
System.out.println("removeFirst():"+link.removeFirst());
//public Object removeLast() :删除链表最后一个元素
System.out.println("removeLast():"+link.removeLast());
System.out.println("link:"+link);
}
}
运行结果:
getFirst():android
getLast():R
removeFirst():android
removeLast():R
link:[javaee, hello, world, java, go]
2.5Vector集合
package com.qianfeng.vector_01;
import java.util.Enumeration;
import java.util.Vector;
/*
* Vector集合:通过整数索引访问组件!
*
* 底层数据结构是一个数组,查询快,增删慢
* 线程安全的类---同步--->执行效率低
*
*
* 线程安全的类:
* StringBuffer
* Vector
*
* public void addElement(Object obj):给Vector集合中添加元素 ------->类似于add(Object obj)
public Object elementAt(int index):通过整数索引值获取指定元素内容---->类似于Object get(int index)
public Enumeration elements() :就是Vector集合的专有遍历方式:返回Enumeration接口(枚举元素)----->类似于:Iterator iterator()
Enumeration接口:
boolean hasMoreElements():判断枚举中是否存在元素
Object nextElement():获取下一个枚举元素
*
*
* */
public class VectorDemo {
public static void main(String[] args) {
//创建Vector集合对象
Vector v = new Vector() ;
// public void addElement(Object obj):
v.add("hello") ;
v.add("world") ;
v.add("java") ;
v.add("JavaEE") ;
//System.out.println(v);
//public Object elementAt(int index): +size()遍历Vector集合
for(int x = 0 ; x < v.size() ; x ++) {
//System.out.println(v.elementAt(x));
String s = (String)(v.elementAt(x)) ;
System.out.println(s+"---"+s.length());
}
System.out.println("---------------------------");
//public Enumeration elements() :Vector集合的特有遍历方式
Enumeration em = v.elements() ;
/*
* boolean hasMoreElements():判断枚举中是否存在元素
Object nextElement():获取下一个枚举元素
* */
while(em.hasMoreElements()) {
String s = (String)(em.nextElement()) ;
System.out.println(s+"---"+s.length());
}
}
}
hello---5
world---5
java---4
JavaEE---6
---------------------------
hello---5
world---5
java---4
JavaEE---6
3.Set集合
package com.qianfeng.set_01;
import java.util.HashSet;
import java.util.Set;
/*
* Set集合和List集合的区别:
* List集合:有序的集合,存储和取出是一致的!它允许元素重复
* Set集合:无序的集合,存储和取出不一致(不能保证该顺序恒久不变),它元素唯一的!
*
* */
public class SetDemo {
public static void main(String[] args) {
//创建一个Set集合对象
Set<String> set = new HashSet<String>() ;
//添加元素
set.add("hello") ;
set.add("hello") ;
set.add("world") ;
set.add("world") ;
set.add("hello") ;
set.add("java") ;
set.add("java") ;
//遍历:增强for
for(String s: set) {
System.out.println(s);
}
}
}
运行结果
world
java
hello
3.1.TreeSet集合
特点:有序的,不重复的元素集合
package com.qianfeng.treeset_01;
import java.util.TreeSet;
/*
*
* TreeSet集合:是基于TreeMap集合的实现---->红黑树结构
*
* 提供两种排序方式:自然排序/选择器排序 根据构造方法来确定
*
* Set接口:
* 构造方法:
* TreeSet():创建TreeSet集合对象使用自然排序
* TreeSet(Comparator<? super E> comparator):创建一个TreeSet集合对象,使用选择器排序
*
* */
public class TreeSetDemo {
public static void main(String[] args) {
//创建TreeSet集合对象
TreeSet<Integer> ts = new TreeSet<Integer>() ; //为什么能够实现自然排序
//20,18,23,22,17,24,19,18,24
ts.add(20) ; //add()添加---->TreeMap<K,V>的put有关系
ts.add(18) ;
ts.add(23) ;
ts.add(22) ;
ts.add(17) ;
ts.add(24) ;
ts.add(19) ;
ts.add(18) ;
ts.add(24) ;
//遍历集合
for(Integer i : ts) {
System.out.print(i+" ");//17 18 19 20 22 23 24
}
}
}
运行结果:
17 18 19 20 22 23 24
4.Map集合
4.1Map集合的特点
Map集合
数据结构<K,V> 键值对
K Integer V String
1 张三
2 李四
3 王五
2 赵六
Map<K,V>集合:能够存储一些键值对的集合!
特点:
针对键有效,跟值无关 ,
键唯一的,值是可以重复的
4.2Map集合的基本功能
基本功能:
V put(K key,V value) :添加一个键值对元素
V remove(Object key) :删除键,返回键对应的值
void clear() :暴力删除(删除全部键值对元素)
boolean containsKey(Object key):判断是否包含指定的键
boolean containsValue(Object value):判断是否包含指定的值
boolean isEmpty() :判断Map集合是否为空
int size(): :获取集合的元素数
4.3代码演示
package com.qianfeng.map_01;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
public static void main(String[] args) {
//创建Map集合对象
Map<String,String> map = new HashMap<String,String>() ;
System.out.println("put:"+map.put("高圆圆", "赵又廷")) ;
//put的返回值:如果键是第一次添加,返回null
map.put("刘恺威", "杨幂") ;
map.put("周杰伦", "蔡依林") ;
map.put("杨过", "小龙女") ;
System.out.println("containsValue():"+map.containsValue("小龙女"));
//boolean isEmpty() :判断Map集合是否为空
System.out.println("isEmpty():"+map.isEmpty());
System.out.println(map.size());
System.out.println(map);
}
}
运行结果:
put:null
containsValue():true
isEmpty():false
4
{杨过=小龙女, 周杰伦=蔡依林, 高圆圆=赵又廷, 刘恺威=杨幂}