集合类(集合框架)

集合类(集合框架):


出现:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

数据多了封转成对象,对象多了封装到数组或者集合中;

      数组是固定长度的,集合是可变长度的,数组当中只能存储同一种类型的对象,但是集合可以存储不同类型的对象
不断向上抽取最后形成一个体系,我们接触新体系的时候,看顶层的东西,可以明白这个体系是干什么用的,然后具体使用的时候找具体的子类


为什么会出现这么多的容器呢?

因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构


迭代器:其实就是集合的取出元素的方式

注意:在迭代时循环中next调用一次,就要hasNext判断一次,不然指针会不断向后,出现问题
ex:while(it.hasNext()){
sop(it.next()+"...."+it.next());

}

另注:上面的迭代器使用方式,会使得it的生命周期变成,建议使用下面的for循环方式

for(Iterator it=xx.iterator();it.hasNext();){

sop(it.next());

}

  Iterator 有3个方法  boolean hasNext()、next()、remove();


Collection
List: 元素是有序的,元素可以重复。因为该集合体系有索引
ArrayList -底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步
LinkedList-底层的数据结构使用的是链表数据结构。特点:增删速度很快,查询速度稍慢。
方法有:addFirst(),addLast(),
getFirst(),getLast(),//获取元素,但不删除元素
removeFirst(),removeLast();//获取元素,但元素被删除
以上方法调用时,如果集合中没有元素,会出现NoSuchElementException
1.6版本后出现了替代功能
offerFirst(),offerLast()
peekFirst(),peekLast()//获取元素,但不删除元素
pollFirst(),pollLast()//获取元素,但元素被删除
以上方法调用时,如果集合中没有元素,会返回null
Vector    -底层是数据结构使用的是数组结构。特点:被ArrayList替代了,但是线程同步,增删查询速度都很慢
ArrayList在创建时是容量为10的空列表,在长度超过时,会以自身长度50%延长,而vector则是以100%延长
枚举是Vector特有的取出方式
迭代和枚举其实是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。

List特有的方法(凡是可以操作角标的方法都是该体系特有的方法)

add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index);
subList(from,to);


ListIterator();

ListIterator()是Iterator的子接口

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常,所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断、取出、删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,该接口想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator,该接口只能通过List集合的ListIterator方法获取。

ListIterator还可以实现逆向遍历

List集合判断元素是否相同,依据的是元素的equals方法




Set :元素是无序的,元素不可以重复
|--HashSet:底层数据结构是哈希表。线程是非同步的
哈希表在出现哈希值相同时,会调用equals方法判断俩个对象是否相同,如果不同,还是会存储在哈希表中
   HashSet是如何保证元素唯一性呢?
通过元素的hashCode()和equals()来完成,如果hashCode值相同,才会判断equals是否为true,如果值不同,不会调用equals
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
总结:ArrayList判断元素是否存在、以及删除元素,只依赖equals方法,HashSet则是先依赖hashCode,再依赖equals,而不同则是由于不同的数据结构造成了。
 
|--TreeSet:可以对set集合中的元素进行排序,排序依据是ASCII码表 
排序时,当主要条件相同时,一定判断一下次要条件
可以通过复写compareTo方法,使return值为1或-1,可以还原出TreeSet中,元素的存放顺序,1为正序,-1为逆序
底层数据结构是二叉树,保证元素唯一性的依据是compareTo方法return 0,(包括contains)

TreeSet排序的第一种方式:让元素自身具备比较性
元素需要实现Compareable接口,覆盖compareTo方法
这种方式也称为元素的自然顺序,或者叫做默认顺序
(让元素自身具有比较性)
TreeSet排序的第二种方式:定义一个类,实现Comparator接口,覆盖compare方法
当元素自身不具备比较性是,或者具备的比较性不是所需要的
这是就需要让集合自身具备比较性
在集合一初始化时,就有了比较方式,参阅构造函数TreeSet(Comparator<?super E> comparator)::构造一个新的空TreeSet,它根据指定比较器进行排序
注意:一定要注意在写比较器时,当主要属性相同时的解决办法,否则会丢掉一些元素
当俩中排序都存在时,以比较器为主。而且比较器比较常用。
Set集合的功能和Collection是一致的


泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制
   |--好处 1.将运行时期出现问题ClassCastException,转移到了编译时期,方便与程序员解决问题,让运行时期问题减少,安全
2.避免了强制转换的麻烦。
    泛型格式:通过<>来定义要操作的引用数据类型,在使用java提供的对象时,什么时候使用泛型?
通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
  何时定义泛型类:
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上,对于静态类型泛型定义在返回值类型的前面
泛型定义在接口上,实现类如果不知道使用什么类型,也可以使用泛型实现

泛型限定  符号<? entends Person>,"?"叫通配符,也可以理解为占位符,泛型的限定:? extends E:可以接收E类型或者E的子类型,上限。? super E:可以接收E类型或者E的父类型,下限。

有了泛型后,自定义一个类要写hashCode()和equals(),还要实现Comparable接口,复写compareTo方法,让其具备默认比较性,既可以存放HashSet还可以存放TreeSet中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值