一. 对象的存储
① 数组(基本数据类型 & 引用数据类型)
② 集合(引用数据类型)
数组储存数据的弊端: 长度一旦初始化以后, 就不可变; 真正给数组元素赋值的个数没有现成的方法可用
二. 集合框架
Collection接口: (两个子接口 List、Set)
List接口:
① 存储有序的, 可以重复的元素(相当于动态数组)
② 新增的方法: 删除remove(int index) 修改set(int index, Object obj) 获取get(int index) 插入add(int index, Object obj)
③ 添加进List集合中的元素(或对象)所在类一定要重写equals()方法
Ⅰ. ArrayList(主要的实现类)
Ⅱ. LinkedList(适合频繁的插入、删除操作)
Ⅲ. Vector(古老的实现类、线程安全, 但效率低于ArrayList)
Set接口:
① 无序性: 不是随机性, 指的是元素在底层存储的位置是无序的
② 不可重复性: 当向Set中添加进相同的元素的时候, 后边的这个不能添加进去 (要求添加进Set中的元素所在的类, 一定要重写equals() 和 hashCode()方法, 进而保证Set中元素的不可重复性)
③ 存储的元素使用了哈希算法: 当向Set中添加对象时, 首先调用些对象所在类的hashCode()方法, 计算此对象的哈希值, 此哈希值已有对象存储, 再通过equals()比较这两个对象是否相同. 如果相同, 后一个对象就不能再添加进来 (hashCode()方法要与equals()方法一致).
注: Set中常用的方法都是Collection下定义的.
Ⅰ. HashSet(主要的实现类)
Ⅱ. LinkedHashSet:
① 是HashSet的子类, 当我们遍历集合元素时, 是按照添进去的顺序实现的, 频繁的遍历, 较少的添加、插入操作建议选择此
使用链表维护了一个添加进集合中的吮吸. 导致当我们便利LinkedHashSet集合元素时, 是按照添加进去的顺序遍历的
Ⅲ. TreeSet
向TreeSet中添加的元素必须是同一个类的
可以按照添加进集合中的元素的指定的顺序遍历(像String, 包装类等默认按照从小到大的顺序遍历)
向TreeSet中添加元素时, 首先按照compareTo()进行比较, 一旦返回0, 虽然仅是两个对象的此属性相同, 但是程序会认为这两个对象是相同的, 进而后一个对象就不能添加进进来(compareTo()与hashCode()以及equals()三者保持一致)
当向TreeSet中添加自定义类的对象时, 又两种排序方法:
① 自然排序 要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法, 再此方法中, 指定按照自定义类的那个属性进行排序; 若不实现此接口会报运行时异常
② 定制排序
创建一个实现了Comparator接口的实现类对象. 在实现类中重写Comparator的compare(Object o1, Object o2)方法
在此compare()方法中指明按照元素所在类的那个属性进行排序
将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
向TreeSet中添加元素即可. 若不实现此接口, 会报运行时异常
要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致
Map接口: 存储 "键-值" 对的数据
Ⅰ. HashMap: (主要的实现类)
① key是用Set来存放的, 不可重复. value使用Collection来存放的, 可重复. 一个key-value对, 是一个Entry. 所有的Entry是用Set存放的, 也是不可重复的
② 向HashMap中添加元素时, 会调用key所在类的equals()方法, 判断两个key是否相同. 若相同则只能添加后进的元素
Ⅱ. LickedHashMap: (时HashMap的子类, 可以按照添加进Map的顺序实现遍历)
使用链表维护添加进Map中的顺序, 故遍历Map时, 是按添加的顺序遍历的
Ⅲ. TreeMap:
需要按照key所在的类的指定属性进行排序. 要求key时同一个类的对象
Ⅳ. Hashtable:
古老的实现类, 线程安全, 不可以添加null键, null值(不建议使用)
Ⅴ. properties :
常用来处理属性文件. 键和值都为String类型的
三. Collections的基本使用
反转排序List集合:
Collections.reverse(list);
随机排序List集合:
Collections.shuffle(list);
自然排序List集合:
Collections.sort(list);
指定排序List集合:
Collections.sort(list, Comparator);
交换的List集合元素:
Collections.swap(list, int i, int j);
获取List元素最大值:
Collections.max(list);
Collections.max(list, Comparator);
获取List元素最小值:
Collections.min(list);
Collections.min(list, Comparator);
获取List某个元素出现的次数:
Collections.frequency(list, Object);
实现List元素的复制:
List newList = Arrays.asList(new Object[list.size()]);
Collections.copy(newList, list);
实现List集合中值的替换:
Collections.replaceAll(list, oldValue, newValue);
四. Collections的同步控制
Collection newCollection = Collections.synchronizedCollection(list);
List<Object> newList = Collections.synchronizedList(list);
Map<Object, Object> newMap = Collections.synchronizedMap(map);
Set<Object, Object> newSet = Collections.synchronizedSet(set)
五. Enumeration
Enumeration 接口是 Iterator 迭代器的"古老版本"
Enumeration enumeration = new StringTokenizer("12-ab-#r-8h", "-");
while (enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}