单列集合
List集合
有序,带索引,可存储重复元素的单列集合
tips:在操作索引时,要防止索引越界异常
-
索引特有方法:
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回的是更新前的元素。
-
遍历方法
-
普通for循环
for(int i=0;i<list.size();i++){ String s = list.get(i); System.out.println(s); }
-
迭代器遍历
Iterator<String> it = list.iterator(); while(it.hasNext){ String s = it.next(); System.out.println(s); }
-
增强for循环
for(String s : list){ System.out.println(s); }
-
List接口的实现类
-
ArrayList集合
List接口的大小可变数组实现(多线程),元素增删慢,查询快
-
LinkedList集合
List接口的链表实现(多线程),元素查询慢,增删快;包含许多操作首尾元素的方法
特有方法
public void addFirst(E e)
:将指定元素插入此列表的开头。public void addLast(E e)
:将指定元素添加到此列表的结尾。public E getFirst()
:返回此列表的第一个元素。public E getLast()
:返回此列表的最后一个元素。public E removeFirst()
:移除并返回此列表的第一个元素。public E removeLast()
:移除并返回此列表的最后一个元素。public E pop()
:从此列表所表示的堆栈处弹出一个元素。public void push(E e)
:将元素推入此列表所表示的堆栈。public boolean isEmpty()
:如果列表不包含元素,则返回true。
-
Vector集合
Vector类实现可增长的对象数组(单线程),
Set接口的实现类
Set接口继承自Collection接口,并未对其进行功能上的扩充,而是比Collection接口更严格;与List接口不同的是,Set接口中元素无序且以某种规则保证存储的元素不重复
-
HashSet集合
由哈希表支持实现Set接口(多线程),故查询速度极快,不允许存储重复元素,无索引即是一个无序集合,不能使用普通for循环,存取元素的顺序可能不一致
-
哈希值
Object类中的hashCode()方法返回对象的哈希码值,该值由操作系统给出,返回的是对象的内存地址经过处理后的结构。
String类重写了Object类的hashCode方法,根据String类包含的字符串内容经过特殊算法计算返回哈希码,只要字符串内容相同返回的哈希码也相同
-
哈希表
JDK1.8前:哈希表=数组+链表
JDK1.8后:哈希表=数组+链表;哈希表=数组+红黑树(提高查询速度)
数据结构
将元素进行分组,相同哈希值的元素为一组,哈希值构成链表,JDK1.8之后,若链表的长度超过8位,链表则会转换为红黑树从而提高查询的速度。
-
-
无重复元素实现
Set集合在调用add方法时,会先调用存储元素的hashCode方法,查找集合中有无该元素的哈希值,没有则存储到集合,若有(哈希 冲突)则调用元素的equals方法,判断两个元素是否相同,equals方法返回true则认为两个元素相同,不存储到集合,反之返回false则存储到集合
-
HashSet存储自定义类型元素
若要实现存储自定义的相同对象元素,必须在对象类中重写hashCode与equals方法
-
LinkedHashSet集合
继承自HashSet集合具有可预知迭代顺序的Set接口的哈希表与链表列表实现,与HashSet的不同在于LinkedHashSet维护这一个定义了所有条目迭代顺序的双重链接列表;即按照将元素插入到Set集合中的顺序进行迭代。有序但仍不能存储重复元素
-
数据结构
哈希表(数组+链表/红黑树)+链表(记录元素的存储顺序)
-
-
可变参数
JDK1.5之后,对于需要多个相同数据类型参数的方法定义,可将其简化使用可变参数
修饰符 返回值类型 方法名(参数类型... 形参名){ }
使用可变参数的方法在调用时可直接传递数据而非传递数组,编译时会自动封装为一个数组
例:
调用: int sun = getSum(1,2,3,4,5,6) 定义: public static int getSum(int... arr){ int sum = 0; for(int a : arr){ sum +=a; } return sum; }
Collections集合工具类
public static <T> boolean addAll(Collection集合对象,元素列表)
:往集合中添加一些元素。public static void shuffle(List<?> list) 打乱顺序
:打乱集合顺序。public static <T> void sort(List<T> list)
:将集合中元素按照默认规则升序排序。public static <T> void sort(List<T> list,Comparator<? super T> )
:将集合中元素按照指定规则排序。
例:
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
//采用工具类 完成 往集合中添加元素
Collections.addAll(list, 5, 222, 1,2);//静态方法通过类名直接调用
System.out.println(list);
//排序方法
Collections.sort(list);
System.out.println(list);
}
}
结果:
[5, 222, 1, 2]
[1, 2, 5, 222]
tips:Sort默认规则排序,自定义类型元素类必须实现Comparable接口,重写compareTo方法
Sort规则排序
sort的匿名内部类实现Comparator接口
public class CollectionsDemo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//排序方法 按照第一个单词的降序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) - o1.charAt(0);
}
});
System.out.println(list);
}
}
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序,
则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)
如果要按照降序排序
则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)