容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器
java集合主要划分为四个部分:
Collection(List列表、Set集合)、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)
背景
数组的优势:是一种简单的线性序列,可以快速地访问数组元素,效率高。如果从效率和类型检查的角度讲,数组是最好的。
数组的劣势:不灵活。容量需要事先定义好,不能随着需求的变化而扩容。
由于数组的这些劣势,我们需要一种更强大、更灵活、容量随时可扩大的集合(Collection)来存储对象。(扩容)
基本类型
Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆包装和解包装能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。
泛型
所有容器的内部存放的都是Object对象,泛型机制(语法糖,编译器)只是简化了编程,由编译器自动帮我们完成了强制类型转换而已。JDK 1.4以及之前版本不支持泛型,类型转换需要程序员显式完成。
ArrayList<String> list = new ArrayList<String>();//泛型,参数化类型
泛型的通配符(?):
上限限定:public void getFunc(List<? extends Animal> an),
那么表示这里的参数可以传入Animal,或者 Animal的子类
下限限定: public void getFunc(Set<? super Animal> an ),
那么表示这里的参数可以传入Animal,或者Animal的父类
使用泛型的注意点:
1、泛型不支持基本数据类型
2、泛型不支持继承,必须保持前后一致(比如这样是错误的:List<Object> list = new ArrayList<String>();
内存
由于Java里对象都在堆上,且对象只能通过引用访问,容器里放的其实是对象的引用而不是对象本身
Java集合框架图
List链表
是Collection的子接口,里面的内容允许重复。
List的特点:线性。即:有序。元素放入的顺序和元素的存储顺序保持一致。
表象上:List最大的特点就是有下标。
ArrayList: 就是作为一个数组的封装出现的,底层就是数组。
LinkedList:底层封装的是一个双向链表。
1、查找、修改用的多的时候用ArrayList。
2、增加、删除用的多的时候(特别是往中间增加、删除)用LinkedList。
3、线程安全,数据量大的时候考虑用vector。
泛型<>:用来控制集合只能操作某一种数据类型。
遍历:1、普通for循环遍历。
2、使用迭代器Iterator完成遍历。——没有下标从头到尾走一遍,不能操作数组。
3、for-each循环语句,底层封装的就是迭代器,语法简单,还可以操作数组。推荐使用。
Set集
是collection的子接口,里面的内容不允许重复。
特点:不能放置重复元素,无序存放元素。
表象上:Set没有下标。
HashSet判断两元素不重复:1、调用equals方法比较两对象
2、两元素的hashcode值保持一致
只有这两个条件同时满足,java才认为是同一对象。
所有重写了equals方法一般要重写hashcode方法,让equals返回true的时候,hashcode返回的值应该一样。
hashSet只有增、删、求长度和遍历等操作。
遍历:1、迭代器
2、for-each
Map映射
是存放一对值的最大接口,所有的元素都以键和值的方式存储。
特点:键值对——键要求唯一,值可以重复
常用子类:HashMap、Properties(专用于操作属性文件)
HashMap
常用操作:增、删、改、查、容、遍历
遍历的时候:不能同时遍历所有的键和值,只能单独遍历键与值。
键在遍历的时候用Set类型来接。
值在遍历的时候用Collection来接。
hashMap与hashTable比较:1、hashMap非线性安全,hashTable是线性安全的。
2、hashMap允许null来做键/值,hashTable不允许。
Properties
常用操作:增、删、查、改、容、存、取。
存的时候,调用的是.store方法存文件,
取的时候,调用.load方法取文件。
文件类型:.properties——固定格式的文本文件,将是工作中使用率第二的配置文件。
Map.Entry
Map.Entry的内部接口,每个
Map.Entry对象都保存着一对key——value的内容,每个map接口中都保存有多个Map.Entry接口实例。
Iterator
集合的输出接口,从前到后输出指定集合中的内容。不能遍历Map,只用来遍历Collection。
ListIterator
是Iterator的子接口,可以进行双向输出。专门用来便利List.
Enumeration
是最早的输出接口,用于输出指定集合中的内容。
collections
集合操作的算法类
包括排序、求最大、最小、反转、随机混排等操作
排序的时候,因为是对对象排序,所以应按一定的业务逻辑的自然顺序排序。
比较器
comparable接口:内部比较器
可对任意数组排序,java泛型技术,二叉树排序原理
1、类实现comparable接口
2、重写compareTo方法
compareTo方法返回的是int类型数据:1表示大于,-1表示小于,0表示相等。
comparator接口:外部比较器
补救的做法
此接口一样需要重写方法,但方法接收两个对象,返回值依然是1、-1、0;
SortedSet
单值的排序接口,实现此接口的集合类,里面的内容可以使用比较器排序。
SortedMap
存放一对值的排序接口,里面内容按照key排序,使用比较器排序。
Queue
队列接口,此接口的子类可以实现队列操作。
抄录网址