黑马程序员 集合框架(二)

来源:互联网 发布:python exit code非0 编辑:程序博客网 时间:2024/05/16 09:01

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

 

1:泛型(次重点)
 (1)不确定的类型,广泛的类型。
 (2)基本格式:<数据类型> 注意了:数据类型必须是引用数据类型
 (3)泛型的定义方式
  A:泛型定义在类上
   class Demo<QQ>
   {
    public void show(QQ qq){}
   }

  B:泛型定义在方法上
   class Demo
   {
    public <BM> void show(BM bm){}
   }

  C:泛型定义在接口上
   interface Inter<QQ>
   {
    public abstrace void show(QQ qq);
   }

 (4)泛型的使用(重点)
  A:一般,泛型就用于集合类中。
  
  B:好处:
   **把运行过程中可能出现的ClassCastException转到了编译期。
   **避免了多态的安全隐患


  
2:Set接口

Collection
 |--List 元素有序(存储顺序和取出顺序一致),可重复。
  |--ArrayList
   底层数据结构是数组,线程不安全。
   增删慢,查询快。
  |--Vector
   底层数据结构是数组,线程安全。
   增删慢,查询快。但是,线程安全,效率就低。所以查询也慢。
  |--LinkedList
   底层数据结构是链表,线程不安全。
   增删快,查询慢。

 

 |--Set 元素无序(存储顺序和取出顺序不一致),不可重复。
  |--HashSet
      底层数据结构是哈希表。线程不安全。
      如果保证元素的唯一性呢?
      A:首先根据hashCode值判断。
      B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
      如果hashCode值相同,那么,会继续根据equals方法进行判断,
      根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。

      一般,用HashSet的时候,要重写hashCode和equals方法。
   |--LinkedHashSet
      底层数据结构是链表和哈希表。
      链表用于保证元素有序,哈希表用于保证元素唯一。
  |--TreeSet
     底层数据结构是二叉树,线程不安全。
     如何保证元素的排序呢?两种方式
     A:让元素本身具备比较性
      实现Compareable接口中的compareTo方法。
     B:让集合具备比较性
      实现Comparator接口中的compare方法。

以后到底用哪个集合呢?
A:如果要元素唯一,就用Set。否则,用List。
B:如果元素唯一并且要排序用TreeSet,否则,用HashSet。
C:如果元素可重复,且考虑线程问题,用Vector。
  否则,用ArrayList或者LinkedList。
  如果要求,增删快,那么,考虑LinkedList。
  如果要求,查询快,那么,考虑ArrayList。
D:当你什么都不清楚的时候,就使用ArrayList。

Array:想到数组,就应该想到数组的索引。
Link:想到链表,就应该想到增删快。最好能想到addFirst。
Hash:想到哈希表,就应该想到元素的hashCode和equals方法。
Tree:想到二叉树,就应该想到排序。最好能想到两个接口Compareable和Comparator

 

1:Map接口(重点)
 (1)是键值对的集合。


 (2)和Collection接口中的集合的区别


  A:Map数据是成对出现的,必须有键和值成对出现
  B:Collection的数据是单列的


 (3)Map接口中的功能
  A:存储元素
   put(Object key,Object value)
  B:删除元素
   remove(Object key)
  C:判断
   isEmpty()
   containsKey(Object key)
   containsValue(Object value)
  D:长度
   size()
  E:获取元素
   Object get(Object key)
   Collection<V> values()
   Set<K> keySet()
   Set<Map.Entry<K,V>> entrySet()


 (4)通过HashMap创建Map集合对象,存储字符串和自定义对象。(重点)
  
  Map<String,String> map = new HashMap<String,String>();

  map.put("it001","haha");
  map.put("it002","hehe");
  map.put("it003","xixi");

  //值的集合
  Collection<String> c = map.values();
  Iterator<String> it = c.iterator();
  while(it.hasNext())
  {
   String value = it.next();
   sop(value);
  }

  //键的集合
  Set<String> set = map.keySet();
  Iterator<String> it = set.iterator();
  while(it.hasNext()
  {
   String key = it.next();
   sop(key);
  }

  //遍历Map的元素
  //第一种
  Set<String> set = map.keySet();
  Iterator<String> it = set.iterator();
  while(it.hasNext()
  {
   String key = it.next();
   String value = map.get(key);
   sop(key+"***"+value);
  }

  //第二种
  Set<Map.Entry<String,String>> setMap = map.entrySet();
  Iterator<Map.Entry<String,String>> it = setMap.iterator();
  while(it.hasNext())
  {
   Map.Entry<String,String> me = it.next();
   String key = me.getKey();
   String value = me.getValue();
   sop(key+"***"+value);
  }


  
2:Map的体系结构(重点)
 Map
  存储值
  put(Object key,Object value)

  获取元素
   Object get(Object key)
   Collection<V> values()
   Set<K> keySet()
   Set<Map.Entry<K,V>> entrySet()

  |--Hashtable
   底层是哈希表结构
   线程安全的,并且键和值不能为null。
  |--HashMap
   底层是哈希表结构
   线程不安全的,键和值可以为null。
   |--LinkedHashMap
    底层是链表和哈希表
    线程不安全
  |--TreeMap
   底层是二叉树
   线程不安全的

 

3:Collections类和Arrays类的使用。(重点)
 A:Collections
  排序
  二分查找
  发转
 B:Arrays
  把数组变成字符串输出
  排序
  二分查找


回顾:集合框架的整体架构

Collection:
 |--List
  --ArrayList
  --Vector
  --LinkedList
 |--Set
  --HashSet
   |--LinkedHashSet
  --TreeSet

 Comparable,Comparator
 Collections
Map:
 |--HashMap
  |--LinkedHashMap
 |--Hashtable
  |--Properties 
 |--TreeMap

 

 

原创粉丝点击