一、集合简介
集合与数组的区别:集合的长度能变,数组的长度不能改变
Collection集合:每一个元素存储一条信息,即一个值
Map集合:每个元素存储两条信息,即一个键值对
二、Collection集合
1、Collection接口
add-增加元素,remove-删除元素,size-集合大小,isEmpty-判断集合是否为空
clear-清空集合,contains-判断集合中是否包含指定的元素,iterator迭代器
2、Collection集合分类:
List集合:有序集合,有下标,能存储相同的元素
Set集合:无序集合,不能存储相同的元素
3、List集合
get,返回列表中指定位置元素
set ,替换指定位置元素
remove-可按照索引删除
ArrayList:采用数组结构存储元素,增删改慢,查询快,线程不安全,效率高
Vector:数组存储结构,增删改慢,查询快,线程安全,效率较低
linkedList:采用链表结构存储数据,增删改快,查询慢,线程不安全,效率高
4、Arraylist使用
(1)向上转型创建对象:首先使用list中的方法,若方法在arraylist中被重写,调用重写后的方法
List list=new ArrayList();
(2)使用方法
list.add(),-- 添加集合元素,list .size。。。。
(3)遍历方法
通过下标遍历,增强for,迭代器,使用Lamda
迭代器:
hasNext:判断指针位置是否有下一个元素
next:指针下移,取出指针位置的元素并返回
remove:删除指针指向的元素
5、Set集合
不能存储重复的元素,可以使用Set去重
HashSet:
向hashset中存放对象时,hashset会调用对象的hashcode方法得到该对象的
hash码,然后根据hash码来确定该元素的存储位置。
TreeSet:
集合处于排序状态,TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,
或者通过CompareTo方法比较没有返回0
LinkedHashSet:
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,
但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的;
去重原理:
两个元素先调用hashcode比较,hashcode会返回一个值,若返回的值相同再使用equals比较,
若相同则表示这两个元素相同,不能插入set集合中
利用这个原理,如果是自己创建的类,需要自己重写,
可以自己重写hashcode,修改返回的值,比如返回调用对象的属性值,
不修改,返回的是这个对象的hash码;
重写equals,修改比较的内容,不修改,比较的对象的首地址
遍历方法
增强for,迭代器,使用Lamda
6、Map集合
存储元素是一个键值对,键是唯一的,值可以重复
方法:
put-- 添加元素,get-- 返回指定键对应的值
remove-- 通过指定键删除键值对,clear-- 清理map集合
size-- map集合长度,isEmpty–判断集合是否为空
containsKey,containsvalue ,-- 判断集合是否包含指定键或者值
KeySet,-- map集合中所有键组成的set集合,刚好去重
values , --所有值,entrySet – 返回map集合中所有元素
实现类:
HashMap:
(1)无序且不安全的数据结构
(2)向Map集合中添加元素若键相同,会覆盖原来的键值对,而在Set集合中不会覆盖而是不能添加
(3)hashmap能通过键找到值,而hashset只能通过遍历找
存储原理:
获取到传入的key值,计算对应的hash值,然后计算出对应的存储位置(数组下标),把传入的key
与value值存到该数组对应下标的数组中;
数据存储在长度为默认长度为16的数组中,当传入数组的下标相同,就会存储到该下标下默认长度为8
的链表中,若大于等于8,则会将链表变成红黑树存储数据;
HashTable:
实现一个哈希表,该哈希表将键映射到相应的值,任何非 null 对象都可以用作键或值,
即不允许null键null值,除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同
TreeMap:基于红黑树实现。
HashMap:适用于在Map中插入、删除和定位元素,通常比TreeMap快一点,
在需要排序的Map时候才用TreeMap,仅在需要完全的线程安全的时候使用Hashtable。
遍历方法
(1)使用Keyset方法得到键的集合,遍历这个键集合,使用get得到对应的值
(2)使用entrySet方法得到键值对的集合,每个键值对使用Map.Entry类型存储
遍历entryset集合,使用entry类中的getkey和getvalue获取键值对;(Entry是Map的内部类)
三、泛型
避免复杂的类型转换
即参数化数据类型
不能确定具体的引用数据类型,使用泛型表示。
如List --> List, List,
在创建该类对象时使用类类型的数据类型作为参数传入,
List定义了传入的List类属性的引用数据类型是String类型的
四、工具类
数组工具类:Arrays
aslist(一个数组),将数组转为集合
sort,对数组进行排序,(默认是升序),想要降序使用reverse反转
binarySearch,二分查找,必须先升序排序,然后找元素对应下标值
集合工具类;Collection
binarySearch二分查找,sort排序,reverse反转,max最大值,min最小值
五、BigDecimal
使用环境:
数字范围超过基本数据类型long或者double的存储范围
十进制小数转二进制小数可能丢失精度,比如0.1转二进制小数
金融项目对数据精度要求高
构造器可传入数据类型:int,double,long,String(一般使用)
方法:加–add,减–subtract,乘–multiply,除–divide,两个对象操作返回新的对象
// 舍入模式
BigDecimal divide1 = big1.divide(big2, 2, RoundingMode.HALF_UP);
System.out.println(divide1);
ROUND_HALF_UP
//向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,
向上舍入, 1.55保留一位小数结果为1.6,也就是常说的“四舍五入”