黑马程序员_集合框架

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

1、为什么出现集合类?
面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储。
集合就是存储对象最常用的一种方式

2、数组和集合都是容器,两者有何不同?
**
数组长度固定,而集合长度是可变的
**
数值可以存储对象,还可以存储基本数据类型,而集合只能存储对象
**
数组存储数据类型是固定的,而集合存储的数据类型不固定

3、集合类的特点:
集合只能存储对象
集合的长度是可变的
集合可以存储不同类型的兑现

4、集合类框架

**Collection:顶层接口
|--->List:列表,元素是有序的(元素带角标索引),可以有重复元素,可以有null元素。
|--->ArrayList(JDK1.2):底层的数据结构是数组数据结构,特点是查询速度快(因为带角标),
但是增删速度稍慢。线程不同步。默认长度是10,当超过长度时,
按50%延长集合长度。
|--->LinkedList(JDK1.2):底层数据结构式链表结构(即后面一个元素记录前一个),
特点:查询速度慢,但增删速度快。线程是同步的。

|--->Vector(JDK1.0):底层数据结构是数组数据结构。特点是查询和增删速度都很慢。
默认长度是10,当超过长度时,按100%延长集合长度。
(Vector功能跟ArrayList功能一模一样,已被ArrayList替代)
|--->Set:集合,元素是无序的(因为没有索引),元素不可以重复。可以有null元素。
|--->HashSet(JDK1.2):底层数据结构是哈希表。存取速度快。线程不同步。保证元素唯一性的
原理:先判断元素的hashCode值是否相同,再判断两元素的equals方法是否为true
|--->TreeSet:底层数据结构式二叉树。可以对Set集合中的元素进行排序。线程不同步
保证元素唯一性的依据:compareTo方法return 0
TreeSet排序的第一种方式:让元素自身具备比较性,实现Compareble接口,
覆盖compare方法,次方式是元素的自然顺序。
TreeSet排序的第一种方式:当元素自身不具备比较性或者具备的比较性不是
我们所需要的比较性时,此时就需要让元素自身
具备自定义的比较性。
那如何让集合自身具备比较性呢?可在集合初始化时,
就让集合具备比较方式。即定义一个类,
实现Comparator接口,覆盖compare方法。
**Map:顶层接口,该集合存储的是键值对,而且键是唯一的.Map和Set很像,Set集合底层就是使用了Map集合。
Map集合没有迭代器,要取出元素必须先将Map集合转换成Set集合才能遍历元素
|--->HashTable:
底层是哈希表数据结构;
不可以使用null键和null值;
用作键的对象必须实现hashCode和equals方法
线程同步,效率低
|--->HashMap:
底层是哈希表数据结构;
允许使用null键和null值;
线程不同步,效率高;
|--->TreeMap:
底层是二叉树结构;
线程不同步;
可以给Map集合中的键进行排序

5、迭代器:Iterator(Map集合没有迭代器)
(1)迭代器就是取出集合元素的方式
(2)迭代器的作用
因为每个集合中元素的取出方式都不一样,于是就把元素的取出方式进行抽取,并定义在集合内部,
这样取出方式就可以直接访问集合内部的元素;
而每个容器的数据结构不同,所以取出动作的细节也不一样,但是有共性内容:判断和取出。
那么就将共性内容进行抽取,从而形成了接口Iterater,即浙西内部类都符合一个规则,这个规则就是
迭代器Iterator。
(3)获取迭代器的方法:
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
Iterator<E> iterator() 返回在此 set 中的元素上进行迭代的迭代器。
(3)迭代器方法:
boolean hasNext() 如果仍有元素可以迭代,则返回 true。
E next() 返回迭代的下一个元素。
void remove() 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)。

6、集合类各容器方法:
**Collection方法摘要(没有构造方法)
a)添加:

i. boolean add(E e)
j. boolean addAll(Collection c)
b)删除:
i. void clear():清空容器
j. boolean remove(Objec object):
k. boolean removeAll(Collection c):
c)判断:
i. boolean contains(Object object):判断是否包含此元素
j. boolean containsAll(Collection c):判断是否包含一堆元素
k. boolean equals(Object object):比较此collection与指定对象是否相等
m. boolean isEmpty():判断是否集合为空
d)获取:
h. Iterator iterator():取出
i. int hashCode():返回此collection的哈希值
j. int size():返回此collection中元素的个数
k. boolean retainAll(Collection c):取交集
m. Object toArray():返回此collection中所有元素的数组

**Map:将键映射到值的对象。Map集合没有迭代器!Map集合特点:该集合存储键值对。而且键是唯一的。
|--->方法摘要:
|--->添加:
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中
|--->删除:
void clear() 从此映射中移除所有映射关系(可选操作)。
void remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
|--->判断
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。
|--->获取
int size() 返回此映射中的键-值映射关系数。
Collection<V> values() 返回此映射中包含的值的 Collection 视图。

重点:Map集合没有迭代器,以下是Map的两种取出方式:
第一种:Set<K> keySet()
返回此映射中包含的键的Set视图,将Map集合中所有的键存入Set集合,然后再通过Set集合的
迭代器取出所有的键,再根据get方法获取每个键的值;
第二种:Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的Set视图,将Map集合中的映射关系存入到Set集合中,
这个映射关系的数据类型是Map.entry,再通过Map.Entry类的方法再要取出关系里面的键和值
Map.Entry的方法摘要:
boolean equals(Object o) 比较指定对象与此项的相等性。
K getKey() 返回与此项对应的键。
V getValue() 返回与此项对应的值。
int hashCode() 返回此映射项的哈希码值。
V setValue(V value) 用指定的值替换与此项对应的值(可选操作)。

7、关于集合的一个代码实例:

import java.util.*;
class Student implements Comparable
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public void set(String name,int age)
{
this.name=name;
this.age=age;
}
public void get()
{
System.out.println("name+age :"+name+" "+age);
}
public int compareTo(Object obj)
{
if (!(obj instanceof Student))
throw new RuntimeException("不是学生对象!");
Student s=(Student)obj;
if (this.age>s.age)
return 1;
else if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
else
return -1;
}
}
class TreeDemo2
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet();
ts.add(new Student("xiaruri1",25));
ts.add(new Student("xiaruri2",35));
ts.add(new Student("xiaruri3",45));
ts.add(new Student("xiaruri4",25));
ts.add(new Student("xiaruri5",29));

Iterator it=ts.iterator();
while (it.hasNext())
{
Student stu=(Student)it.next();
stu.get();
}
System.out.println("over");
}
}

 

                          ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值