黑马程序员_java中的集合

来源:互联网 发布:数据科学师的职业规划 编辑:程序博客网 时间:2024/05/24 02:30

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

Java集合就像一种容器,可以把多个对象的引用放入容器中。集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
集合可分为Set、List和Map三种体系:
Set:无序、不可重复的集合
List:有序,可重复的集合
Map:具有映射关系的集合


注:在JDK1.5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理,从JDK1.5增加了泛型以后,Java集合可以记住容器中对象的数据类型。


Collection接口:


Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合:


Iterator接口:


Iterator接口主要用于遍历Collection集合中的元素,Iterator的对象也被称为迭代器,Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历


Collection集合元素的统一编程接口,Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。


高级for循环:


JDK1.5提供了高级for循环迭代访问Collection。
例:for(Objectobj:objs){
......
}


Set集合:


Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败,Set判断两个对象是否相同不是使用==运算符,而是根据equals方法.


HashSet:
HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet具有以下特点:
1.不能保证元素的排列顺序
2.HashSet不是线程安全的
3.集合元素可以使null
注:当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,所以依然可以添加成功。


hashCode()方法:
HashSet集合判断两个元素相等的标准:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。


重写hashCode()方法的基本原则
在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值,当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应相等,对象中用作equals()方法比较的Field,都应该用来计算hashCode值


LinkedHashSet


LinkedHashSet是HashSet的子类
LinkedHashSet集合根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet性能插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
LinkedHashSet不允许集合元素重复。

TreeSet


TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。


TreeSet 支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
自然排序

TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。

Comparable 的典型实现:
BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
Character:按字符的 UNICODE 值来进行比较
Boolean:true 对应的包装类实例大于 false 对应的包装类实例
String:按字符串中字符的 UNICODE 值进行比较
Date、Time:后边的时间、日期比前面的时间、日期大
注:因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象,当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过 equals() 方法比较返回 true,则通过 compareTo(Object obj) 方法比较应返回 0。

定制排序

如果需要实现定制排序,则需要在创建 TreeSet 集合对象时,提供一个 Comparator 接口的实现类对象。由该 Comparator 对象负责集合元素的排序逻辑。

List
List代表一个元素有序、且可重复的集合,集合中的每个元素都有其对应的顺序索引,

List 允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List 默认按元素的添加顺序设置元素的索引。List 集合里添加了一些根据索引来操作集合元素的方法:
void add(int index, Object ele)boolean addAll(int index, Collection eles)
Object get(int index)
int indexOf(Object obj)
int lastIndexOf(Object obj)Object remove(int index)
Object set(int index, Object ele)
List subList(int fromIndex, int toIndex)

List额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法:
boolean hasPrevious()Object previous()

void add()

ArrayList和Vector
ArrayList和Vector是List 接口的两个典型实现,二者的区别在于,Vector是一个古老的集合,通常建议使用ArrayList,ArrayList是线程不安全的,而Vector是线程安全的。但
即使为保证List集合线程安全,也不推荐使用Vector。
Arrays.asList(…)方法返回的List集合即不是ArrayList实例,也不是Vector实例,其返回值是一个固定长度的 List 集合。

Map
Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组用于保存Map里的 Value。
Map中的key和value都可以是任何引用类型的数据,
Map中的Key不允许重复,即同一个Map对象的任何两个Key通过equals方法比较中返回false,
Key 和 Vlaue 之间存在单向一对一关系,即通过指定的Key总能找到唯一的,确定的Value。

HashMap与Hashtable

HashMap和Hashtable是Map接口的两个典型实现类,他们的区别在于Hashtable是一个古老的Map实现类,不建议使用;Hashtable是一个线程安全的,HashMap是线程不安全的;

Hashtable不允许使用null作为key和value,而HashMap可以。
与HashSet集合不能保证元素的顺序的顺序一样,Hashtable 、HashMap也不能保证其中key-value对的顺序,Hashtable、HashMap判断两个Key相等的标准是:两个 Key 通过 equals方法返回true,hashCode 值也相等。Hashtable、HashMap判断两个Value相等的标准是:两个Value通过equals方法返回 true。

Properties
Properties类是Hashtable的子类,该对象用于处理属性文件,由于属性文件里的key、value都是字符串类型,所以properties里的Key和Value都是字符串类型的。

TreeMap
TreeMap存储Key-Value对时,需要根据Key对key-value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。

TreeMap的Key的排序:
自然排序:TreeMap的所有的Key必须实现Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException
定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要Map的Key实现Comparable 接口

Collections

Collections是一个操作Set、List和Map等集合的工具类
Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法

排序操作:
everse(List):反转 List 中元素的顺序
shuffle(List):对 List 集合元素进行随机排序
sort(List):根据元素的自然顺序对指定List集合元素按升序排序
sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
swap(List,int,int):将指定list集合中的i处元素和j处元素进行交换

查找、替换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
Object min(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最小元素
int frequency(Collection,Object):返回指定集合中指定元素的出现次数
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值

同步控制
Collections类中提供了多个synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题\


Enumeration
Enumeration 接口是 Iterator 迭代器的 “古老版本”



---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

原创粉丝点击