Java 中对集合 ( Collection 和 Map ) 的总结
Collection()
集合层次结构中的根接口
Collection 对象名 = new 接口的实现类();
Collection(集合)与Array(数组)的区别:
1、Array可以存储基本数据类型(值)/引用数据类型(地址)
Array在创建的时候就要定义类型(只能存储一种数据类型)并且还要确定Length(长度)(长度是固定的)。
2、集合只能存储引用数据类型(Object可以是任意类型).长度是不确定的(由集合中的元素多少来决定)。
常用方法:boolean add(E e)增加元素
boolean remove(Object obj)删除指定元素
void clear()清空集合
boolean contains(Object obj)判断集合是否包含指
定元素
boolean isEmpty()判断集合是否为空
int size()获取元素个数
迭代器Iterator接口:
使用实例:List li=new ArrayList();
Iterator it=li.iterator();
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj+" ");
}
解释:hasNext():如果还有元素就可以迭代 返回true
next() :返回迭代的下一个元素
Iterator<> 局限性:不能对同一组元素进行多种操作
例:用两种方式对一组数据进行操作就会产生
java.util.ConcurrentModificationException 异常:
代码示例:
List li=new ArrayList();
Iterator it=li.iterator();
while(it.hasNext()){
Object obj=it.next();
if("break".equals(obj)){//判断是否相等
li.remove(obj);//删除元素
}
}
如果要修改:可以在定义一个新的集合来实现(通过迭代来给ArrayList集合去重):
ArrayList newlist=new ArrayList();
ArrayList list=new ArrayList();
Iterator it=list.iterator();
while (it.hasNext()) {
String temp=(String)iterator.next();
if (!newlist.contains(temp)) {//判断集合newlist是否包含的有temp字符串
newlist.add(temp);
}
}
List集合:元素是有序的(存取顺序一致)元素可以重复 其元素是以线性方式存储
常用子类:
(1)Vector:底层数据结构是数组 查询快 增删满 线程是安全的 效率低 浪费空间
(2)ArrayList:底层数据结构是数组 查询快 增删慢 线程不安全 效率高
(3)LinkedList:底层数据结构是双向链表 查询慢 增删快 线程不安全 效率高
LinkedList有自己的特有方法:
LinkedList li=new LinkedList();
li.getFirst();//返回此列表中的第一个元素。
li.getLast();//返回此列表中的最后一个元素。
li.size();//返回列表长度
li.removeFirst();//从此列表中删除并返回第一个元素。
linkedList.removeLast();//从此列表中删除并返回最后一个元素。
Set集合:无序(存取不一致,不代表随机) 不可重复 无索引
常用子类:
(1) HashSet:按照哈希算法来存取集合中的对象 存取速度比较快,当程序向HashSet中 add()的一个对象的时候,先用hashCode方法计算出该对象的哈希码
哈希码不一致 添加 哈希码一致 不添加 相同对象不添加
然后用equals判断对象的属性是否一致
比较结果为false就添加 true就不添加 不同对象添加
(2)LinkedHashSet:底层是双向链表,排重 有序(是Set集合中唯一一个能保证怎么存就怎么取的集合对象)
(3)底层是二叉树(左中右) 实现了SoetedSet接口 能够对集合中对象进行排序(升序 自然排序 根据ASCLL表大小排序) 排重 只能存储同一类型
实现排序:
方式一、实现Comparable接口 重写compareTo方法(自然排序或者是默认顺序排序)
int compareTo
方式二、Comparator比较器
使用源码范例:
(1)通过实现类class Compa implements Comparator{
public int compare(Object o1, Object o2) {
Student s1=(Student)o1;
Student s2=(Student)o2;
return s1.getAge()-s2.getAge();
}
}
(2)匿名内部类
TreeSet tt=new TreeSet(new Comparator() {
public int compare(Object o1, Object o2) {
Student s1=(Student)o1;//获取第一个对象
Student s2=(Student)o2;//获取第二个对象
//三元运算符 关系表达式?表达式一:表达式二
//如果名字相同就返回身高 降序 如果名字不相同 就返回年龄(升序)
return s1.getName().equals(s2.getName())?(int)(s2.getScore()-s1.getScore()):s1.getAge()-s2.getAge();
}
});
遍历集合:
List:
普通for循环 使用get()获取元素
调用 iterator() hasNext() next()获取元素
增强for循环 只要可以使用Iterator 的类都可以使用
Vector 集合用的是 Enumeration
Set:
调用 iterator()
增强 for
增强for:是Java1.5的新特性。所谓“增强型的for 循环”,主要也是针对容器。
for(String ss:arr){//arr指的是当前集合
System.out.print(ss+",")
}
Map接口 :将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map集合的特点:
1.根据键来排重 也就是相同键的元素存储在同一个Map集合中 后添加的键值元素会将之前存储的相同的键值元素替代
2.键和值 都需要是引用数据类型Map接口与Collection接口的区别:
Map:是双列的,键是唯一的(不重复) ,数据结构是针对键有效 跟值无关
Collection:是单列的,子体系中Set是唯一的,数据结构针对元素有效
子类:
(1)、HashTable:底层是哈希表 不可以存入null键null值 线程是同步的 jdk1.0 效率低
(2)、HashMap:底层是哈希表 可以存入null键null值 线程不同步 jdk1.2 效率高
(3)、底层是二叉树 线程不同步的 可以用Map集合中的键进行排序
取值方式:
1.Set<K> keySet()
2.Set<Map.Entry<K,V>> entrySet()
Map接口的的遍历
HashMap<String,Integer> hashMap=new HashMap<>();
Set<Map.Entry<String, Integer>>
entryset=hashMap.entrySet();
Iterator<Map.Entry<String, Integer>>
iterator=entryset.iterator();
while (iterator.hasNext()) {
Map.Entry<String,Integer>
entry=iterator.next();
String key=entry.getKey();
Integer va=entry.getValue();
System.out.println(key+" "+va);
}
//增强for循环
for (Map.Entry<String, Integer> entry:hashMap.entrySet()) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
Collections:是一个类
sort(List<T> list)
static <T> int binarySearch(List<? extends
Comparable<? super T>> list, T key)
static T max(Collection<? extends T> coll)
static void reverse(List<?> list)
static <T> Comparator<T> reverseOrder()
static void shuffle(List<?> list)
static void swap(List<?> list, int i, int j)
Collection与Collections的区别:
Collection是一个集合接口(为集合的顶级接口),它是提供了对集合对象进行基本操作的通用接口方法
Collections是一个包装类(工具类/帮助类),它包含有各种有关集合的静态方法 不能被实例化。