黑马程序员_集合
来源:互联网 发布:淘宝如何登录店铺 编辑:程序博客网 时间: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、若数组元素为基本数据类型,转换后的集合中将只有一个元素,该元素即为基本数据类型数组,因为集合不能存储基本数据类型数据。
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 黑马程序员_集合
- 你是我骄傲的水仙
- jfreechart生成折线图实例(修改鼠标提示内容)
- 使用FireBug调试本地的Scriptish脚本
- TCP编程
- 软件与经济学 (开发篇)
- 黑马程序员_集合
- xStream完美转换XML、JSON /XStream Xml与JavaBean对象的互转经典【转载】
- leetcode题目解答---- SortList
- hbase shell 预分区
- 颜色对照表
- 统计输入的行数、单词数与字符数用C实现
- 用Pelican和Github Pages在Linux上搭建个人博客
- DB2 Session每周讨论话题
- 关于android:layout_weight