集合的基础概念
集合:在计算机科学中,集合是一组可变数量的数据项(也可能是0个)的组合。
数据项:这些数据项可能共享某些特征,需要以某种操作方式一起进行操作。一般来讲,这些数据项的类型是相同的,或基类相同(若使用的语言支持继承)。
列表(或数组)通常不被认为是集合,因为其大小固定,但事实上它常常在实现中作为某些形式的集合使用。
集合的种类包括列表,集,多重集,树和图。枚举类型可以是列表或集。
集合类是一种工具类
java集合类是一种工具类,她可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如栈、队列等等,除此之外,Java集合还可以用来保存具有映射关系的关联数组,java的集合大致上可以分为Set、List和Map三种体系,从JDK1.5以后,Java增加了Queue体系集合,代表一种队列集合实现。有人想有可以自动扩展的数组,所以有了List,有人想有没有重复的数组,所以有了set,有人想有自动排序的数组,所以有了TreeSet。
java的集合类主要由两个接口派生而来,Collection和Map,她们两个是集合框架的根接口,这两个接口又包含了一些子接口或实现类。
Collection集合体系
其中Set和List接口是Collection接口派生的两个子接口,她们分别代表了无序集合和有序集合,Queue是Java提供的队列实现,有点类似于List。
Map集合体系
所有的Map实现类用于保存具有映射关系的数据。
<p>上面的类图画的是Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但是她们都有一个功能特征,Map保存的每项数据都是key-value对。</p>
<p>Map里的key是不可以重复的,key用来标识集合里的每项数据,如果需要查询Map中数据时,总是根据Map的key来获取。</p>
Collection的方法
List的方法
基于元素多的情况下。
ArrayList插入慢查询快。
LinkedList插入快查询慢。
Set的方法
Set中,元素不能重复
List可以根据下标取值,可以重复。
Set的实现类
HashSet 无重复无序
- LinkedHashSet 无重复有序
SortedSet 无重复升序 - TreeSet 无重复升序(TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系)
划重点
Set中也可以存放自定义对象,那么它如何排序呢?
拿HashSet具体举个例写个代码试试。
问:不是无重复吗?怎么会有两个dog1
答:因为hashset判断重复是去调用放进去对象的equals方法,而Dog没有,则调用父类Object,Object里面的equals比较的是==,这个比较的是内存地址,那么第二次放进去dog1和第一次的dog1有不同的内存地址。当然不一样啦。
如何解决:去Dog里面写equals方法。
光这样ok?
no no no
还得重写hashCode()方法。
equals相同,hashcode一定相同。
划重点2 自定义对象排序
方法一:自定义对象继承Comparable接口,重写comparable方法。
方法二:写Comparator类,更加灵活,同一个集合有多个排序方法。
Map
TreeMap里面是按key排序的,若是自定义对象排序,同样按上面两种方法。
泛型-generics
泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时(instantiate)作为参数指明这些类型。
遍历
面试题
Collection和Collections有什么区别?
答:Collection是一个集合接口,它提供了对集合对象进行基本操作哦的通用接口方法。实现该接口的类主要有List和Set。
Collections是针对集合类的一个包装类。它提供一系列静态方法以实现对各种集合的搜索、排序、线程安全等操作。ArrayList和Vector的区别?(是否有序、是否重复、数据结构、底层实现)
ArrayList和Vector都实现了List接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。
而ArrayList和Vector的区别主要在两个方面:
第一,线程安全。Vector是线程安全的,而ArrayList是线程不安全的。因此在如果集合数据只有单线程访问,那么使用ArrayList可以提高效率。而如果有多线程访问你的集合数据,那么就必须要用Vector,因为要保证数据安全。
第二,数据增长。ArrayList和Vector都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就需要增加它们的存储容量。ArrayList每次增长原来的0.5倍,而Vector增长原来的一倍。ArrayList和Vector都可以设置初始空间的大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,并且都是key-value的数据结构。它们的不同点主要在三个方面:
第一,Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。
第二,Hashtable是线程安全的,也就是说是线程同步的,而HashMap是线程不安全的。也就是说在单线程环境下应该用HashMap,这样效率更高。
第三,HashMap允许将null值作为key或value,但Hashtable不允许(会抛出NullPointerException)。List 和 Map 区别?(数据结构,存储特点,这个虽然简单,但是要注意回答全面)
这个要从两个方面来回答,一方面是List和Map的数据结构,另一方面是存储数据的特点。在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)。