黑马程序员_集合

来源:互联网 发布:淘宝如何登录店铺 编辑:程序博客网 时间:2024/05/20 07:53

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

 

面向对象语言对事物的体现都是以对象的形式,所以为方便对多个对象进行操作,需要对对象进行存储操作,集合就是存储对象最常用的一种方式。java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

 

数组与集合的区别:

数组可存储基本数据类型和对象,长度固定;

集合只能存储对象,长度可变;

 

Collection的共性方法:

1、  增加

向集合添加单个元素:booleanadd(E e)

向集合添加另一集合的元素:booleanaddAll(Collection<? extends E> c)

2、  删除

全部删除:void clear()

删除单个元素:booleanremove(Object o)

删除另一集合中的元素:booleanremoveAll(Collection<?> c)  

删除另一集合中没有的元素:booleanretainAll(Collection<?> c)

3、  判断

集合中元素是否为空:booleanisEmpty()

比较该集合内容与指定对象是否相同:booleanequals(Object o)

集合中是否包含指定对象:booleancontains(Object o)

集合中是否包含指定集合中所有元素:booleancontainsAll(Collection<?> c)

4、  获取

集合中元素个数:int size()

集合的哈希值:int hashCode()

将集合转换为Object类型数组:Object[]toArray()

将集合转换为指定类型数组:<T>T[] toArray(T[] a)

集合的迭代器:Iterator<E>iterator()

注意:集合使用迭代器遍历集合中元素,但遍历元素时只能使用迭代器的方法对元素进行修改操作,若集合方法对集合元素操作,相应的操作后结果不能返回给迭代器,迭代器遍历会出错。迭代器方法有:判断boolean hasNext()、取出元素E next()和删除元素void remove(。)

 

Collection接口两大子接口:

List接口:集合中元素有序,元素允许重复,有索引即下标;

Set接口:集合元素无序(存入和取出不一定有规则),元素不允许重复;

 

List接口特有方法

1、  增加

指定位置添加单个元素:void add(intindex, E element)

指定位置添加另一集合的元素:booleanaddAll(int index, Collection<? extends E> c)

2、  删除

删除指定位置元素:E remove(intindex)

3、  获取

指定位置元素:E get(intindex)  

指定长度子集合视图:List<E>subList(int fromIndex, int toIndex)

4、  修改

指定位置元素E set(intindex, E element)

注意:subList修改后直接反应到原List,而原List修改后,不会反应到subList,所以在使用subList时,应该限制对原List操作。

 

List的常用实现类

ArrayList:底层数据结构为数组,特点:线程不同步,查询快,增删较慢;

LinkedList:底层数组结构为双向链表,特点:线程不同步,增删较快,查询较慢;

Vector:底层数据结构为数组,特点:线程同步,增删查较慢;

注意:ArrayList和Vector默认集合可存储10个元素,若元素超出后,ArrayList新建对象,集合长度增加50%,即增加存储5个对象空间;Vector新建对象,集合长度增加100%,即增加存储10个对象空间;若程序设计时明确元素个数较多,最好指明初始容量。

 

Vector中的枚举Enumeration接口

枚举的名称和方法名都过长,故被Iterator迭代器取代。

获取枚举对象:Enumeration<E> elements()

判断:boolean hasMoreElements()

取出:E nextElement()

 

LinkedList的特有方法:

1、  增加

在列表头添加元素:voidaddFirst(E e)

在列表尾添加元素:voidaddLast(E e)

自JDK1.6版本

在列表头添加元素:booleanofferFirst(E e)

在列表尾添加元素:booleanofferLast(E e)

2、  删除

列表头元素:EremoveFirst()

列表尾元素:EremoveLast()

自JDK1.6版本,列表为空,返回null

列表头元素:EpollFirst()

列表尾元素:E pollLast()

3、  获取

列表头元素:E getFirst()

列表尾元素:E getLast()

自JDK1.6版本,列表为空,返回null

列表头元素:E peekFirst()

列表尾元素:EpeekLast()

 

Set的常用实现类

HashSet:底层数据结构是哈希表,线程不同步。HashSet通过元素的两个方法,hashCode和equals来保证集合元素的唯一性。若元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。对于判断元素是否存在,以及删除等操作依赖的方法是元素的hashCode和equals方法。注意:HashSet是用哈希值作为索引,优化哈希表效率的,故修改元素时,不要修改自定义计算hashCode值的字段(属性),造成HashSet索引哈希值,与元素计算的哈希值不同,造成元素删除查找失败情况。

 

TreeSet:底层数据结构是二叉树,线程不同步,可以对Set集合中的元素进行排序,它保证元素唯一性的依据是compareTo方法。TreeSet的第一种排序方式:元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法,这种方式称为元素的自然顺序,也叫默认顺序。TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的,这是就需要让集合自身具备比较性,创建TreeSet对象时将Comparator子类对象作为参数传入构造函数中。注意:1、若存入集合中元素自身无比较性,且未传入比较器时,会抛出类型转换异常;2、用compareTo方法或比较器排序时,要注意排序条件,当主要条相同时,还要比较次要条件,不然会视为相同元素,仅能存储一个;3、当元素自身具备比较性,同时又传入比较器后,排序结果依据比较器的排序原则。

 

