黑马程序员_基础回顾之集合

来源:互联网 发布:xls文件解密软件 编辑:程序博客网 时间:2024/05/23 11:37

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

我们面向对象过程中,如果操作的是多个对象,就需要把多个对象进行存储.所以我们出现了集合框架.
 我们不是可以通过数组做到这件事情吗?为什么要需要集合框架呢?数组的长度是固定的.
  
  集合与数组:
  1:集合用来存储对象的.(只能存对象)
    长度是可以变化的.
  2:数组可以存储对象,也可以存储基本数据类型. (Student[],int[])
    长度固定的.
    
  集合也是一个容器,并且,集合是最重要的容器.这个容器由于数据结构不同,又分为很多种小容器.
  数据结构:按照某种方式存储数据的一种方式.由于数据结构不同,我们不断的向上抽取,形成了体系结构.
  这个顶层是Collection.那么,按照我们学习的规律:我们先学习Collection.zzz
  
  Collection接口中的方法:
  1:存储数据
  boolean add(Object obj);存储一个对象
  boolean addAll(Collection c);存储一个集合
  2:判断
  boolean isEmpty();判断集合是否为空
      boolean contains(Object o);判断集合是否包含一个元素
      boolean containsAll(Collection c);判断集合是否包含一个集合 
  3:取出,遍历
       Iterator iterator() 
          返回在此 Collection 的元素上进行迭代的迭代器。 
  4:删除
  boolean remove(Object obj);从集合中删除一个元素
  boolean removeAll(Coolection c);从集合中删除一个集合的元素
  void clear();清除集合所有的元素.
 5:长度
  int size();返回集合中的元素个数
  6:把集合转成数组
     Object[] toArray();
  7:boolean retainAll(Collection c);取得集合中的交集元素
Collection
  |--List元素有序(存储顺序和取出顺序一致),可重复(元素可以由相同的)
  |--Set元素无序,不可重复
 List:
  1:存储
  void add(int index, Object obj);在指定位置存储元素,不覆盖以前的元素.以前的元素后移.
       boolean addAll(int index,Collection c);在指定位置存储一个集合的元素
  2:修改
  Object set(int index, Object obj) 
          用指定元素替换列表中指定位置的元素,返回了修改前的元素.
  3:获取
  Object get(int index) 返回列表中指定位置的元素。
  int indexOf(Object o) 
  返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
   int  lastIndexOf(Object o) 
          返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
        ListIterator listIterator() 
          返回此列表元素的列表迭代器(按适当顺序)。
         
    ListIterator和Iterator的区别:
      ListIterator继承了Iterator,所以说,它可以使用和Iterator一样的功能.它有含有特有的方法,
    供我们使用,比如说:它可以增加元素,可以向前获取元素.


List接口:元素有序(存储顺序和取出顺序一致),可重复(元素可以由相同的)。
  |--ArrayList
  底层数据结构是数组,有编号,不是同步的,效率高.
  查询效率高.其他操作效率低.
    |--Vector
    底层数据结构是数组,有编号,同步的,效率低.
    查询效率及其他操作效率低.
  |--LinkedList
    底层数据结构是链表,不是同步的,效率高.
  查询效率低,其他操作效率高.
 
   JDK版本的升级:
   1:方便书写
   2:提高效率
   3:提高安全
ArrayList:
需求:
去除ArrayList集合中的重复元素。
如果元素是自定义元素(Person)。如果这个人的年龄和姓名相同,我们认为它是同一个人。
根据查看原码,我们发现,ArrayList集合中的判断是否包含否个成员方法contains()判断的已经是eqauls方法.
 那么,如果想解决问题,我们就必须重写equals方法.要对Person类进行比较。就在Person类中重写。
@Override
public boolean equals(Object obj) { // Object obj = new Person();
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
if ((this.age == p.age) && (this.name.equals(p.name))) {
return true;
} else {
return false;
}
}
public static ArrayList getSingletonCollection(ArrayList array) {
ArrayList al = new ArrayList();
for (int x = 0; x < array.size(); x++) {
Person p = (Person) array.get(x);
//判断al中是否包含某个元素,如果不包含,则把元素加入al.
if (!al.contains(p)) {
al.add(p);
}
}
return al;
}
LinkedList:
  1:增加元素
  void addFirst(Object obj) 将指定元素插入此列表的开头。 

    void addLast(Object obj) 将指定元素添加到此列表的结尾。 


   2:获取元素
    Object getFirst()  返回此列表的第一个元素。 
  Object getLast() 返回此列表的最后一个元素。 
   
   3:移除元素
      Object removeFirst() 
          移除并返回此列表的第一个元素。
    Object removeLast() 
          移除并返回此列表的最后一个元素。    
         
  boolean offerFirst(Object obj) 在此列表的开头插入指定的元素。 
    boolean offerLast(Object obj) 在此列表末尾插入指定的元素。 
  Object peekFirst() 
          获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。 
  Object peekLast() peek:偷看
          获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。 
    Object pollFirst poll:剪过毛的,修过枝的。
      获取并移除此列表的第一个元素;如果此列表为空,则返回 null。 
    Object pollLast
      获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。 
