为什么会出现集合类?
面向对象语言对事物的体现就是以对象的形式所以为了方便对多个对象的操作就要对对象进行存储集合就是存储对象的最常用的一种方式
数组和集合为什么不同?
数组虽然也可以存储对象但长度是固定的集合的长度是可以变的数组中可以存储基本数据类型但集合只能存储对象
List
List 特点是存入对象是有序的即存入什么顺序取出来就会是什么顺序而且里面的元素是可以重复的
List按照其底层数据存储形式可以分为ArrayList和LinkedList前者是以级数为存储方式后者以链表为存储方式显示前者适合检索遍历后者适合增加删除
Set
Set的特点是不包含重复元素而且是无序的
HashSet是底层使用哈稀表为存储方式实现的Set集合HashSet给存入的每个对象计算出一个Hash值然后映射出一个存储地址这样很容易判断出某个对象是否已经存在试想如果用ArrayList保证对象重复会有多么麻烦假如集合中有万个对象当添加个对象时需要进行次比较才能最后确定这个对象是否已经存在如果存在就不加入如果不存在就添加进去由此可见HashSet在这方面的优越性当我们的对象需要存储到HashSet中时通常我们需要重写hashCode方法和equals方法以我自己的规则判断两个对象是否相等比如在某种特定的情况下我们可以设定姓名和年龄都相等的两个人就是同一个人
HashSet是非线程同步的!
TreeSet 该集合可以对Set集合中的元素进行排序底层是使用二叉树作为数据结构排序性能比较高!
排序的两种实现方式
元素需要实现Comparable接口覆盖compareTo方法这种方式也称为元素的自然顺序或默认顺序
让集合具备排序能力在创建集合的时候传入一个自定义比较器自定义比较器要实现Comparator接口这样就使得添加元素时集合都会按照比较器里的要求将每次添加进的元素放到适当的位置也就是实现的排序
Map
Map是一种与Collection不同的集合是以key/value的形式存在的通过key找到对应的valuekey就像身份证号一样需要唯一确定
HashTable 底层是Hash表数据结构不可以存入null作为键和null作为值的情况Hashtable是线程同步的jdk 开始效率低
HashMap 底导是hash表数据结构 并允许使用null作为键和null作为值不是线程同步的jdk开始 效率高
TreeMap 底层是二叉树作为数据结构线程不同步可以用于map集合中的按键排序
Set和Map很像其实Set底层使用了Map集合
Map集合的取出原理将map集合取出原理将map集合转成Set集合再通过迭代器取出记住keySet和EntrySet方法的使用!
Map的应用利用Properties类读取配置文件(框架中经常用到)
InputStream in = ReflectCollectionsclassgetResourceAsStream(configproperties)
Properties prop = new Properties()
propload(in)