集合类(集合框架)

来源:互联网 发布:成都行知幼稚园 编辑:程序博客网 时间:2024/06/05 10:25
集合类(集合框架):


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

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

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


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

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


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

注意:在迭代时循环中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中

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝售假只能发布50个宝贝怎么办 在肯德基买的券过期了怎么办 新买的手机实体店不给换怎么办 苹果平板充电时显示不在充电怎么办 苏州驾校考试科目二挂了两次怎么办 支付宝收款码少收钱了怎么办 支付宝发的红包不领取怎么办 微信存在风险不能领红包怎么办 天猫超市电话写错了怎么办 天猫买东西地址写错了怎么办 天猫上买衣服收货电话写错了怎么办 电视遥控器不小心按了高清键怎么办 康佳电视打开右下角是红色的怎么办 天猫超市退款成功后收到货怎么办 天猫还没收到货就确认收货了怎么办 支付宝红包抵扣被关了怎么办 水貂绒大衣白色过色了怎么办 双面羊绒大衣袖子洗短了怎么办 特殊类型订单销量评价删除后怎么办 淘宝上卖家发货发错了地址怎么办 买完保险想换保险代理人怎么办 怀孕内裤两边磨的好疼怎么办 露肩连体裤穿着卡裆怎么办 魅族手机恋与制作人换诺基亚怎么办 蚊子叮咬后擦风油精了红肿怎么办 机动车已转让没过户出了事情怎么办 签好的合同如果甲方违约怎么办? 饭店没签合同辞职不给工资怎么办 两家为了带孩子闹翻了怎么办啊? 抵押后租赁的房屋被法院拍卖怎么办 房子买20年了没有过户怎么办 二手车没过户行驶证丢了怎么办 买的二手车行驶证丢了怎么办 在京东仓库做事把东西损坏了怎么办 微信显示该账号登陆环境异常怎么办 干洗店把衣服洗坏了怎么办 千牛上怎么改淘宝密码忘记了怎么办 公司收了代理商押金到期不退怎么办 淘宝显示签收但是我没收到货怎么办 淘宝东西没收到显示签收了怎么办 开拼多多店铺的密码忘了怎么办