Set集合的特点:元素无序,不能有重复元素
  放元素的时候,有可能你放入的顺序和取出的顺序一致,但这不代表Set是有序的.这是你放元素的
  顺序恰好和Set集合本身对象元素放置时顺序一致.这是碰巧.你可以多放置一些元素,就能看到Set元素是无序的.
Set:元素无序,不重复,用Iterator遍历
  |--HashSet
  底层数据结构是哈希表.根据hashCode值存储.线程不安全,存取速度快。
  它判断元素根据:hashCode和equals方法.
  首先判断hashCode值是否相同:
  如果不同,直接把元素存储.
  如果相同,在调用equals方法进行判断.
|--TreeSet
    底层数据结构是二叉树.
HashSet存储自定义对象 
  
  我们假设:姓名和年龄相同的人为同一个人.那么,HashSet中就不能存储姓名和年龄都相同的人.
  对应HashSet集合:.
  它判断元素是否重复,是通过hashCode和equals两个方法进行判断:
  1:首先根据hashCode判断,如果hashCode不同,那么肯定不是重复元素.
  2:如果hashCode相同,那么,它有可能是重复元素,这个时候,我们需要重写equals方法来进行判断.
  
  如果我们是用ArrayList存储自定义对象,这个时候,我们的自定义对象如果是按照我们自己的方式认为它相同.
  那么,我们就需要重写equals方法.
  
  而我们用HashSet存储自定义对象,这个时候,我们的自定义对象如果是按照我们自己的方式认为它相同,
  那么,我们需要重写hashCode和equals.
TreeSet:
  线程不安全,可以对Set集合中的元素进行排序。
  它的排序是如何进行的呢?
  TreeSet数据结构是二叉树:
我想让Worker这个类按照姓名的长度进行排序
  1:改Worker类中的compareTo方法,但是不推荐.
  2:实现一个接口Comparator,重写compare方法。自定义比较器,而且以自定义比较器为主.

Map是个双列的集合.
Collection是个单例的集合.



Map<K,V>:
是键值对形式的顶层接口. Map的键唯一,每个键对应一个值.
  |--Hashtable 底层是哈希表数据结构,键和值都不能为null,同步的.
  |--HashMap 底层是哈希表数据结构,键和值可以为null,不同步.
  如果保证键是唯一的? hashCode,equals
  |--TreeMap 底层是二叉树结构.对键进行排序.
  如何保证键排序的? Comparable,Comparator
Map接口中的方法:
   A:存储数据
    Object put(K key, V value) 
  将指定的值与此映射中的指定键关联(可选操作)。 
  void putAll(Map m) 
  从指定映射中将所有映射关系复制到此映射中(可选操作)。 
  B:判断
    boolean containsKey(Object key) 
  如果此映射包含指定键的映射关系,则返回 true。 
boolean containsValue(Object value) 
如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty() 
如果此映射未包含键-值映射关系,则返回 true。
  C:获取数据
    Set<Map.Entry<K,V>> entrySet():
    Object get(Object key) 
  返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
  Set<K> keySet() 
  返回此映射中包含的键的 Set视图。
  Collection<V> values() 
  返回此映射中包含的值的 Collection视图。  
   D:长度
    int size() 
返回此映射中的键-值映射关系数。 
    E:删除
    void clear():从此映射中移除所有映射关系
    Object remove(Object key) 
  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 
 HashMap:键保证唯一
LinkedHashMap:保证元素有序.底层是链表结构。
TreeMap 底层是二叉树结构.对键进行排序.
小技巧:
array:数组结构
linked:链表结构
hash:哈希结构
tree:二叉树结构
集合的工具类:Collections中的方法。
 1:对集合进行查找
 2:取出集合中的最大值,最小值
 3:对List集合进行排序
 4:swap(List<?> list, int i, int j) 
          在指定列表的指定位置处交换元素。
 5:replaceAll(List<T> list, T oldVal, T newVal) 
          使用另一个值替换列表中出现的所有某一指定值。 
 6:static void reverse(List<?> list) 
          反转指定列表中元素的顺序。 
数组的工具类:Arrays中的方法。
1:将数组转成List集合
//把数组转成集合
int[] arr = {20,10,30,25};
List<int[]> list = Arrays.asList(arr);
可以使用集合中的方法
2:对数组进行排序Arrays.sort()
//排序
Arrays.sort(arr);
3:对数组进行二分查找
//查找   二分查找的条件:数组必须有序
Arrays.binarySearch(arr, 25)
4:把数组转成字符串
static toString(xx[] xx)

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


原创粉丝点击