集合框架主要用来解决长度,类型可变问题,还可以根据key来获取内容。
主要分为两块: Collection,map
Collection 可以存放一组无序,可重复的数据,是一个接口
Collection 下面有2个子接口:List 和Set;
List存放一组有序,可重复的数据
Set 存放一组无序,唯一的数据
List集合有2个实现类 ArrayList和 LinkedList
ArrayList: 底层封装以数组实现,分配的是一块连续的内存空间,读取数据效率高,增删操作偏低
LinkedList: 底层以分装链表实现,分配的是不连续的内存空间,读取数据效率低,
增删操作效率高,相对于ArrayList ,多了首位元素的操作
Iterator 迭代器。在Collection接口下所有的对象,可以用Iterator 迭代器。
Iterator<String> ite= list.iterator();
while(ite.hasNext()){
String str= ite.Next();
syso(str);
ArrayList 另外2种迭代:
for(int i=0;i<list.size();i++){
syso(list.get(i));
for(String str:list){
syso(str);
list.contains(a); 判断集合中是否包含元素a;
list.indexOf(a);从前往后获取元素a下标
Set
HashSet的原理:
存放:1.调用hashCode()方法,获取哈希码值,判断是否存在这个之
2.如果存在,调用equals()方法(其实在这之前会先用==判断,相等就返回false),
判断两个对象是否相等,如果相等,添加失败,如果不等,把对象加入HashSet对象中。
3.如果第一步的哈希码值不存在,直接把对象加入HashSet里面
获取:1,先调用hashCode()方法,获取哈希码值,根据哈希值调用hash()方法,获取存储索引,
然后根据索引找到对应的数据;
HashSet可以存放多个对象,但是不能存放相同的对象。
这里我们也可以人为改变判定对象相同的条件,如果希望按照我们的方式来判定对象是否相同,
需要重写hashCode()方法和equals()方法。
Map
通过键值(key-value)对的形式来存储数据。
map.put(a,b);将a和b存入带map里面
map.get(a);得到key值a 对应的value
map.containsKey(a);集合中是否包含key
map.containsValue(a);集合中是否包含value
Set set=map.keySet();得到map集合中所有的key的集合
Iterator ite= set.iterator();
while(ite.hasNext()){
Object obj=iter.next();//迭代集合set中的key,得到key
Object ob=map.get(obj);//通过key得到value}
map里面的key可以是任意类型,建议使用String ,value 也可以是任意类型
map里面的key可以重复,当key重复是,后存入的数据会覆盖前面的数据,value可以重复
map里面key可以为null,但是只能有一个,多个时候,后面会覆盖前面的,value可以多个为null
map中的key在底层可以理解为一个set集合
HashMap的原理
存储:1,判断key是否为空,如果为空,把指定的value存到首位
2.如果key不为空,先根据key的hashCode来计算得到hash值
3.在根据hash值来获取数组的下标,如果该下标对应的位置已经有数据了,替换该数据
读取:1,根据key 的hashCode值,调用hash(),得到一个hash值
2,再根据hash值获取数组下标(通过indexof()方法),再根据数组下标从数组中获取元素
map 3种迭代
1.
取出所有的key,然后分别根据key来获取每一个value
Set<String> set = map.keySet();
Iterator<String> iter =set.iterator();
while(iter.hasNext()){
String key=iter.next();
String value=map.get(key);
syso(key+value);
2.
第二种方式:通过values()方法,直接得到所有的value
Collection<String> list= map.values();
Iterator<String> iter=list.iterator();
while(iter.hasNext()){
String value=iter.next();
syso(value);
3.
通过一个内部类Entry来获取所有的key和value
Set<Entry<String ,String>> set=map.entrySet();
Iterator<Entry<String,String> ite=set.iterator();
while(iter.hasNext()){
Entry<String,String> entry=iter.next();
String key=entry.getKey();
String value= entry.getValue();
syso(key+value);