黑马程序员—集合

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

Collection
          List:元素是有序的,元素可以重复。因为该集合体系有索引。
          set:元素是无序的,元素不可以重复。

1.List:
          ArrayList:底层是数组数据结构。特点:查询很快,但是增删稍慢。线程不同步
          LinkedList:底层是链表数据结构。特点:增删很快,查询比较慢
          Vector:底层是数组数据结构。线程同步,被ArrayList替代

(1).
特有方法:凡是可以操作角标的方法,都是该体系的特有方法。
     add(index,element)、addAll(index,Collection)
     remove(index)
     set(index, element)
     get(index)、subList(from, to)、listIterator()

(2).
List集合特有的迭代器---ListIterator(它是Iterator的子接口)
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生并发修改异常(ConcurrentModificationException)。所以在迭代时,只能用迭代器的方式操作元素。可是在Iterator中操作元素的方法是有限的,只能对元素进行判断、取出、删除操作。如果想要其他操作,如添加、修改等,就需要使用其子接口---ListIterator。

(3).
ArrayList:
   集合中存储的都是对象的引用或者地址。

LinkedList:
特有方法:
addFirst()、addLast()
getFirst()、getLast():获得元素,但不删除元素。如果集合中没有元素,则会抛出                   
                              NoSuchElementException异常。
removeFirst()、removeLast():获得元素,并且删除元素。如果集合中没有元素,则会抛出
                                           NoSuchElementException异常。

在jdk1.6中出现了替代方法。offerFirst()、offerLast()、peekFirst()、peekLast()、pollFirst()、pollLast()(如果集合中没有元素,会返回null)。

(4).
List集合判断元素是否相同,依据的是元素的equals方法。
即:contains()和remove()方法底层依赖的都是元素的equals方法。

2.Set
(1). 
HashSet:底层数据结构是哈希表.

怎么保证HashSet中数据的唯一性呢?
     在存储数据的时候,它是通过先调用hashCode()方法来比较各个哈希值是否相同。如果一些数据的hashCode值相同,则再调用equals()方法来比较对象是否相同。这两个对象都是在底层自动被调用的。(如果存储对象的话,可以重写hashCode和equals方法。存储对象的时候,重写hashCode()方法时,不要总是返回同一个值,这样最后总是通过euqals方法来完成比较,效率不是很高。比较好的方式是
public  int  hashCode(){
     return  this .  name .hashCode() +  this .  age *27;  //这样写可以提高效率,不用每次都通过equals来比较
     }
注:HashSet集合判断元素是否相同,或者删除元素,依据的是hashCode()和equals()方法。

(2).
a. TreeSet:可以对Set集合中的元素进行排序(默认排序方式按照字母表的Unicode值排序)。

b. 底层数据结构是二叉树(二叉树默认存取为从小到大)。
保证元素唯一性的依据:compareTo方法返回(可以重写compareTo方法)。

c. TreeSet排序方式:
第一种:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,也叫做默认顺序。

第二种:当元素不具备比较性,或具备的比较性不是所需要的。这时需要让容器自身具备比较性。在容器初始化时,就具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

注:当两种比较方式都存在时,以比较器为主(定义比较器方法:定义一个类,实现Comparator接口,并且重写compare()方法)。

Map:
1.该集合存储键值对。一对一往里存,并且要保持键的唯一性。

2.Map取出方式
(1).keySet:将map中所有的键都存入Set集合中。因为Set具备迭代器,所以可以迭代方式取出所有的键,再根据get方法,取出每个键所对应的值。
(2).Set<Map.Entry<k,v>> entrySet:将Map集合中的映射关系存入到set集合中,而这个关系的数据类型就是Map.Entry。
示例:
                   Set<Map.Entry<String, String>> entry = map.entrySet();
           Iterator<Map.Entry<String, String>> it = entry.iterator();
             while (it.hasNext()){
                Map.Entry<String, String> me = it.next();
                String key = me.getKey();
                String value = me.getValue();
                System.  out println(key+ ", " +value);
           }

3.三个子类型:
Hashtable:底层是哈希表数据结构,不可以存入null键和null值。该集合是线程同步的,效率低。
HashMap:底层是哈希表数据结构,可以存入null键和null值。该集合是线程不同步的,效率高。
TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

4.Set集合底层就是运用了Map集合。

5.put(key, value):如果存入的两个值,它们的键相同。则第二次存入的键的值会覆盖第一次存入的值。分别打印两者的时候,被覆盖的值会返回null。

6.Map集合用与具有映射关系的数据


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值