使用场景:
对于在Java中实现存储对象功能,之前我们已经学习过了“数组”。
public class Test03 {
public static void main(String[] args) {
int [] scores = {10,20,30,45,55};
System.out.println(scores[0]);
scores[0]=88;
System.out.println(scores[0]);
}
}
数组不仅可以存放基本数据类型也可以容纳属于同一种类型的对象。数组的操作是高效率的,但也有缺点。比如数组的长度是不可以变的,数组只能存放同一种类型的对象。
Java集合
于是,为了使程序方便地存储和操纵长度、数目不固定的一组数据,JDK中提供了Java集合类,所有Java集合类都位于Java.util包中。
集合的分类、实现类、特点、方法
Collection 接口
Collection 类是一个接口,定义了集合中最基本的常用方法。
接口中的主要方法:
1--- boolean add(E e); 增加元素
2--- boolean remove(Object obj); 删除元素
3--- boolean contains(Object obj); 包含
4--- boolean is Empty(); 是否有元素,空为true,非空是false
5--- void clear(); 清空集合中的元素
数组清空 != null;元素虽然清空。但是数组空间还在
6--- int size(); 集合中元素的个数
7--- Object[] toArray(); 把集合转换成数组
8--- Iterator<E> iterator(); 获取迭代器对象
代码显示
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class test {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
//增加元素
c.add("张三1");
c.add("张三2");
c.add("张三2");
c.add("张三2");
c.add("张三3");
c.add("张三4");
c.add("张三5");
System.out.println(c);
//删除元素
boolean b = c.remove("张三2");
System.out.println(b);
System.out.println(c);
//判断集合中有没有元素
boolean e = c.isEmpty();
System.out.println(e);
//集合中是否包含某个元素
boolean d = c.contains("张三wowow");
System.out.println(d);
//集合中的元素个数
int i = c.size();
System.out.println(i);
//集合转成数组
Object[] array = c.toArray();
System.out.println("--------"+Arrays.toString(array));
//删除集合中的所有元素
c.clear();
System.out.println(c);
System.out.println(c==null);//false
}
}
Iterator<E>接口
方法:
E next(); 获取元素
boolean hasNext(); 判断是否是下一个元素;有元素---true;无元素---false。
注意事项:
a.通过迭代器遍历集合的时候,不能通过“集合对象”进行增删操作
b.迭代器有一个删除方法,可以通过迭代器的删除方法进行删除---void remove(); 获取谁,删除谁
增强for循环
使用增强for循环,进行遍历集合
语法:for(数据类型 变量名:要遍历的集合名字){
}
代码实现Iterator
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class test02 {
public static void main(String[] args) {
Collection<String> co = new ArrayList<>();
co.add("Java-1");
co.add("Java-2");
co.add("Java-3");
co.add("Java-4");
co.add("Java-5");
System.out.println(co);
//获取迭代器对象
Iterator<String> iterator = co.iterator();
while(iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
//判断某些情况下要新增、删除元素
if(element.equals("Java-1")) {
iterator.remove();
}
}
System.out.println(co);
}
}
单列集合---List接口下和索引值相关的办法
1--- E get(int index); 获取元素
2--- E remove(int index); 根据索引值删除元素
3--- void add(int index,E e); 把元素添加到对应索引值位置
4--- E set(int index,E e); 替换对应索引值位置的元素,返回被替换的元素
5--- int indexOf(Object obj); 获取参数在集合中的索引值位置,如果元素不存在,则返回 -1
6--- int lastIndexOf(Object obj); 获取参数在集合中最后一次出现的索引值位置,如果元素不存在,则返回 -1
7--- List<E>sublist(int beginIndex,int endIndex); 截取
常用实现类【LinkedList】的成员方法
1--- void addFirst(E e); 把元素添加到头部
2--- void addLast(E e); 把元素添加到尾部
3--- E getFirst(); 获取头部位置的元素
4--- E getLast(); 获取尾部位置的元素
5--- E removeFirst(); 删除头部位置元素
6--- E removeLast(); 删除尾部位置元素
List 代码实现
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java==1");
list.add("Java==2");
list.add("Java==3");
list.add("Java==4");
list.add("Java==5");
System.out.println(list.size());//输出list集合元素个数
String element = list.get(3);//获取索引值为3的元素
System.out.println(element);
}
}
输出: 5 // Java==4
set接口
set接口没有在 Collection 的基础上扩展功能,Collection的方法就是set方法
实现类
HashSet 去除重复
LinkedHashSet 不能重复,保证顺序
TreeSet<E> 可排序
①TreeSet的泛型必须是Comparable 类型,如果不是该类型,则新增会抛出 classCastException
②如果泛型不是Comparable类型,则需要在TreeSet的构造器中传入一个Comparator类型的对象
TreeSet 新增元素的时候,泛型必须是Comparable类型
构造方法:
public TreeSet();
public TreeSet(comparator<E>C);
Comparable<T>接口
public int compareTo(E,e);
Comparator<E>接口
int compare(T t1,T t2);
说明要比较的规则:
升序 --- 当前对象—参数对象
降序 --- 参数对象—当前对象
双列集合---MAP
常用方法:
如果k存在,新v替换旧v,返回被替换的旧v
如果k不存在,则返回null
1 --- V put(K k,V v); 新增方法
2 --- V remove(Object key); 根据key删除整个键值对,返回对应的value,如果k不存在,则返回null
3 --- V get(Object key); 根据key获取v,如果key不存在,则返回null;
4 --- boolean isEmpty(); 判断集合是否为空,为空返回true,不为空返回false
5 --- void clear(); 清空集合中的元素
6 --- boolean containsKey(Object key); 判断是否包含key
7 --- boolean containsValue(Object value); 判断是否包含value
8 --- set<K>keySet(); 获取所有的key
9 --- set<Entry<K,V>> entrySet(); 获取所有的entry
10 --- Collections<V>values(); 获取所有的value
11 --- int size(); 元素个数
遍历Map集合方式
方式一:
a. 获取所有的Entry,Set<Entry<k,v>>
b. 遍历Set集合,泛型是Entry
c. entry.getKey()、entry.getValue();
方式二:
a. 获取所有的key,keySet();返回值Set<K>
b. 遍历Set集合,泛型是k
c. 获取一个k,根据k获取v
代码实现
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
public class test01 {
/*
* 1.遍历集合,并将序号与对应人名打印。
2.向该map集合中插入一个编码为5姓名为李晓红的信息
3.移除该map中的编号为1的信息
4.将map集合中编号为2的姓名信息修改为"周林"
*/
public static void main(String[] args) {
HashMap<Integer,String> map = new HashMap<Integer, String>();
map.put(1,"张三丰");
map.put(2, "周芷若");
map.put(3, "汪峰");
map.put(4, "灭绝师太");
//获取所有的Entry
Set<Entry<Integer,String>> entrySet = map.entrySet();
//使用增强for遍历set集合
for (Entry<Integer, String> entry : entrySet) {
//获取看k,v
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"----"+value);
}
map.put(5, "李晓红");//map.put新增
map.remove(1);
map.put(2, "周林");
System.out.println(map);
}
}
各集合总结
数据结构示意图
1--- 栈
2-- 队列
3--- 数组 查询快、增删慢
4--- 链表 查询慢、增删快
4.1单向链表
4.2双向链表
5--- 树 ;查询、增删都比较快