黑马程序员----------java基础知识加强之集合总概述
2014-05-19 00:53
363 查看
----------------------android培训、java培训、期待与您交流!
----------------------
简单总结一下Collection集合体系,包括他的两个大子接口List、Set以及他们的实现类。
1)集合概述
首先要知道集合是一种工具类,可以用于存储数量不等的多个对象。
然后就是集合体系:java集合大致可以分为Set,List,Map3中体系。
(其实集合框架下还有很多集合但现在不需要掌握太多,以后慢慢学)
Collection|----Set 代表无序,不可重复的集合
|----List 代表有序,重复的集合
|----Queue 代表一种队列集合体现
Map 代表有映射关系的集合
2)用Iterator接口实现遍历集合元素
Iterator接口与其他集合框架成员不一样,它主要用于遍历Collection集合中的元素,
Iterator对象被称为迭代器。
代码如下:
class IteratorTest
{
public static void main(String[] args)
{
Collection c = new HashSet();
c.add("黑马Android");
c.add("黑马云计算");
c.add("黑马.Net");
Iterator it = c.Iterator();
while(it.hasNext())
{
String course = (String)it.next();
System.out.println(course);
}
if(course.equals("黑马.Net"))
{
it.remove();
}
course = "黑马ios";
}
System.out.println(c);
}
当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量
,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何
影响。
3)Set集合
注意:Set判断两个对象相同不是用 == 运算符,而是根据equals方法。
1.HashSet类
主要是两个方法hashcode方法和equals方法
实际上当程序向HashSet集合中添加元素时,HashSet会根据该元素的hashCode值来计算他的存储位置,
也就是说,每个元素的hashCode值就可以决定他的存储“索引”
一个特别好的例子:
import java.util.*;
//类A的equals方法总是返回true,但没有重写其hashCode()方法
class A
{
public boolean equals(Object obj)
{
return true;
}
}
//类B的hashCode()方法总是返回1,但没有重写其equals()方法
class B
{
public int hashCode()
{
return 1;
}
}
//类C的hashCode()方法总是返回2,且有重写其equals()方法
class C
{
public int hashCode()
{
return 2;
}
public boolean equals(Object obj)
{
return true;
}
}
public class HashSetTest
{
public static void main(String[] args)
{
HashSet books = new HashSet();
//分别向books集合中添加两个A对象,两个B对象,两个C对象
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
2.LinkedHashSet类
LinkedHashSet集合也是根据元素的hashcode值来决定元素存储位置的,但它同时使用
链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说遍历LinkedHashSet
集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
注意:虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是
HashSet,因此他依然不允许集合元素重复。
3.TreeSet类
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。它是根据元素实际值大小
排序的。TreeSet是采用二叉树来进行存储集合元素的。
TreeSet支持两种排序方法:自然排序和定制排序(默认下是自然排序)
自然排序(实现Comparable):
TreeSet会调用集合元素的compareTo()方法来比较元素之间的大小关系,然后按升序排列。
(集合里的元素总是引用,但我们习惯上把被引用的的对象称为集合元素)
定制排序(提供一个Comparator对象与该集合关联(匿名内部类)):
通过Comparator接口帮助,该接口里包含了int compare(T o1,T o2)方法。
4.EnumSet类(这个现在了解就好)
4)List集合
1.List接口和ListIterator接口
首先我觉得学每个集合最重要的就是学他有什么方法,这就需要勤查API帮助文档。
ListIterator接口增加了向前迭代的功能,而且还能通过add方法向List集合中添加元素。
2.ArrayList和Vector实现类
他们是基于数组实现的List类,所以ArrayList和Vector实现类封装了一个动态的,允许再分配的
Object[]数组。
5)Queue集合
Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。队列的头部保存在队列中
存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。
1.PriorityQueue实现类
是一个比较标准的队列实现,PriorityQueue类保存队列的元素的顺序并不是按加入队列的顺序,
而是按队列元素的大小进行重新排序。
6)Map<key,value>集合
发现一个学习Map集合的方法就是把Map中的key当做Set来看。
对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同,因为他们的实现机制几乎完全
一样;但HashMap通常比Hashtable要快一点,因为后者需要额外的线程同步控制。TreeMap通常比
他们两个都慢(尤其在插入,删除key-value对时更慢)。
使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
7)操作集合的工具类:Collections
该工具类提供了大量方法对集合元素进行排序,查询和修改等操作,还提供了将集合对象设置为
不可变,对集合对象实现同步控制等方法。
同步控制:Collections中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步
的集合,从而可以解决多线程并发访问集合时的线程安全问题。
----------------------android培训、java培训、期待与您交流!
----------------------
----------------------
简单总结一下Collection集合体系,包括他的两个大子接口List、Set以及他们的实现类。
1)集合概述
首先要知道集合是一种工具类,可以用于存储数量不等的多个对象。
然后就是集合体系:java集合大致可以分为Set,List,Map3中体系。
(其实集合框架下还有很多集合但现在不需要掌握太多,以后慢慢学)
Collection|----Set 代表无序,不可重复的集合
|----List 代表有序,重复的集合
|----Queue 代表一种队列集合体现
Map 代表有映射关系的集合
2)用Iterator接口实现遍历集合元素
Iterator接口与其他集合框架成员不一样,它主要用于遍历Collection集合中的元素,
Iterator对象被称为迭代器。
代码如下:
class IteratorTest
{
public static void main(String[] args)
{
Collection c = new HashSet();
c.add("黑马Android");
c.add("黑马云计算");
c.add("黑马.Net");
Iterator it = c.Iterator();
while(it.hasNext())
{
String course = (String)it.next();
System.out.println(course);
}
if(course.equals("黑马.Net"))
{
it.remove();
}
course = "黑马ios";
}
System.out.println(c);
}
当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量
,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何
影响。
3)Set集合
注意:Set判断两个对象相同不是用 == 运算符,而是根据equals方法。
1.HashSet类
主要是两个方法hashcode方法和equals方法
实际上当程序向HashSet集合中添加元素时,HashSet会根据该元素的hashCode值来计算他的存储位置,
也就是说,每个元素的hashCode值就可以决定他的存储“索引”
一个特别好的例子:
import java.util.*;
//类A的equals方法总是返回true,但没有重写其hashCode()方法
class A
{
public boolean equals(Object obj)
{
return true;
}
}
//类B的hashCode()方法总是返回1,但没有重写其equals()方法
class B
{
public int hashCode()
{
return 1;
}
}
//类C的hashCode()方法总是返回2,且有重写其equals()方法
class C
{
public int hashCode()
{
return 2;
}
public boolean equals(Object obj)
{
return true;
}
}
public class HashSetTest
{
public static void main(String[] args)
{
HashSet books = new HashSet();
//分别向books集合中添加两个A对象,两个B对象,两个C对象
books.add(new A());
books.add(new A());
books.add(new B());
books.add(new B());
books.add(new C());
books.add(new C());
System.out.println(books);
}
}
2.LinkedHashSet类
LinkedHashSet集合也是根据元素的hashcode值来决定元素存储位置的,但它同时使用
链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说遍历LinkedHashSet
集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
注意:虽然LinkedHashSet使用了链表记录集合元素的添加顺序,但LinkedHashSet依然是
HashSet,因此他依然不允许集合元素重复。
3.TreeSet类
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。它是根据元素实际值大小
排序的。TreeSet是采用二叉树来进行存储集合元素的。
TreeSet支持两种排序方法:自然排序和定制排序(默认下是自然排序)
自然排序(实现Comparable):
TreeSet会调用集合元素的compareTo()方法来比较元素之间的大小关系,然后按升序排列。
(集合里的元素总是引用,但我们习惯上把被引用的的对象称为集合元素)
定制排序(提供一个Comparator对象与该集合关联(匿名内部类)):
通过Comparator接口帮助,该接口里包含了int compare(T o1,T o2)方法。
4.EnumSet类(这个现在了解就好)
4)List集合
1.List接口和ListIterator接口
首先我觉得学每个集合最重要的就是学他有什么方法,这就需要勤查API帮助文档。
ListIterator接口增加了向前迭代的功能,而且还能通过add方法向List集合中添加元素。
2.ArrayList和Vector实现类
他们是基于数组实现的List类,所以ArrayList和Vector实现类封装了一个动态的,允许再分配的
Object[]数组。
5)Queue集合
Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出”的容器。队列的头部保存在队列中
存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。
1.PriorityQueue实现类
是一个比较标准的队列实现,PriorityQueue类保存队列的元素的顺序并不是按加入队列的顺序,
而是按队列元素的大小进行重新排序。
6)Map<key,value>集合
发现一个学习Map集合的方法就是把Map中的key当做Set来看。
对于Map的常用实现类而言,HashMap和Hashtable的效率大致相同,因为他们的实现机制几乎完全
一样;但HashMap通常比Hashtable要快一点,因为后者需要额外的线程同步控制。TreeMap通常比
他们两个都慢(尤其在插入,删除key-value对时更慢)。
使用TreeMap有一个好处:TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
7)操作集合的工具类:Collections
该工具类提供了大量方法对集合元素进行排序,查询和修改等操作,还提供了将集合对象设置为
不可变,对集合对象实现同步控制等方法。
同步控制:Collections中提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步
的集合,从而可以解决多线程并发访问集合时的线程安全问题。
----------------------android培训、java培训、期待与您交流!
----------------------
相关文章推荐
- 黑马程序员 java基础知识加强---枚举
- 黑马程序员_java基础知识总结(3)集合框架
- 黑马程序员——JAVA基础——集合---概述、Collection中共性方法、List、Map、工具类Collections和Arrays
- 黑马程序员——Java基础知识(集合框架(下))
- 黑马程序员——java概述和基础知识
- 黑马程序员_java概述与基础知识
- 黑马程序员学习log第一篇基础知识:java概述及基础语法总结
- 黑马程序员——Java语言基础——06.集合框架(1)集合框架概述和List、Set集合
- 黑马程序员java基础集合知识整合
- 黑马程序员-Java基础知识预备之Java集合
- 黑马程序员之基础加强之IDE基础知识和Java5新特性
- 黑马程序员-Java基础知识预备之Java概述
- 黑马程序员--集合框架知识总结和泛型--java学习日记7(基础知识)
- 黑马程序员,Java基础知识七:集合类
- 黑马程序员 Java基础知识总结-j集合框架
- 黑马程序员----------java基础知识加强之IO输入输出
- 黑马程序员 java概述与基础知识<一>
- 黑马程序员——java基础知识之泛型、集合(Map、工具类等)
- 黑马程序员-------------(十一)Java基础知识加强(二)
- 黑马程序员——Java语言基础——01.基础知识【基本常识】【java概述】【配置环境变量】