集合能够存储多个元素,但咱们对多个元素也有不一样的需求java
常见问题:数组
1:长度的区别安全
2:内容不容数据结构
3:元素的数据类型性能
使用数组的缺陷:spa
2.数组的效率更高.例如:IO流 byte[] arr=new byte[1024];就是使用的数组线程
须要惟一吗?code
须要:Set 须要制定顺序吗? 须要:TreeSet 不须要:HashSet 可是想要一个和存储一致的顺序(有序):LinkedHashSet 不须要:List 须要频繁增长或者删除元素吗? 须要:LinkedList 不须要:ArrayList
前缀名就是该集合的数据结构.后缀名就是该集合所属的体系对象
看到array:就要想到数组,就要想到查询快,有角标 看到link:就要想到链表,就要想到增删快,就要想到 add get remove+first last 方法 看到hash:就要想到哈希表,就要想到惟一性,就要想到元素须要覆盖hashcode方法和equals方法 看到tree:就要想到二叉树,就要想到排序,就要想到两个接口Comparable和Comparator
List常见方法:blog
List:有顺序的collection,而且能够包含重复元素。
├ArrayList - 数组结构,查询元素快,添加慢(通常状况下),线程不安全,效率高 └Vector - 数组结构,查询元素快,线程安全.效率比ArrayList低 - 如今几乎不适用 ├LinkedList - 链表结构,添加元素快,查询慢,线程不安全,效率高
细节说明:
LinkedList不一样于前面两种List,它不是基于数组的,因此不受数组性能的限制。
他的每个节点(Node)都包含了三方面的内容:
1.节点自己的数据: E item;
2.上一个节点的信息:Node<E> prev;
3.下一个节点的信息:Node<E> next;
因此当对LinkedList作添加,删除动做的时候就不用像基于数组的ArrayList同样,必须进行大量的数据移动。只要更改nextNode的相关信息就能够实现了,这是LinkedList的优点。 因此LinkedList集合添加数组效率高
LinkedList的经常使用方法:
注意事项:LinkedList在内存中不是连续的,ArrayList在内存中是连续的.
List集合的遍历方式:
方式一:迭代器模式,假设集合名为(al)
Iterator<String> iterator = al.iterator(); while (iterator.hasNext()) { String s = iterator.next(); System.out.println(s); }
扩展:使用ListIterator方式进行遍历,能够在遍历的过程当中对集合进行增删改查,只有list有这种方式,使用ListIterator方式还能进行反向遍历
方式二:加强for
for (String s : al) { System.out.println(s); }
方式三:普通for (List特有)
for (int i = 0; i <al.size(); i++) { System.out.println(al.get(i)); }
├HashSet (数据结构是哈希表) HashSet 怎么确认惟一? 首先判断的是两个元素的哈希值确认元素是否相同,若是相同,再判断两个对象的内容是否相同 判断哈希值是否相同,便是判断hashCode方法,判断内容是否相同,便是判断equals方法 注意:若是哈希值不一样,是不须要判断equals方法的 若是两个哈希值相同会形成哈希冲突,通常状况下,哈希值都是不会冲突的(这里不作详细介绍) 记住:若是元素要存储到HashSet集合中,必须覆盖hashCode和equals方法. 通常状况下,若是定义的类会产生不少对象,好比人,学生,书,一般都是覆盖hashCode和equals方法.创建对象是否相同的依据. └LinkedhashSet (HashSet的一个子类,一个链表) LinkedhashSet能够保证元素的有序! └TreesSet (排序,不重复,无索引)
方式一:迭代器
Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); }
方式二:加强for
for (String str : set) { System.out.println(str); }
方式一(让Bean类实现Comparable接口重写compareTo方法) 天然排序
返回值 0 , 不存
正数 , 右边 负数 , 左边
方式二(自定义一个类实现Comparator接口重写compare方法,经过构造方法传入自定义类的对象)比较器排序
好比:String ,Integer 对象 ,实现特殊的排序需求, 须要传递比较器的子类对象 .