集合框架概念


集合就是存储对象最常用的一种方式
数组和集合同是容器,有何不同?
 数组存储基本数据类型,也可以存对象(什么都能存储),数组长度是固定的。
 集合只能存储对象,集合长度是可变的。
集合类的特点:
 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
 
因为容器中数据结构不同。
容器有很多种,不断地共性功能抽取,形成了集合体系-->集合框架顶层就称之为Collection接口。
collection接口中的共性功能。
1.添加
  boolean add(Object obj); 一次添加一个                <返回值boolean表示成功返回true>
  boolean addAll(Collection c); 将指定容器中的所有元素添加
2.删除
 void clear(); 移除集合中所有元素
 boolean remove(Object o); 删除指定的一个元素
 boolean removeAll(Collection c); 删除一批元素    c1.removeAll(c2) //将c1中和c2相同的元素从c1中删除
 retainAll(Collection c); 和removeAll正相反    c1.retainAll(c2) //将c1中和c2不同的元素从c1中删除。保留c1中和c2相同的元素                         
3.获取长度
 int size();  有几个元素
4.判断
 boolean isEmpty(); 判断有没有元素,如果size为0,返回true
 boolean contains(Object o); 判断包含指定的元素
 boolean containsAll(Collection c); 判断包含制定collection中的所有元素
5.将集合转成数组
 toArray();
6.取出集合元素。迭代器
 Iterator iterator()
 获取集合中元素上迭代功能的迭代器对象
 迭代:取出集合的一种方式。有没有啊?有!取一个。还有没有啊?有!取一个。还有没有啊?没有。算了。
 迭代器:具备着迭代功能的对象。
 而迭代器对象不需要new。直接通过iterator()方法获取即可。
 迭代器是取出collection集合中元素的公共方法
---------------------------------------------------------------------------------------------------
Collection 有两个子接口
 |--List:有序(存入的顺序和取出的顺序一致)。有索引,允许重复元素。
 |--Set :不允许重复元素
 
重点List接口中的特有方法:它的特有方法都是围绕索引定义的
支持增删查改
增:
add(index,element)                  //element:元素
删:
remove(index);
改:
set(index,newelement);
查:
int       indexOf(element);
element   get(index);

List集合的具体子类。子类之所以区分是因为内部的数据结构(存取数据的方式)不同。
 |--Vector:数据结构是数组。数组是可变长度的(不断new新数组并将原数组元素复制到新数组)。线程同步的。增删和查询都慢!
 |--ArrayList:也是数组结构,也是长度可变的。线程不同步的,代替了Vector。增删速度不快,查询速度很快。    判断元素是否相同依赖equals
 |--LinkedList:链表结构,线程不同步的。增删速度很快。查询速度较慢。  链表:链接的列表,每一个记录了上一个元素的地址
 
Set集合:不允许重复元素(也就是Set集合这个大框架下面所有的子类都不允许) 
  和Collection的方法相同。Set集合取出方法只有一个:迭代器            取出元素是无序的
 |--HashSet:哈希(散列)表结构。
  如何保证唯一性?
  元素必须覆盖hashcode和equals方法
  覆盖hashcode方法是为了根据元素自身的特点确定哈希值
  覆盖equals方法,是为了解决哈希值的冲突
 
 |--TreeSet:二叉树数据结构。可以对元素进行排序。不同步的。
  如何保证元素唯一性?
  参考的就是比较方法的返回值是否为0,是,就是重复元素,不存。
  排序方式:需要元素具备比较功能。所以元素需要实现Comparable接口。覆盖compareTo方法。 
  
  需求中也有这样一种情况,元素具备的比较功能不是所需要的,也就是说不想按照
  自然排序的方法,而是按照自定义的排序方式,对元素进行排序。
  而且,存储到TreeSet中的元素万一没有比较功能,该如何排序呢?
  这时,就只能使用第二种比较方式--是让集合具备比较功能,定义一个比较器
  实现Comparator接口,覆盖compare方法。将Comparator接口的对象,
  作为实参传递给TreeSet集合的构造函数。
  比较器更为灵活。自然排序通常作为元素的默认排序。
  
 用于存储元素和哈希值对应关系的容器称之为哈希表。
 不允许存储重复元素,因为会发生查找的不确定性。不保证存入和取出的顺序一致。比数组的查询效率高。
 当哈希算法算出的两个元素的值相同时,称为哈希冲突。冲突后,需要对元素进行进一步判读,判断的是元素的内容,依赖equals
 哈希表在判断元素是否相同:依据hashCode方法,如果哈希冲突(哈希值相同),再判断元素equals方法。equals返回true,不存。返回false,存储!
 堆的底层就是一种哈希表结构,所以每个对象都具备hashCode方法。 hashCode()这个方法它本身调用的是系统本地(windows)的算法
 
 