Map接口

集合中元素为将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序定义为迭代器在映射的collection视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。

 

Map的共性方法:

1、  增加

向集合添加单个元素(若存在该键值,则覆盖,返回值为被覆盖的原映射):

V put(K key, V value)

向集合添加另一集合的元素:voidputAll(Map<? extends K,? extends V> m)

2、  删除

全部删除:void clear()

删除指定键的映射关系:Vremove(Object key)

3、  判断

集合中元素是否为空:booleanisEmpty()

集合中是否存储指定键的映射关系:booleancontainsKey(Object key)

集合中是否存储键映射到指定值:booleancontainsValue(Object value)

4、  获取

集合中元素个数:int size()

返回指定键所映射的值:Vget(Object key)

返回此映射中包含的键的Set视图:Set<K>keySet()

返回此映射中包含的值的Collection视图:Collection<V>values()

返回此映射中包含的映射关系的Set视:Set<Map.Entry<K,V>>entrySet()

其中:Map.Entry<K,V>映射项,即键-值对,映射项用迭代器取出。

比较指定对象与此项的相等性:boolean equals(Object o)

返回与此项对应的键:KgetKey();

返回与此项对应的值:VgetValue();

返回此映射项的哈希码值:inthashCode();

用指定的值替换与此项对应的值:V setValue(V value);

 

Set的常用实现类

Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。

HashMap:底层是哈希表数据结构,允许使用null 值和null 键,该集合是不同步的。

TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

 

泛型

JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制。

使用泛型的好处:1.将运行时期出现的ClassCastException转移到了编译时期,方便于程序员解决问题,让运行时问题减少,安全性大大提高。2.避免了强制转换的麻烦,未添加泛型的集合相当于Collection<Object>,想使用子类特性时,需要进行向下转型。

 

泛型的格式:通过<>来定义要操作的引用数据类型,通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收泛型的。当要使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

 

泛型类:当类中要操作的引用类型不确定时,在class声明处定义泛型,泛型类定义的泛型在整个类中有效。

注意:1、静态成员随类加载而加载,类加载时操作的类型并没有确定下来,因而静态方法不能使用泛型类定义的泛型类型作为参数和返回值。静态方法要定义泛型必须自定义,且泛型标识符必须置于返回值类型前;2、泛型类中不能使用泛型在属性定义时进行初始化操作,即T t = new T(); 是不允许的。

 

泛型方法:泛型类定义的泛型在整个类中有效,定义了泛型的方法称为泛型方法

 

泛型接口:泛型定义在接口上。实现泛型接口的类,要么指定引用的数据类型,要么定义为泛型类。注意:若接口中的方法不是泛型方法,则重写时不能定义为泛型方法。

 

泛型类型:

E 泛型参数。常采用单个大写字母表示。

? 通配符。也可以理解为占位符,代表任意泛型参数。

Collection<E>优于Collection<?>,Collection<Object>(即原生类型)

原因:使用泛型参数时,可以定义与参数类型或返回值类型相关的方法,通配符的则不能;使用通配符?或E泛型参数可省去类型转换操作,Collection<Object>将所有类型向上转型为Object类,使用非Object方法需要向下转型。

注意:1、泛型参数不能用于数组上。

 

泛型限定;

? extends E: 可以接收E类型或者E的子类型。上限。通用数据类型为E;

? super E: 可以接收E类型或者E的父类型。下限。通用数据类型为Object;

 

集合框架的工具类Collections。

集合框架的工具类。该类中的方法都是静态的,提供的方法中有可以对list集合进行排序,二分查找等方法。通常常用的集合都是线程不安全的。因为要提高效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

1、  排序

sort(List<T>list);

sort(List<T>list, Comparator<? super T> c)

2、  获取极值

max(Collection<? extends T> coll);

max(Collection<? extends T> coll, Comparator<?super T> comp);

min(Collection<? extends T> coll);

min(Collection<? extends T> coll, Comparator<?super T> comp);

3、  二分查找

binarySearch(List<? extends Comparable<? superT>> list, T key);

binarySearch(List<? extends T> list, T key,Comparator<? super T> c);

4、  替换

fill(List<? super T> list, T obj);

static <T> boolean replaceAll(List<T> list, ToldVal, T newVal);

5、  反转

static void reverse(List<?>list);

static <T> Comparator<T> reverseOrder();

static <T> Comparator<T> reverseOrder(Comparator<T>cmp);

6、  乱序

static voidshuffle(List<?> list)

7、  交换

static void swap(List<?>list, int i, int j)

8、  线程安全

static <T>Collection<T> synchronizedCollection(Collection<T> c);

static <T>List<T> synchronizedList(List<T> list);

static<K,V> Map<K,V> synchronizedMap(Map<K,V> m);

static <T>Set<T> synchronizedSet(Set<T> s);

 

集合与数组之间的转换

Arrays用于操作数组的工具类

Arrays.asList:将数组变成List集合;

Collection类中的toArray方法:将集合变为数组;

注意:1、将集合变为数组或将数组变为集合,原有的集合或数组增删操作都不能使用;2、若数组元素为基本数据类型,转换后的集合中将只有一个元素,该元素即为基本数据类型数组,因为集合不能存储基本数据类型数据。

0 0
原创粉丝点击