集合
集合主要分为两大类
一:Collection单列集合
Collection作为一个接口,有两大实现子接口,List和Set
(1)List:
List接口常见的子实现类有ArrayList,LinkedList,和Vector
ArrayList:
底层数据结构是数组,查询快,增删慢,线程不安全,效率高
可重复存储元素,遍历时常用迭代器Iterator,利用迭代器的hasNext(),Next()方法遍历,常用方法有add(),remove(),get(),sort()(重写比较器,用于排序)
LinkedList:
底层数据结构时链表,查询慢,增删快,线程不安全,效率高
常见功能addFrist(),getFirst(),removeFirst()等等
Vector:
底层数据结构时数组,查询快,增删慢,线程安全,效率低
常见功能 elementAt(index)返回指定索引的组件,elements()返回枚举,firstElement(),它有特有的遍历方式Enumeration<Integer> elements = integers.elements(); 再调用hasMoreElements()和nextElement()方法循环遍历
(2)Set:
Set接口常见的子实现类有HashSet,LinkedHashSet,TreeSet
HashSet:
底层数据结构是哈希表,元素无序,且唯一,靠元素重写equals和hashCode方法保证唯一性,线程不安全,效率高,允许存Null元素
LinkedHashSet:
底层数据结构是链表和哈希表,链表保证有序,哈希表保证唯一,线程不安全,效率高
TreeSet:
底层数据结构是二叉树,对元素进行排序,线程不安全,效率高
如果是自然排序,使用空参构造,要求元素实现Comparable接口,重写compareTo()方法
或者是比较器排序:使用有参构造,传入Comparator比较器并重现compare()方法
二:Map双列集合
Map集合则有三大子接口,HashMap、LinkedHashMap和TreeMap
(1)HashMap:
基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,不保证顺序恒久不变,并且允许null值和null键
(除了非同步和允许Null外,HashMap和Hashtable大致相同)
常见功能:
put():添加键和值(可用于判断是否键相同)
remove():移除
get():通过键获取值
keySet():返回一个 Set的关键视图包含在这个Map
values():返回一个 Collection视图的值包含在这个Map
containsKey()、containsValue():判断集合是否包含指定的键,值
isEmpty();
常见遍历Map集合方法:
//方法一:键找值
Set<String> keys = hm.keySet();
for(String key:keys){
String v= hm.get(key);
System.out.println(key+"===="+v);
}
//方法二:键值对对象找键和值
Set<Map.Entry<String, Integer>> entries = hm.entrySet();
for(Map.Entry<String, Integer> entry:entries){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"==="+value);
}
(2)LinkedHashMap:
底层数据结构是链表和哈希表,元素有序且唯一
(3)TreeMap:
底层数据结构是二叉树,不允许插入null键,可以Null值,线程不安全但是效率高
同时,键是自然排序(Comparable接口),否则必须要有比较器排序(Comparator接口)
补充:集合相关的Collections工具类,泛型和遍历常用的新式for循环
Collections工具类:
是针对集合操作 的工具类
常用功能:
sort(),binarySearch(),max(),reverse(),shuffle(),这些方法基本上和英文意思一致,大多数类调用方法时也可以同理推出类似方法;
泛型:
定义位置: 类,接口,方法
(1)当定义在接口时,创建子类对象的时候就得明确泛型具体的数据类型
(2)当定义在方法上,调用方法时就必须明确具体类型
优点:
(1)避免向下转型
(2)把问题提前到编译期
特点:
(1)一种把数据类型明确到工作推迟到创建对象或者调用方法时才去明确的机制
(2)语法,数据类型只能写引用数据类型
(3)只在编译期间有效,运行期擦除
泛型通配符 ? 通配任意类型,类型如下:
//普通型
Animal<?> objectAnimal = new Animal<Date>();
//向上限定 右边的泛型只能是他的本身,或者他的父类
Animal<? super Animal> animal = new Animal<Object>();
//向下限定 右边的泛型只能是他的本身,或者他的子类
Animal<? extends Animal> animal2 = new Animal<Dog>();
新式for循环:
容器为数组或者集合,多用于遍历
//格式
for(容器数据类型 元素名:容器名){
}
J2SE1.5新增的Varargs机制
public class Demo2 {
public static void main(String[] args) {
System.out.println(add(1,2));
System.out.println(add(1,2,3));
}
public static int add(int... num){
int sum = 0;
for (int i : num) {
sum += i;
}
return sum;
}
}