java集合框架
集合类的由来:
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。 用于存储对象的容器;集合的长度是可变的;集合中不可以存储基本数据类型值(存储的都是对象的引用)。 集合容器因为内部的数据结构(对数据的存储方式)不同,有多种具体容器,不断的向上抽取,就形成了集合框架。框架的顶层是Collection接口。
Collection的常见方法:
①添加:
②删除:
③判断:
④获取:
迭代器就是集合的取出元素的方式,就是把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容:判断和取出。那么可以将其共性抽取。那么这些内部类都符合一个规则,该规则就是Iterator。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
如何获取集合的取出对象呢?通过一个对外提供的方法:iterator
For(Iterator
⑤其他:
Collection子类
一、List
特点:元素是有序的,元素可以重复。因为该集合体系有索引
特有方法:凡是可以操作角标的方法都是该体系特有的方法。
①添加
②删除
③修改
④获取:
List集合是可以完成对元素的增删改查。
List集合特有的迭代器:ListIterator是Iterator的子接口,在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生ConcurrentModificationEx
List:
ArrayList默认数组长度为10,若元素超过10,会new一个新的数组长度50%延长,将原来的元素copy到new数组中,再把新元素添加到后面。
Vector默认数组长度为10,若元素超过10,会new一个新的数组长度100%延长。
所以ArrayList比较节约空间。
Set
元素是无序的(存入和取出的顺序不一致),元素不可以重复。Set接口中的方法和Collection一致。
常见子类有:
1.HashSet
2.TreeSet
HashSet内部数据结构是哈希表
如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。
记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。
equals,hashCode方法是建立对象判断是否相同的依据。
TreeSet内部数据结构是二叉树,特点是可以对Set集合中的元素进行排序,线程是不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。
TreeSet对元素进行排序的方式一:让元素自身具备比较功能,元就需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫做默认顺序。
TreeSet对元素进行排序的方式二:当元素自身不具备比较性时,或者具备比较性不是所需要的,这时就需要让集合自身具备比较性,即在集合初始化时就有了比较方式。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
比较器:定义一个类实现Comparator接口,覆盖compare方法。
三、Map
Map集合存储的是键值对,一对一存入,而且要保证键的唯一性。
特有方法:
①添加
②删除
③判断
④获取
Map常用的子类:
Map集合的两种取出方式:entrySet();keySet()。
①keySet():将Map中所有的键存入到Set集合。因为Set具备迭代器,所以可以用迭代方式取出所有的键,再根据get方法获取每一个键对应的值。
②entrySet():将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是Map.Entry。
Map练习
需求:获取字符串中,每一个字母出现的次数,要求打印结果是:a(8)b(5)c(5)........
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class MapTest {
public static void main(String[] args) {
String str = "fdg+avAdc bs5dDa9c-dfs";
String s = getCharCount(str);
System.out.println(s);
}
public static String getCharCount(String str) {
//将字符串变成字符数组
char[] chs = str.toCharArray();
//定义map集合表。
Map map = new TreeMap();
int count = 0;
for (int i = 0; i < chs.length; i++) {
if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z')){
continue;
}
//将数组中的字母作为键去查map表。
Integer value = map.get(chs[i]);
if(value!=null){
count = value;
count++;
map.put(chs[i], count);
count=0;
}else{
map.put(chs[i],1);
}
}
return mapToString(map);
}
private static String mapToString(Map map) {
StringBuilder sb = new StringBuilder();
Iterator it = map.keySet().iterator();
while(it.hasNext()){
Character key = it.next();
Integer value = map.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
}