Java集合框架

集合框架(JCF Java Collection Framework):
特点:元素类型可以不同,集合长度可变,空间
框架:为了解决某些问题,而预先设计的一系列具有继承或实现关系的类与接口,在使用过程中我们只需在这些类与接口中选择相应的进行操作就可以完成功能。
(提供某一平台,让我们在这个平台上解决问题)

Collections:操作集合的工具类
Collection:集合的根接口(核心接口)直接衍生出List和Set,间接衍生出Map

集合分类:
什么时候用:
1、List(列表)
特点:线性,有序(有下标),元素可以重复,按照元素存入的顺利存放,所以有下标
常用子类:ArrayList、LinkedList;
ArrayList lst = new ArrayList();//底层实现就是使用的数组,它完成对数组的封装
1、放入元素:
lst.add();//可以放置任何类型的元素
2、得到元素个数:
lst.size();
3、根据位置获取某个元素
lst.get(0);//传入下标,下标从0开始
4、修改
lst.set(下标,值);
5、删除
lst.remove(下标);


LinkedList lst = new LinkedList();//底层实现采用双向链表 的结构,API完全一样,分散存放,每个空间除了存放值还分两个位置,一个位置指向上一个位置,一个位置指向
下一个位置,查询的时候必须通过前一个或者后一个才可以找到,效率低

ArrayList和LinkedList的使用场景:
1、当需要大量做查询某个元素,ArrayList效率高于LinkedList;
2、往尾部添加或删除元素,ArrayList效率高于LinkedList;
3、往中间添加或删除元素,LinkedList效率高于ArrayList

4、遍历: 1、普通for循环
2、for-each循环 - JDK1.5之后才有
3、集合框架类专用遍历 - 迭代器 - Iterator - JDK1.5之前用
Iterator it = lst.iterator();//获得迭代器对象,把lst里面的输入全部放入迭代器
while(it.hasNext){
Object obj = it.next();
System.out.println(obj);
}


ArrayList和Vector做解析:
因为:Vector同样是List分支下面的集合类,底层使用的数据结构仍然是数组,提供的方法也是同样的API
差异: 1、ArrayList是线程不安全的,效率高的
2、Vector是线程安全的,效率低的
使用场景:Vector在多线程情况下,且可能出现线程安全性问题时,才会用来替代ArrayList;









2、Set(集)
特点:存放的元素不能重复,无序(外部放入的顺序不是内部存放的顺序),所以没有下标,使用自己内部的一个排放机制放置
常用子类:HashSet
HashSet set = new HashSet();
1、放入元素:
set.add();//可以放置任何类型的元素
2、得到元素个数:
set.size();
3、不可以根据位置获取某个元素(没有下标)
4、不可以根据位置修改某个元素(没有下标)
5、不可以根据位置删除某个元素(没有下标)
6、可以根据传入的对象,删除Set集合中的重复对象
set.remove(Object obj);

7、遍历:
获取Set集合中的元素,只能使用遍历的方式(只能使用for-each循环或者迭代器)

探究:HashSet是如何判断两个对象是重复对象的
1、两个对象的equals判断必须返回true;
2、两个对象的Hash值(内存当中的唯一值)必须相等;


3、Map(映射)
特点:用键值对(key-value对)的方式,保存数据,数据在Map集合中是成对存放的,
每个元素除了有值,还有一个唯一的键需要我们定义,一列数据,使用自己内部的一个排放机制放置
常用子类:HashMap、Properties
HashMap map = new HashMap();
1、放入元素
map.put(key,value);
2、得到元素个数
map.size();
3、取数据 - 根据键获取值
map.get(key);
4、修改元素 - 仍然调用put方法,只需要放入相同的键
map.put(需要修改的键,新的value);
5、删除元素 -- 根据键进行删除
map.remove(key);

在获取元素、删除元素的时候,如果传入的键在map中不存在,不会报错! --危险
在修改元素的时候,如果穿入的键在map中不存在,就直接变成增加新元素! --危险
解决方法:
需要操作时可以先用 map.containsKey(key); 判断一个Map集合中是否包含某个键
也有 map.containsValue(value); 判断一个Map集合中是否包含某个值
判断的标准和Set中判断重复对象的方式一样,equals方法和hashCode方法

6、遍历
1、Map不能直接遍历 - 因为Map里的每一条记录都是一对儿,我们无法用一个变量来装
2、Map只能单独遍历所有的键 或 所有的值


Set keySet = map.keySet(); 把map中所有的键取出来放到一个Set集合中,如果有泛型接收类型也必须带泛型
map.values(); 把map中所有的值取出来放到一个Collection集合中,排序是无序的
统一使用for-each循环来遍历
HashTable:线程不安全的,不能用null做键或者值

集合的基本操作:增删查改,遍历
补充:
1、泛型
<类型> 表示该集合只能存放该类型及其子类的元素

2、迭代器
3、hashcode();

collections集合工具类:
跟排序有关的方法 - 只能操作List集合

Collections.sort(list); 自然排序(从小到大排列)
Collections.reverse(list); 反转(从大到小)
Collections.shuffle(list) 洗牌效果
二分搜索法(重中间开始,如果没有再从比它(大/小的方向)中间找)


比较器:
Comparable();接口:内部比较器 (需要比较的类型直接实现Comparable接口,重写CompareTo方法)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象的位置,则分别返回负整数、零或正整数。 
Comparator();接口:外部比较器 (新建一个类实现Comparator接口,泛型是指定比较的类型,重写Compare方法)
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。



Map的实现类:
properties:
特点: 1、它就是一个Map集合
2、properties可以直接操作属性文件. properties,格式:key=value

添加:put(key,value) 只能传Object、setProperty(key,value); 只能传String


存入:store(FileOutPutStream,注释);
如果文件不存在,会产生一个新的文件,不会报错
如果文件存在,会把源文件覆盖掉,每次操作都必须整体覆盖


读取:load(FileInputStream);
必须保证文件路劲和名字填写正确,否则会报异常,就算try-catch也只能解决程序不死,还是读不到数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值