----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
集合(上)
1、集合概念
为什么出现集合类:
在面向对象的编程思想中,都是以对象的形式对事物进行描述的,为了保证对象的生命周期,我们需要持有对象
在很多情况下,我们不知道在程序中需要创建多少个对象,这时就不能依靠定义引用对象的变量来持有每一个对象
所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类的区别:
*数组也可以存储对象,但长度是固定的;集合长度是可变的。
*数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
集合类只用于存储对象
集合类的长度可变
一个集合可以存储多种类型的对象
集合类详解:
JDK为我们提供了一套完整的容器类库,这些容器可以用于存储各种类型的对象,并且长度都是可变的,
我们把这些类统称为集合类,它们都位于java.util包中。
整个集合类按照存储的结构被分为单列集合和双列集合:
*单列集合的根接口是Collection:一个独立的元素的序列,这些元素服从一条或多条规则
|--List(列表)集合的特点是元素有序、包含重复元素。
|--Set(集)集合的特点是元素无序、不包含重复元素。
*双列集合的根接口是Map:存储的是键值映射关系,一组成对的”键值对”对象,允许根据键来查找值。
Map集合的键不允许有重复,所以Map集合的所有key键构成了一个Set集合。
|--HashMap
|--TreeMap。
2、collection的功能:
当容器多了以后,每一个容器因为数据结构的不同,分出了很多容器。那么这些都具备一些共性的特点
出现上向抽取。最终顶层类或者接口中定义的就是集合框架的共性方法。这个顶层接口之一就是Collection
collection是接口,不能创建对象,所以通过子类,如ArrayList来创建对象。
例:collection c = new ArrayList();
boolean add(); //添加元素
boolean addAll(collection对象) //添加一堆元素
boolean remove(); //删除元素
boolean removeAll(collection对象) //删除调用对象中与传入对象相同的元素
void clear(); //清空
int size(); //获取元素个数
boolean retainAll(collection对象) //获取两个集合的交集,调用者存的是两个对象交集的元素
boolean isEmpty(); //判断是否是空
boolean contains(); //判断某个元素是否在集合中
boolean containsAll(collection对象) //判断一堆元素是否存在
开发是把集合元素取出来,要么挨个判断,要么列在网页上,不是简单的输出
3、List集合
可存放重复元素,元素存取是有序的。
List集合中特有方法:
添加功能:
boolean list.add(String item); //向list里添加元素
void list.add(index,String item)//在index索引位插入元素 item.其他元素依次顺延,
删除功能:
boolean list.remove(String item)//删除元素item,有返回真,没有返回假
boolean list.remove(int index) //根据索引位(角标)index删除元素,会把删除的元素返回
修改功能:
E list.set(int index, E element)//对指定索引index位置的元素进行修改。返回传入元素.
获取功能:
List List subList(int fromIndex, int toIndex)//根据指定的头(fromIndex)尾(toIndex)
角标获取子列表
E list.get(int index) //通过索引位(角标)获取到对应的元素
for(int x=0; x<list.size(); x++) {
System.out.println(list.get(x));
}
List接口中的常用类:
Vector:底层数据结构是数组结构,线程安全,但速度慢,已被ArrayList替代。
Vector中提供了一个独特的元素取出方式,就是枚举Enumeration。
此接口Enumeration的功能与 Iterator 接口的功能是重复的
通过Enumeration的hasMoreElements()方法判断是否还有元素
通过Enumeration的nextElement()方法返回下一个元素
Enumeration的名称和方法的名称过程,书写很麻烦。所以被Iterator所取代
ArrayList:底层数据结构是数组结构,线程不安全,查询速度快。
可变长度的ArrayList:
ArrayList内部封装了一个默认长度为10的数组。 当超出长度时,集合内部会自动生成一个新的数组。
将原数组中的元素复制到新数组中,在将新元素添加到新数组。
新数组的长度:ArrayList 50%延长;Vector 100%延长
LinkedList:底层是链表数据结构,线程不安全,增删速度快。
添加功能:
void addFirst();
void addLast();
在jdk1.6后
void peekFirst();替代
void PeekLast();如果集合元素没有,该方法不会抛出异常,而是返回null
删除功能:
void removeFirst(); //pollFirst();替代
void removeLast(); //pollLast();如果集合元素没有,该方法不会抛异常,null
获取功能:
E getFirst();//如果
E getLast();
4、Set集合
Set集合不允许有重复元素,无存储顺序
Set集合通过存入对象的equals方法来保证集合中没有重复元素
Set接口中的方法和collection中的方法一致
Set接口取出元素的方法只有迭代器
Set接口中的子接口:
|--HashSet:
线程不安全,存取速度快。
存储元素效率非常高
底层使用哈希算法来保证没有重复元素:
底层数据结构是哈希表,这种结构其实就是哈希值的存储,每一个对象都有自己的哈希值。
存储对象时,先调用对象的hashCode()计算一个哈希值,在集合中查找是否有哈希值相同的对象
如果没有,直接存入。如果有,通过equals()和相同对象比较内容是否相同。
返回true为重复元素,只存一个。返回false就存入
往HashSet集合里存储的对象必须正确重写hashCode和equals方法
HashSet和ArrayList的区别:
ArrayList判断包含,以及删除,依据元素的equals方法
HashSet判断包含,以及删除,依据元素的hashCode()方法,哈希值相同,equals()再判断
|--TreeSet:
线程不安全,可以对Set集合中的元素进行排序。
通过二叉树算法保证无重复元素,并对元素进行排序:
通过compareTo或compare方法中的返回值来保证元素的唯一性,返回0,就视为同一个元素
返回正数放已有元素右边,返回负数放元素左边,以二叉树形式存放保证有序(左小右大)
当TreeSet集合中的元素不具备比较功能,或者具备的比较功能不是所需要时,指定比较算法:
自然顺序:让元素自身具备比较性,元素实现Comparable接口,覆盖compareTo方法
比较器顺序:集合自身具备比较器,类实现Comparator接口。覆盖compare方法。
将Comparator接口的子类对象作为参数传递给TreeSet的构造函数。
相对而言,第二种方式较为常用。
注意:在进行比较的时,一定要明确主要条件和次要条件。
技巧:
当看到Hash开头的对象,底层用的是哈希表。就要想到hashCode方法和equals方法。
当看到Tree开头,就要想到二叉树。就要想到两个接口,
一个是Comparable,一个是Comparator。
当元素自身具备比较性,同时TreeSet集合也具备比较器,这时以比较器为主。
建议:
一般在描述对象时,如果该对象封装了具体的数据,会出现很多这样的对象,如:员工,学生对象等
这时就需要进行容器的存储。在描述该类对象时,要复写几个方法:
1、hashCode() 2、equals()
3、toString();//可写可不写,建议写上
4,最好实现Comparable接口让该类具备自然排序功能。
建议对象自身判断是否相同的依据,同时让对象具备基本的比较性
\