java.util.Collection
和java.util.Map
Collection
和双列集合Map
key->value
Collection
集合的结构和之间的区别Collection
是单列集合的根接口java.util.List
:元素有序可重复java.util.Set
:元素无序不可重复定义了单列集合的一些通用的方法,这些方法适用于上述所有的单例集合。注意每个方法的返回值。另外注意集合的使用过程中是一种多态形式,同一个接口由不同的实现类来实现。
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。public boolean contains(E e)
: 判断当前集合中是否包含给定的对象。public boolean isEmpty()
: 判断当前集合是否为空。public int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中。
java.util.Iterator
通用的取出集合中元素的方法。
java.util.Iterator
接口:迭代器(对集合进行遍历)boolean hasNext()
如果仍有元素可以迭代,则返回 true。 判断集合中还有没有下一个元素,有就返回true,没有就返回falseE next()
返回迭代的下一个元素。 取出集合中的下一个元素Iterator
迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊Iterator iterator()
返回在此 collection 的元素上进行迭代的迭代器。iterator()
获取迭代器的实现类对象,使用Iterator
接口接收(多态)Iterator
接口中的方法hasNext
判断还有没有下一个元素Iterator
接口中的方法next
取出集合中的下一个元素 public static void main(String[] args) {
//创建一个集合对象
Collection<String> coll = new ArrayList<>();
//往集合中添加元素
coll.add("姚明");
coll.add("科比");
coll.add("麦迪");
coll.add("詹姆斯");
coll.add("艾弗森");
/*
1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
注意:
Iterator接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
*/
//多态 接口 实现类对象
Iterator<String> iterator = coll.iterator();
//遍历迭代器 获取元素
//判断是否还有下一个元素
while (iterator.hasNext()){
//获取当前元素并且指针前移
String e = iterator.next();
System.out.println(e);
}
}
用来遍历数组和集合。
底层实现就是迭代器,但是用了for循环的格式,简化了迭代器的书写。
for(集合/数组的数据类型 变量名: 集合名/数组名){ sout(变量名); }
public static void main(String[] args) {
demo02();
}
//使用增强for循环遍历集合
private static void demo02() {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
for(String s : list){
System.out.println(s);
}
}
//使用增强for循环遍历数组
private static void demo01() {
int[] arr = {1,2,3,4,5};
for(int i:arr){
System.out.println(i);
}
}
public static void main(String[] args) {
show01();
}
private static void show01() {
ArrayList list = new ArrayList();
list.add("abc");
list.add(1);
//使用迭代器遍历list集合
//获取迭代器
Iterator it = list.iterator();
//使用迭代器中的方法hasNext和next遍历集合
while(it.hasNext()){
//取出元素也是Object类型
Object obj = it.next();
System.out.println(obj);
//想要使用String类特有的方法,length获取字符串的长度;不能使用 多态 Object obj = "abc";
//需要向下转型
//会抛出ClassCastException类型转换异常,不能把Integer类型转换为String类型
String s = (String)obj;
System.out.println(s.length());
}
}
Object
类型,可以存储任意类型的数据String
类特有的方法,length
获取字符串的长度;不能使用 多态 Object obj = "abc";
需要向下转型,但是这个转型并不是都能转。因为不清楚预知的类型 public static void main(String[] args) {
show02();
}
/*
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
*/
private static void show02() {
ArrayList<String> list = new ArrayList<>();
list.add("abc");
//list.add(1);//add(java.lang.String)in ArrayList cannot be applied to (int)
//使用迭代器遍历list集合
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s+"->"+s.length());
}
}
修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){
方法体;
}
? extends E
代表使用的泛型只能是E类型的子类/本身? super E
代表使用的泛型只能是E类型的父类/本身
java.util.List
接口继承了Collection
接口
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。public static void main(String[] args) {
//创建一个list结合对象 多态
List<String> list = new ArrayList<>();
//添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("a");
//打印集合
//打印结果不是hashcode 说明重写了toString方法
System.out.println(list);
//指定位置上添加指定元素
//public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
list.add(3,"three");
System.out.println(list);
//移除指定位置的元素,返回值是被移除的元素
String remove = list.remove(2);
System.out.println("被移除的元素:" + remove);
System.out.println(list);
//指定元素替换集合中指定位置的元素,返回值是更新前的元素
String setE = list.set(4, "four");
System.out.println("被替换的元素为:" + setE);
System.out.println(list);
//List的遍历有三种方式
//1.for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-----------------");
//2.迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("-----------------");
//3.增强型for循环
for (String s : list) {
System.out.println(s);
}
}
IndexOutOfBoundsException
:索引越界异常,集合会报ArrayIndexOutOfBoundsException
:数组索引越界异常StringIndexOutOfBoundsException
:字符串索引越界异常LinkedList
时,创建对象不建议使用多态public void addFirst(E e):将指定元素插入此列表的开头。
public void addLast(E e):将指定元素添加到此列表的结尾。
public void push(E e):将元素推入此列表所表示的堆栈。
public E getFirst():返回此列表的第一个元素。
public E getLast():返回此列表的最后一个元素。
public E removeFirst():移除并返回此列表的第一个元素。
public E removeLast():移除并返回此列表的最后一个元素。
public E pop():从此列表所表示的堆栈处弹出一个元素。
public boolean isEmpty():如果列表不包含元素,则返回true。
public class Demo02LinkedList {
public static void main(String[] args) {
show01();
System.out.println("---------------");
show02();
System.out.println("---------------");
show03();
}
/*
- public void addFirst(E e):将指定元素插入此列表的开头。
- public void addLast(E e):将指定元素添加到此列表的结尾。
- public void push(E e):将元素推入此列表所表示的堆栈。此方法等效于 addFirst(E)。
*/
private static void show01() {
//创建LinkeeList对象
LinkedList<String> linked = new LinkedList<>();
//添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);//[a, b, c]
//将指定元素插入到开头
linked.addFirst("first");
System.out.println(linked);
//指定元素插入到末尾
linked.addLast("last");
System.out.println(linked);
//push等价于 addFirst
linked.push("push is equal to the addFirst Method");
System.out.println(linked);
}
/*
- public E getFirst():返回此列表的第一个元素。
- public E getLast():返回此列表的最后一个元素。
*/
private static void show02() {
//创建LinkeeList对象
LinkedList<String> linked = new LinkedList<>();
//添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);//[a, b, c]
String first = linked.getFirst();
System.out.println(first);
String last = linked.getLast();
System.out.println(last);
}
/*
- public E removeFirst():移除并返回此列表的第一个元素。
- public E removeLast():移除并返回此列表的最后一个元素。
- public E pop():从此列表所表示的堆栈处弹出一个元素。此方法相当于 removeFirst
*/
private static void show03() {
//创建LinkeeList对象
LinkedList<String> linked = new LinkedList<>();
//添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);//[a, b, c]
String s = linked.removeFirst();
System.out.println("移除并返回:" + s);
String s1 = linked.removeLast();
System.out.println("移除并返回:" + s1);
System.out.println(linked);
}
}
java.util.Set接口 extends Collection接口
java.util.HashSet集合 implements Set接口
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
//使用add方法往集合中添加元素
set.add(1);
set.add(3);
set.add(2);
set.add(1);
//使用迭代器遍历set集合
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
Integer n = it.next();
System.out.println(n);//1,2,3
}
//使用增强for遍历set集合
System.out.println("-----------------");
for (Integer i : set) {
System.out.println(i);
}
}
return getClass().getName() + "@" + Integer.toHexString(hashCode());
- jdk1.8版本之前:哈希表=数组加链表
- jdk1.8版本之后:
- 哈希表=数组+链表
- 哈希表=数组+红黑树
自定义的类必须重新
equals
方法和hashcode
方法,才能实现存储的元素唯一
继承了 HashSet
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:
- 底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
- 有序,无重复
修饰符 返回值类型 方法名(数据类型...变量名){}
注意
Collection
是Collection
集合的根接口,而Collections
是工具类,是用来操作集合的一组工具方法
java.utils.Collections
是集合工具类,用来对集合进行操作。部分方法如下:
public static
将集合中元素按照默认规则排序。void sort(List list):
- 被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
- 自己(this)-参数:升序
public static
:将集合中元素按照指定规则排序。void sort(List list,Comparator super T> )
java.util.HashMap
集合implements Map
接口
java.util.LinkedHashMap
集合extends HashMap
集合
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。public V get(Object key)
根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key)
判断集合中是否包含指定的键。map
的keySet()
方法获取map
中所有的key
并存储在一个set
中set
即可
public static void main(String[] args) {
//创建Map集合对象
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
//1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
Set<String> set = map.keySet();
//2.遍历set集合,获取Map集合中的每一个key
//使用迭代器遍历Set集合
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.通过Map集合中的方法get(key),通过key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
Set> entrySet()
返回此映射中包含的映射关系的 Set 视图。Entry
对象提供了两个方法getKey()
和getValue()
public static void main(String[] args) {
//创建Map集合对象
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
//2.获取entrySet对象
Set<Map.Entry<String, Integer>> set = map.entrySet();
//3.遍历set
Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next.getKey() + "=" + next.getValue());
}
}
使用上没有限制
由于必须保证
key
的唯一性,所以自定义类必须重写hashcode
和equals
方法
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put(null,"a");
map.put("b",null);
map.put(null,null);
System.out.println(map);//{null=null, b=null}
Hashtable<String,String> table = new Hashtable<>();
//table.put(null,"a");//NullPointerException
//table.put("b",null);//NullPointerException
table.put(null,null);//NullPointerException
}