您的位置:首页 > 职场人生

黑马程序员--java集合

2014-07-14 16:51 232 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------

集合框架的层次结构:

这里只列出常用的

                                                                     Collection

                     

                                Set                                                                                  List

          HashSet                         TreeSet                                     ArrayList      LinkedList      Vector

集合和数组的区别:

           数组长度一旦确定不可改变变。集合长度不固定,可以随意改变。

           数组只能存放一种类型的数据,在声明数组是就确定类型了。集合可以存放多种类型的对象。

结合中存储的是对象的引用,即地址。

Collection容器的通用方法: 

add()

将指定的元素添加到此列表的尾部。

ArrayList al = new ArrayList();

al.add("java");

al.add("c");

al.add("php");

al.add("asp");

addAll(Collection<? extends
E> c)


按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

也就是把一个容器里面的所有元素加入到另一个容器中,参数就是一个容器名。

ArrayList al2 = new ArrayList();

al2.add("win");

al2.add("unix");

al2.add("linux");

al2.add("ios");

al.addAll(al2);



clear()


移除此列表中的所有元素。

清空列表内容。

al.clear();

boolean contains(Object o)


如果此列表中包含指定的元素,则返回 true。

在以往判断数组中是否有某个元素是,就是采用循环判断的方法。集合里面的contains()方法,也是使用迭代的方法从前向后依次判断。



isEmpty()


如果此列表中没有元素,则返回 true

remove(Object o)


移除此列表中首次出现的指定元素(如果存在)。

al.remove("unix");

removeAll(Collection<?> c)


移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

Collection a ;

Collection b ;

a.removeAll(b);

把结合a和集合b的交集部分从集合a中删除。集合b不变。



由图可以看到,结合a被改变了,而集合b并没被改变。其实很容易理解,集合a对象调用了removeAll()方法进行操作,被操作的对象时a,集合b只是作为参数传递过去,所以结合b并没有被操作。

size()


返回此列表中的元素数。

Object  toArray()


按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

返回类型为Object。



retainAll(Collection<?> c)


仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

就是取交集。

Collection a ;

Collection b ;

a.retainAll(b);

结果把集合a和b中相同的元素放在结合a中,如果交集为空,则结合a就为空。集合b不变。



以上是集合容器的共性方法,就是所以Collection接口下的子接口或实现类都有上面这些方法。

下面分别说说List和Set。

List:元素是有序的,元素可以重复,有索引。

Set:元素师无序的,元素不可以重复,无索引。

其实把Collection分为这两个不同的子体系的最主要原因就是List有索引,Set无索引。

有了索引自然对应着可以用索引进行的操作。

List特有的方法:

add(int index, E element)
 

将指定的元素插入此列表中的指定位置。

al.add(2,"database");



addAll(int index, Collection<?
extends E> c)
 

从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

al.addAll(3,al2);



get(int index)
 
返回此列表中指定位置上的元素。

remove(int index)
 

移除此列表中指定位置上的元素。



set(int index, E element)
 
用指定的元素替代此列表中指定位置上的元素。

List下又分为:ArrayList,LinkedList,Vector,它们的存储结构不同,特点也不一样。

ArrayList:底层使用的是数组结构。特点:查询速度快,增删速度慢。线程不同步,速度快。

LinkedList:底层使用的是链表结构。特点:查询速度慢,增删速度快。

Vector:底层使用的是数组结构。线程同步,速度慢,被ArrayList替代了。

LinkedList特有的方法:

addFirst()  将指定元素插入此列表的开头。

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

由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:

offerFirst()
  在此列表的开头插入指定的元素。

offerLast()
   在此列表末尾插入指定的元素。

getFirst()  返回此列表的第一个元素。

getLast()
  返回此列表的最后一个元素。

由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:

peekFirst()   获取但不移除此列表的第一个元素;如果此列表为空,则返回
null。

peekLast()    获取但不移除此列表的最后一个元素;如果此列表为空,则返回
null。

removeFirst()
 移除并返回此列表的第一个元素。

removeLast()   移除并返回此列表的最后一个元素。

由于上面两个方法操作集合是会发生异常,jdk1.6提供了对应的更好用的方法:

pollFirst()  获取并移除此列表的第一个元素;如果此列表为空,则返回
null。

pollLast()   获取并移除此列表的最后一个元素;如果此列表为空,则返回
null。

接下来说说集合中的Set。

常用的Set容器就是HashSet和TreeSet,其实大致是一样的,只是TreeSet提供了一种排序,并非按元素加入集合的顺序排序,而是按照元素的ASCii码表顺序进行排序。

Hashset

在学HashSet的时候要了解一下哈希表,这样对于理解HashSet有帮助。

Hash值:类名@对象存放的地址.

Hash表:存放HashCode值的表。Hash表存Hash值并不是按先后顺序排列,而是按照Hash值得大小排列的。



HashSet保证元素唯一性的原理:判断元素的HashCode值是否相同,如果相同,进一步判断两个元素的内容是否相同,如果内容不相同,则依然会存进HashSet中,如果内容相同,则不会存入。

TreeSet

看似也无序,但其实也是有序的。TreeSet排序是按照集合内元素的ASCii码表进行排序的。



最后看看Map<K,V>

Map虽然不继承Collection,但是和Collection中的方法大致一样。

通过前面Collection中List和Set的学习,再学Map,就相对容易。Map中特有的方法不多,也都好用。

HashMap和TreeMap的关系与HashSet和TreeSet的关系基本一样。

之前对java中集合的学习相对较少,通过今天的学习,掌握了很多集合框架的原理性东西。Collection下的具体集合虽然很多,但是其中的几个就可以解决问题,上面都列出来了。从顶层的Collection借口的特征学习,再到具体的集合容器的独有特点,这样的学习方法很有效,找到规律学习很重要。

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------

   详细请查看 www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息