------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
<pre name="code" class="java"> Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Collection
顶层接口,有两个主要的子接口:List(有序、可重复)和Set(无序,唯一)
主要方法有:
添加:
boolean add(E e);
boolean addAll(Collection c);
删除:
boolean remove(Object o);
boolean removeAll(Collection c);
void clear();
判断:
boolean contains(Object o);
boolean containsAll(Collection c);
boolean isEmpty();
长度:
int size();
交集:
boolean retainAll(Collection c);
集合转数组:
Object[] toArray();
List
特有功能
void add(int index,E element);
E remove(int index);
E get(int index);
E set(int index,E element);
ListIterator listIterator();
实现类:
ArrayList
底层数据结构是数组,查询快,增删慢;线程不安全,效率高
无特有功能;
Vector
底层数据结构是数组,查询快,增删慢;线程安全,效率低
特有功能已被取代<pre name="code" class="java"> 特有功能已被取代
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
LindedList
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
特有功能:
public void addFirst(E e); addLast(E e);
public E getFirst(); getLast();
public E removeFirst(); removeLast();
Set
无特有功能
实现类:
HashSet
底层数据结构是哈希表(元素是链表的数组),依赖于哈希值存储
添加功能依赖于两个方法保证元素的唯一:
int hashCode(); boolean equals(Object o);
LinkedHashSet
元素有序且唯一,链表保证有序,哈希表保证唯一。
TreeSet
底层数据结构是红黑树(是一种自平衡的二叉树)
根据创建对象时使用的构造方法决定是自排序还是构造器排序
Map
双列集合接口,包含的元素是将键映射到值的对象,键不可重复,值可以重复
键可以理解为是Set类型的集合,值可以理解为是List类型的集合
集合的数据结构对键有效,与值无关
主要方法有:
V put(K key,V value);
V remove(Object key);
void clear();
boolean containsKey(Object key);
boolean containsValue(Object value);
boolean isEmpty();
int size();
V get(Object key);
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K,V>> entrySet();
实现类:
HashMap:键是哈希表结构,唯一,无序
LinkedHashMap:Map接口的哈希表和链表实现,具有可预知的迭代顺序。
TreeMap:键是红黑树结构,唯一,有序
到底使用那种集合
单列还是双列
单列:Collection
元素重复吗?
重复:List
要安全吗?
要:Vector
不要:
查询多:ArrayList
增删多:LindedList
不重复:Set
有序吗?
无序:HashSet
有序:TreeSet
如果只知道是单列,不知道其他的,就使用ArrayList
双列:Map
键有序吗?
无序:HashMap
有序:TreeMap
如果不知道就用HashMap
Collections
(1)是针对集合进行操作的工具类
(2)面试题:Collection和Collections的区别
A:Collection 是单列集合的顶层接口,有两个子接口List和Set
B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3)常见的几个小方法:
A:public static <T> void sort(List<T> list)
B:public static <T> int binarySearch(List<?> list,T key)
C:public static <T> T max(Collection<?> coll)
D:public static void reverse(List<?> list)
E:public static void shuffle(List<?> list)
泛型
(1)泛型概述
是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的
特殊的类型。
(2)格式:
<数据类型>
注意:该数据类型只能是引用类型。
(3)好处:
A:把运行时期的问题提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计,解决了黄色警告线问题,让程序更安全
静态导入
(1)可以导入到方法级别的导入
(2)格式:
import static 包名....类名.方法名;
(3)注意事项:
A:方法必须是静态的
B:如果多个类下有同名的方法,就不好区分了,还得加上前缀。
所以一般我们并不使用静态导入,但是一定要能够看懂。
可变参数
(1)如果我们在写方法的时候,参数个数不明确,就应该定义可变参数。
(2)格式:
修饰符 返回值类型 方法名(数据类型... 变量) {}
注意:
A:该变量其实是一个数组名
B:如果一个方法有多个参数,并且有可变参数,可变参数必须在最后
(3)Arrays工具类的一个方法
asList()把数组转成集合。
注意:这个集合的长度不能改变。
在集合中常见的数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序