1.集合概述
|--概念:集合是一种容器,专门存储对象,集合不储存基本数据类型
|--与数组的区别:
1、集合的长度是可变的,数组的长度是固定的
2、集合专门存储对象不能存储基本数据类型,数字可以存储对象也可以存储基本数据类型
2.Collection接口
|--它是集合的跟接口,它中的方法主要是储存对象的方法
|--collection中的方法
建立一个集合:Collection coll = new ArrayList;
1、add() 向集合中添加对象 coll.add();
2、clean() 移除此collection中的所有元素
3、equals(Object o) 比较collection与指定对象是否相等,区分大小写
4、hashCode() 返回此collection中的哈希码值
5、isEmpty() 如果此collection不包含元素则返回true
6、iterator() 返回此collection的元素上进行迭代的迭代器(迭代器较重要,后面单独说)
7、remove() 移除指定元素
8、size() 返回Collection中的元素个数
9、toArray() 返回包含此collection中所有元素的数组
10、contains(Object o)如果collection中包含指定的元素返回true
迭代器 迭代器 Collection中的一个共性方法 返回值类型是一个接口类型 接口是Iterator
此方法用于取出集合中存储的对象的方法
方法的使用:
Collection coll = new Collectin();
Iterator it = coll.iterator();//1.调用集合中的Iterator方法,获取迭代器对象
while(it.hashNext()){//调用迭代器中的hasNext()方法来判断是否有对象被取出
sop(it.next());//调用集合中next方法获取集合中的元素
}
3.List派系
|--List也是一个接口
|--List派系中的集合容器是有序排列的(怎么存的怎么取出)
|--List派系的集合是有下表的,可以利用数组的思想操作集合
|--List派系中允许存储重复的元素
|--List派系有自己特有的迭代器 ListIterator
1、使用List特有的迭代器可以实现迭代器的过程添加,修改,删除
2、正向迭代集合、反向迭代集合,反向迭代之前必须先正向迭代一次
迭代器的示例:
List list = new ArrayList();
List.add("abc1");
List.add("abc2");
List.add("abc3");
ListIterator it = list.listIterator();
while(it.hasNext()){
if("abc3"equals(it.next()))
//it.remove();//迭代到谁就删谁
it.set("ABC123");//迭代到谁就该谁
}
|--List派系中其他特有的方法
1、add(int index,E element) 在列表的指定位置插入指定的元素
2、get(int index) 返回列表指定位置的元素
3、indexOf(Object 0) 返回此列表第一次出现指定元素的索引如果没有返回-1
4、set(int index,E element) 用指定的元素替换指定位置的元素
|--ArrayList它是List派系中的一个子类 ****(两个重要案例 存储自定义对象 去掉重复的元素)
|--有序的
|--有下标
|--可以重复的
|--底层数据结构是可变数组默认存数10个元素超出范围扩充50%线程不同步
|--LinkedList它是List派系中的一个子类
|--它的底层数据结构为链表式结构,增删快,查询慢
|--线程不同步操作效率高
|--特有方法
1、addFirst() 将指定的元素插入到此列表的开头
2、addLast() 将指定的元素插入到列表的结尾
3、element() 获取但不移除第一个元素
4、getFirst() 返回此列表的第一个元素
5、getLast() 返回此列表的最后一个元素
6、offer() 将制定的元素添加到此列表的末尾
7、offerLast() 将列表末尾添加指定元素
8、offerFirst() 在此列表的开头添加指定的元素
9、pollFirst() 获取并移除列表的第一个元素
10、pollLast() 获取并移除此列表的最后一个元素
11、peekFirst() 获取不移除此列表的第一个元素
4.Set派系 集合的又一个派系 存储的元素不能重复的时候考虑使用set集合
|--存储到set集合中的对象应该重写hashCode和equals方法
|--元素是无序排列(存储顺序和取出顺序)
|--这个派系没有下标
|--Set集合不存储重复的元素
|--取出方式只能用迭代器不可以和List用for
|--线程不安全
|--hashSet集合
|--底层数据结构是哈希表,桶状结构
|--调用的是hashMap来实现的
|--线程不安全操作效率高
|--存储到HashSet中的对象,重写hashCode和equals两个方法 *****
|-- 重写equals方法的实现步骤
1. 对本对象和彼对象(this obj)进行地址的判断,如果地址一样,直接返回true
2. 对象obj这个参数进行类型的判断,再次进行类型的强制转换
3. 使用this和被转后的obj,进行所有成员变量的比较
4. 如果传递的obj参数,不是本类类型直接返回false
|-- 重写hashCode方法的实现步骤
将对象中的引用变量取哈希值,基本数据类型直接相加或者相乘
|--treeSet具有排序功能的一个集合
|--底层数据结构是二叉树,每一个分支只能分出两个
|--排序的依据是对象的自然顺序(是否有自然顺序看描述对象的类是否实现了Comparable接口)
|--覆盖接口中的抽象方法public intcomparaTo(){}
|--字符串本身具备自然顺序因为String实现了Comparable接口覆盖了comparaTo方法
5.泛型
|-- 安全机制
|-- 出现在JDK1.5级以后版本
|-- 将程序的问题由运行时期,提前到了编译时期
|-- 避免了强制的类型转换
|-- 就是限制数据类型
|-- 格式:
集合类<数据类型> 变量 = new 集合类<数据类型>();
|-- 自定义对象的Person,可以存储到List结合,HashSet,TreeSet 带泛型的 *****
|-- 泛型的限定,明白上限和下限,不要求会写,能看的明白知道什么意思就行了
|-- ? 集合的通配符,匹配任意的泛型
import java.util.*;
public class GenericDemo1{
public static void main(String[] args){
TreeSet<Person> al = new TreeSet<Person>();
//HashSet<Person> al = new HashSet<Person>();
//ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("zhangsan",22));
al.add(new Person("lisi",32));
al.add(new Person("wangwu",42));
Iterator<Person> it = al.iterator();
while(it.hashNext()){
Person p = it.next();
syso(p.getNext()+...+p.getAge());
}
}
}
6.Map集合
|--双列的集合,一次存储一对键值对象
|--将键映射到值
|--不允许存在重复的键允许存在重复的值
|--每个键只能映射一个值
|--Map集合中去处对象的两种方式
|--keySet()开发中常用
import java.util.*;
public class MapDemo{
main{
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("qq",123);
map.put("ww",456);
map.put("ee",789);
//用keySet()将,Map集合中的链存储到Set集合中
Set<String> set = map.keySet();
//用迭代器迭代set集合
Iterator<String> it = new Iterator();
while(it.hasNext()){
String key = it.next();
Interger value = map.get(key);
syso(key+vaiue);
}
}
}
|--entrySet()面试可能会出现
import java.util.*;
public class MapDemo{
main{
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("qq",123);
map.put("ww",456);
map.put("ee",789);
Set<Map.Entry<String,Integer>> set = map.entrySet();
Iterator it = new Iterator();
while(it.hasNext){
Map.Entry<String,Integer> me = it.next();
String key = me.getKey();
Integer value = me.getValue();
syso(key + value);
}
}
}
|-- Map集合中的常用方法
|-- put(K,v)将对象存储到集合,如果有重复的键,put方法会返回被替换之间的值
|-- get(K) 根据键获取对应的值,如果没有这个键,返回null
|-- containsKey(K)判断集合中是否有这个键,有就返回true
|-- containsValue(V)判断集合中是否有这个值,有就返回true
|-- size() 返回集合中存储的键值对的个数
|-- keySet() 将集合中的键存储到Set集合
|-- entrySet() 将集合中的键值关系存储到Set集合,键值关系对象是Map.Entry
import java.util.*;
public class MapDemo{
main{
}
public static void method(){
Map<String,Integer>map = new HashMap<String,Integer>();
map.put("a",123);//向集合中存储对象,put(),
map.put("b",456);
map.put("c",789);
syso(map);
//get方法根据指定的链获取对应的值
Integer i = map.get("b");
syso(i);
//boolean containskey()判断有没有这个键
//boolean containsValue()判断有没有这个值
boolean b1 = map.containsKey("a");
boolean b2 = map.containsValue(123);
}
}
6.HashMap集合
|--底层数据结构是哈希表结构
|--不允许重复的键
|--线程不安全,操作效率高
|--允许null值和null键
|--案例,存储自定义对象并取出,需要实现2种方式 *****(见上)
|