目录
集合的框架体系
一、Collection接口和常用方法
1.1 List接口和常用方法
1.1.1 ArrayList底层结构和源码分析
1.1.2 Vector底层结构
1.1.3 LinkedList底层结构
1.2 Set接口和常用方法
1.2.1 Set接口实现类-HashSet
二、Map接口和常用方法
2.1 HashMap的基本使用和案例说明
2.2 Map接口实现类-Hashtable
三、总结-开发中如何选择集合实现类(要求记住)
四、Collections工具类
Java的集合类很多(背),主要分为两大类,如图:
public interface Collection
package com.atguigu.collections;
import java.util.ArrayList;
import java.util.List;
public class CollectionCommonMethods {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
// TODO Auto-generated method stub
//1. 以 实现子类 ArrayList
//2. List 是 Collection 子接口
//3.
List list = new ArrayList();
//走方法
/*
* add:添加单个元素 (只要Object 对象,都可以放)
remove:删除指定元素
contains:查找元素是否存在
size:获取元素个数
isEmpty:判断是否为空
clear:清空
addAll:添加多个元素
containsAll:查找多个元素是否都存在
removeAll:删除多个元素
说明:以ArrayList实现类来演示.
*/
//可以随意
list.add("tom");
list.add("jack");
list.add("king");
list.add("smith");
list.add("scott");
//删除
list.remove(0);//删除第一个元素
list.remove("smith");//指定对象
List list2 = new ArrayList(); // list2= ["king", "jack"]
list2.add("king");
list2.add("jack");
list.removeAll(list2);
//contains
System.out.println(list.contains("scott"));//1
//size:获取元素个数
System.out.println(list.size());//1
//isEmpty:判断是否为空
System.out.println(list.isEmpty());// false
//clear:清空 , 所有的元素 全部拿掉
list.clear();
//addAll:添加多个元素
List list3 = new ArrayList(); // list2= ["king", "jack"]
list3.add("king~");
list3.add("jack~");
list.addAll(list3);
//removeAll:删除多个元素
list.removeAll(list3); //表示将 list集合中含有的 list3的元素删除
list.add("hello");
list.add("hello");
//输出
//小结
//1. 如果我们希望看到某个对象的真正执行的方法
//2. 最好使用debug 去看,因为我们只看继承关系,很难看到这个方法
// 到底是在哪个父类实现,或者重写
System.out.println("list=" + list.toString());
}
}
Iterator iterator = coll.iterator(); //得到一个集合的迭代器
//hasNext():判断是否还有下一个元素
while(iterator.hasNext()){
//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
Iterator接口的方法
注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
Collection接口遍历对象方式2-for循环增强
jdk5.0出现了增强for循环,可以代替iterator迭代器,特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组。
基本语法
for(元素类型 元素名 : 集合名或数组名) {
访问元素
}
List接口基本介绍
* List 集合里添加了一些根据索引来操作集合元素的方法
void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
方式一:使用iterator
Iterator iter = col.iterator();
while(iter.hasNext()){
Object o = iter.next();
}
方式二:使用增强for
for(Object o:col){
}
方式三:使用普通for
for(int i=0;i Object object = list.get(i); System.out.println(object); } ArrayList的底层操作机制源码分析 public synchronized E get(int index) { if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); return elementData(index); } 在开发中,主要使用ArrayList ,只有在确实需要线程同步安全时,才使用Vector 增删改查和ArrayList一样 和List接口一样, Set接口也是Collection接口的子接口,因此,常用方法和Collection接口一样,没有多出其他的方式. 同Collection的遍历方式,因为Set接口是Collection接口的子接口。 1. 可以使用迭代器, 2. 增强for 3. 不能使用索引的方式来获取. //1. 为啥 相同的元素,就加入不了? // 答:因为他底层会使用 equals, 判断是否已经有这个元素. //2. 为啥,加入顺序和取出的顺序不一样,但是每次取出的顺序是固定? // 答: 因为hash算法后,这个元素不一定就是按照下标来增长, 分析HashSet的添加元素底层是如何实现 1.1.1 ArrayList底层结构和源码分析
ArrayList 属性 : transient Object[] elementData;
transient Object[] elementData;1.1.2 Vector底层结构
1.1.3 LinkedList底层结构
1.2 Set接口和常用方法
1.2.1 Set接口实现类-HashSet
二、Map接口和常用方法
//遍历方式1-》 迭代器
Set keySet = map.keySet();//获取 map 的 key Set
Iterator iterator = keySet.iterator(); // 获取到 Set 的 迭代器
while(iterator.hasNext()) {
Object key = iterator.next();
Object val = map.get(key);
System.out.println(key + "-" + val);
}
//第二种方式
System.out.println("=======第二种方式=======");
for(Object key : keySet) {//增强for 取出key
Object val = map.get(key);
System.out.println(key + "-" + val);
}
//第三种 entry, 表示一对键值对
//1. 得到entrySet, 即得到所有的 键值对
//增强for
System.out.println("第三种 entry");
Set entrys = map.entrySet(); //key-value
for (Object entry : entrys) { // entry 就是 key-val 类型就是 Entry
Map.Entry
2.1 HashMap的基本使用和案例说明
2.2 Map接口实现类-Hashtable
三、总结-开发中如何选择集合实现类(要求记住)
四、Collections工具类
//准备工作.
List list = new ArrayList();
list.add("john");
list.add("john");
list.add("lucy");
list.add("jack");
list.add("john3");
System.out.println("list=" + list);
//reverse(List):反转 List 中元素的顺序
Collections.reverse( list);
System.out.println("list=" + list);
// shuffle(List):对 List 集合元素进行随机排序
Collections.shuffle(list);
System.out.println("shuffle=" + list);
// sort::对 List 集合元素进行自然排序或定制排序
// 安装 码值来一个一个的比较,小的在前, 大的在后
Collections.sort(list);//默认升序
//从大到小
//可以进行扩展到其它类型
Collections.sort(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
if(!(o1 instanceof String) || !(o2 instanceof String)) {
return 0;
}
//将 类型转换
String s1 = (String)o1;
String s2 = (String)o2;
return s2.compareTo(s1); //从大到小
}
});
//测试:swap:交换集合中指定索引处的两个元素
//交换
Collections.swap(list, 1, 3);
//int frequency(Collection,Object):返回指定集合中指定元素的出现次数
int frequency = Collections.frequency(list, "john");
//void copy(List dest,List src):将src中的内容复制到dest中
List dest = new ArrayList(); //创建了一个dest List, 大小为10
for (int i = 0; i < list.size(); i++) {//使用list.size ,保证刚好
dest.add(i);
}
//吧list 中的元素拷贝给 dest
Collections.copy(dest , list);
System.out.println("dest的元素如下:");
//替换
Collections.replaceAll(list, "john", "tom.汉克斯");//阿甘
//max
//min
System.out.println(Collections.max(list));
System.out.println(Collections.min(list));
//可以定制
// Collections.min(list, new Comparator() {
//
// @Override
// public int compare(Object o1, Object o2) {
// // TODO Auto-generated method stub
// return 0;