技巧:
jdk1.2以后出现的集合框架中的常用子类对象,存在的规律
前缀名是数据结构名,后缀名是所属体系名
ArrayList:数组结构。看到数组就知道查询快,看到list,就知道可以重复,可以增删改查。
LinkedList:链表结构。增删快。 xxxFirst  xxxLast   xxx:add  get  remove
HashSet:哈希表,就要想到元素必须覆盖hashCode equals,不保证有序。看到Set,就知道不可以重复。
LinkedHashSet:链表+哈希表。可以实现有序,因为有列表。
TreeSet:二叉树,可以排序,就要想两种比较方式:一是自然顺序comparable, 一种是比较器compartor
 
--------------------------------------------------------------------------------------------------
泛型:
 在JDK1.4版本前,容器什么类型的对象都可以存储。但是在取出时,需要用到对象的特有内容时,需要向下转型。
 对象的类型不一致,导致向下转型发生ClassCastException异常。
 
 在JDK1.5解决了该问题,在定义集合时候,就明确了集合中储存元素的类型。
 这样,编译器在编译时,就可以对集合中储存的对象类型进行检查。
 一旦发现类型不匹配,就编译失败。这就是泛型技术
好处:
 1.将运行时期的问题转移到了编译时期,可以更好的发现问题
 2.避免向下转型的麻烦
 
总结:泛型就是应用在编译时期的一项安全机制
泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,
  就会生成class文件,但在class文件中,就将泛型标识去掉了
  
泛型的表现:泛型技术在集合集合框架中应用的范围很大
  什么时候需要写泛型呢?1,只要看到类,或者接口在描述时右边定义<>,就需要泛型。
  使用容器时,只要将具体类型实参传递给该参数即可。
  说白了,泛型就是,传递类型实参。   
  
--------------------------------------------------------------------------------------------------
Map:双列集合,一次存一对,键值对。要保证键的唯一性。
共性的功能:
1.添加
 v put(key,value);
 putAll(Map<k,v> map);
2.删除
 void clear();
 v remove(key);
3.判断
 boolean containKey(object)
 boolean containValue(object);
 boolean isEmpty();
4.获取  
 v get(key)
 int size()
 
Map
 |-- Hashtable:哈希表,是同步的,不允许null键和null值
 |-- HashMap:哈希表,是不同步的,允许null键null值
 |-- TreeMap:二叉树,是不同步的。可以对map中的键进行排序。
 HashSet和TreeSet的底层就是 HashMap和TreeMap。
 Map集合取出(遍历)所有元素,用keySet,entrySet方法获取元素,元素转为Set集合,再用迭代器
--------------------------------------------------------------------------------------------------
集合框架的工具类。
Collections:定义的都是操作Collection的静态方法
 1.对list排序。
  sort(list);
 2.逆序
  reverseOrger
 3.max  min
 
 4.二分查找:binarySearch
 
 5.将非同步集合转成同步集合  
 
----------------------------------------------------------
Arrays:用来操作数组的工具类,方法都是静态的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值