集合框架Collection&Map

集合框架:Collection 和 Map =====================集合/容器 =========================
Collection 接口
         |-List
         |-Set   
      

线性表:List
 list表示有先后次序的对象集合
 

 List 接口 
    |-Vector 早期版本,慢,线程安全
    |-ArrayList 变长数组算法实现,快,非线程安全
    |-LinkedList 双向循环链表实现
  
 

 size();
 
 add(E e);
 
 add(int index ,E e);
 
 get(int index);
 
 remove(int index);
 
 indexOf(Obj o); 
 
 clear();
 
 contains(Object o);
  是否包含指定的元素,默认调用对象的equils方法,如果没有覆盖equils方法,返回false
  

 
ArrayList 
 
 ArrayList是使用变长数组算法实现的List
 ArrayList = Object[]+线性表操作(增删改查)
 
LinkedList 
 
 LinkedList是采用双向循环链表实现的List
 
 addFirst();
 
 addLast();
 
 removeFirst();
 
 removeLast();

 


集:Set
 元素无序,不能重复,是数学意义上的集合

 Set 接口
    |-HashSet 
           |-SortedSet 
           |-TreeSet

 
 往set中存放对象的时候,会通过对象的equals()和hashCode进行比较,相同的会把前者覆盖(不能重复)

 

 

散列表/映射=======================================================


Map 接口 
 |-HashTable 旧,线程安全
 |-HashMap 新,非线程安全
 |-SortedMap
 |-TreeMap 二叉排序树实现,按key排序 

 

 映射:将键映射到值
 
 容量:散列表中散列数组的大小。
 
 散列运算:从key 到散列值(散列数组的下标)的算法。
 
 散列桶:散列值相同的元素的“线性集合”。
 
 加载因子:散列数组的加载率:元素数量/散列数组大小,一般小于75%性能比较理想
 
 散列查找:根据key计算散列值,根据散列值(下标) 找到散列桶,
  
 在散列桶中按顺序比较key,如果一样就返回value。散列表中key不同,value可以相同。
 
 

 


常用方法:
 
 clear();
 
 containsKey(Object key);
 
 containsValue(Object val);
 
 put(K key,V val);
 
 get(Object key);
 
 remove(Object key);
 
 isEmpty();
 
 size();

 
 


HashMap
 
 HashMap是以 键-值对(key:value)的形式存储对象,关键字key是唯一的不重复的
 
 key和value可以是任何对象;
 (key:value)成对放置在集合中;
 
 重复的key算一个,重复添加是替换操作;
 默认容量16,默认加载因子0.75

 

Map的迭代=============================================================

 

 Collection<V> values(); 返回此映射包含的值的Collection视图
 
 Set<K> keySet(); 返回此映射中所有key的Set视图
 
 Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的Set视图

 


泛型==================================================

 
 泛型是java5以后提出的语法现象,作用是在编译器检查类型的约束(运行期不检查泛型) 
 
 如果不使用泛型,默认泛型是<Object> 
  
  
 


集合的迭代==============================================
 

Iterator接口 描述类迭代模式操作
 
 
 Collection<C> c = new ....<C>()
 
 Iterator<C> ite = c.iterator();
 
 while(ite.hasNext()){         //hasNext()是否仍有下个元素可迭代
  
  C c = ite.next();         //next()返回迭代的下一个元素
  
  if(...){
   
   ite.remove();         //remove()从迭代器指向的 collection 中移除当前正在迭代的元素
  
  }
 
 }
 


 for ... each 
 
 
 for( C c : collection){
  
  //c指的就是当前元素,对c进行操作
 
 
 }

 

 

Collections===========================================
 
 Collection 是集合框架的根接口之一,代表抽象集合概念
 
 Collections 是集合的工具类,类似数组的工具类Arrays,包括很多集合工具方法(静态方法)
 
 
 .fill(List list,Object o)       //用指定元素替换指定列表中的所有元素
 
 .reverse(List list)             //反转列表中元素顺序
 
 .swap(List list, int i, int j); //在指定位置交换元素
 
 .binarySearch(List list, Object o,[Comparator c]); //(在排序好的列表中)二分查找指定元素,返回index
 
 .sort(List list);               //排序
 
 .sort(List list, [Comparator c]); //带比较器的排序
 
 .max(Collection c, [Comparator c]);
 
 .min(Collection c, [Comparator c]);
 


Comparable 和 Comparator ===========================

 

对象比较大小问题
默认比较:Comparable
 
 Comparable表示可以比较的,实现这个接口表明这个类的实例可以比较大小,可以进行自然排序
 
 compareTo()方法是在Comparable接口中定义的,是当前字符串与另外一个字符串比较
  
 返回:如果当前字符串大,返回正数
   
       如果当前字符串小,返回负数
   
              如果相等,返回0;
   
   

 String实现了Comparable接口(String是可以比较大小的)
   
 实现Comparable接口的类:叫做可以默认比较(默认排序)的类型
 

 如果实现Comparable,必须compareTo方法与equal结果一致

 


自定义比较:Comparator
 
 Comparator 代表自定义比较规则,更加贴近业务实际,更加常用
 
 写一个类实现Comparator接口,在compare方法中写比较逻辑。
 
 
 
 /** 字符串长度比较器 */
 
 class ByLength implements Comparator<String> {
  
  public int compare(String o1, String o2) {
   
   return o1.length() - o2.length();
  
  }
 
 }
 
 
 Collections.sort(nameList, new ByLength());

 

集合的复制=============================================================

 

java默认的复制是浅层复制

  
 * 变量的赋值,复制的只是对象所在的地址
    
 ArrayList<String> others = names; 

 

集合复制有两种方法
  
 1) clone()方法
   clone()方法是Object定义的;
 
 clone()是将当前对象进行复制,返回当前对象类型的副本实例
 
 这个副本是浅层复制结果(java默认的所有复制,都是浅层复制)
 

 ArrayList<String>list2 = (ArrayList<String>)list1.clone();

 
 * clone只能复制本类型
 
 

 2) 使用复制构造器  
 
  所有java集合类都定义了复制构造器,可以从一个集合中复制所有的数据,创建新集合对象
 

 * 可以在不同类型集合间复制

 
 ArrayList<String> names = new ArrayList<String>();
 
 List<String> list2 = new LinkedList(names);
 
 Set<String>set = new HashSet<String>(names);

 

集合与数组的转换==========================================================
 
  
 1.集合到数组
 
 1)集合提供简单的复制到数组的方法 toArray()
  
 Object[] ary =list.toArray();
  返回的是Object类型的数组

 
 
 2)复制到指定类型数组 toArray(ary)
  
 
 toArray(ary)方法会尽可能填充参数数组对象
  
 如果参数对象长度不够,返回一个新数组对象,包含所有元素
  
 如果参数对象长度够用,就填充null
  
 String[] ary = new String[5];
  
   
 ary = names.toArray(ary);


 

        2.数组到集合
 
 asList()方法可以将数组转换为长度不可变的List;
 不支持增删:
 
 List<String>list = Arrays.asList(ary);
 
 //list.add("shanjp");//运行异常,不支持的方法
 
 
 //再用集合的复制构造器即可得到长度可变的集合
  List<String>list2=new ArrayList<String>(list);
 
 list2.add("shanjp");

 

 

同步化(线程安全)=========================================================
  
 
 Collections.synchronizedList() 
 
 Collections.synchronizedMap()

 将非线程安全的list,map转换为线程安全

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值