黑马程序员_java基础集合框架

                 ---------- android培训java培训、期待与您交流! ----------

java集合框架


集合类的由来

对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定就使用集合容器进行存储。 用于存储对象的容器集合的长度是可变的集合中不可以存储基本数据类型值(存储的都是对象的引用)。 集合容器因为内部的数据结构(对数据的存储方式)不同,有多种具体容器不断的向上抽取,就形成了集合框架。框架的顶层Collection接口

Collection的常见方法: 

①添加:

  boolean add(Object obj);

  boolean addAll(Collection coll); 

②删除: 

  boolean remove(object obj); 

  boolean removeAll(Collection coll); 

  void clear(); 

③判断: 

  boolean contains(object obj); 

  boolean containsAll(Colllection coll); 

  boolean isEmpty();判断集合中是否有元素。  

④获取: 

  int size(); 

  迭代器:Iterator iterator();

迭代器就是集合的取出元素的方式,就是把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容:判断和取出。那么可以将其共性抽取。那么这些内部类都符合一个规则,该规则就是Iterator

Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

如何获取集合的取出对象呢?通过一个对外提供的方法:iterator

For(Iterator it al.Iterator();it.hasNext(); ){it.next()}

⑤其他: 

  boolean retainAll(Collection coll);取交集。 

  Object[] toArray();将集合转成数组。

 

Collection子类 

  |--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。 

  |--Set:元素不能重复,无序。

 

 

一、List

特点:元素是有序的,元素可以重复。因为该集合体系有索引

特有方法:凡是可以操作角标的方法都是该体系特有的方法。

①添加 

  void add(index,element)

  void add(index,collection) 

②删除 

  Object remove(index)

③修改 

  Object set(index,element)

④获取: 

  Object get(index) 

  int indexOf(object) 

  int lastIndexOf(object) 

  List subList(from,to)    

List集合是可以完成对元素的增删改查。

List集合特有的迭代器:ListIteratorIterator的子接口,在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生ConcurrentModificationException异常。所以在迭代时,只能用迭代器的方法操作元素,可是Iterator方法是有局限性的,只能对元素进行判断、取出、删除的操作,如果想要进行其他如添加、修改等操作,就需要使用其子接口ListIterator。该接口只能通过List集合的listIterator方法获取。

 

List: 

  |--Vector:内部是数组数据结构,线程同步。增删,查询都很慢!被ArrayList取代。 

  |--ArrayList:内部是数组数据结构,线程不同步。查询的速度快,但增删稍慢。 

  |--LinkedList:内部是链表数据结构,线程不同步的。增删元素的速度很快,查询稍慢

 

ArrayList默认数组长度为10,若元素超过10,会new一个新的数组长度50%延长,将原来的元素copynew数组中,再把新元素添加到后面。

Vector默认数组长度为10,若元素超过10,会new一个新的数组长度100%延长。

所以ArrayList比较节约空间。

 

Set

元素是无序的(存入和取出的顺序不一致),元素不可以重复。Set接口中的方法和Collection一致。

常见子类有:

1.HashSet

2.TreeSet

HashSet内部数据结构是哈希表 ,线程是不同步的。 如何保证该集合的元素唯一性呢?是通过对象的hashCodeequals方法来完成对象唯一性的。如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。  

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。如果为true,视为相同元素,不存;如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equalshashCode方法。

equalshashCode方法是建立对象判断是否相同的依据。

 

TreeSet内部数据结构是二叉树,特点是可以对Set集合中的元素进行排序,线程是不同步的。  

判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。  

TreeSet对元素进行排序的方式一:让元素自身具备比较功能,元就需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫做默认顺序。 

TreeSet对元素进行排序的方式二:当元素自身不具备比较性时,或者具备比较性不是所需要的,这时就需要让集合自身具备比较性,即在集合初始化时就有了比较方式。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

比较器:定义一个类实现Comparator接口,覆盖compare方法。 

    当两种排序都存在时,以比较器为主。

 

 

三、Map

Map集合存储的是键值对,一对一存入,而且要保证键的唯一性。

特有方法:

①添加

  value put(key,value);返回前一个和key关联的值,如果没有返回null

②删除

  void clear();清空map集合。 

  value remove(key);根据指定的key翻出这个键值对。

③判断

  boolean containsKey(key); 

    boolean containsValue(value);

    boolean isEmpty();

④获取 

  value get(key);通过键获取值,如果没有该键返回null。当然可以通过返回null,来判断是否包含指定键。  

  int size();获取键值对的个数。

 

Map常用的子类: 

  |--Hashtable :内部是哈希表数据结构,线程同步,不允许null作为键或null作为值。      

  |--HashMap 内部是哈希表数据结构,线程不同步,允许null作为键或null作为值。 

  |--TreeMap 内部结构是二叉树,线程不同步,可以对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(); 
}
}

 ----------  android培训 java培训 、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值