集合框架:Collection 和 Map =====================集合/容器 =========================
Collection 接口
|-List
|-Set
线性表:List
list表示有先后次序的对象集合
List 接口
|-Vector 早期版本,慢,线程安全
|-ArrayList 变长数组算法实现,快,非线程安全
|-LinkedList 双向循环链表实现
size();
add(E e);
add(int index ,E e);
get(int index);
remove(int index);
indexOf(Obj o);
clear();
contains(Object o);
是否包含指定的元素,默认调用对象的equils方法,如果没有覆盖equils方法,返回false
ArrayList
ArrayList是使用变长数组算法实现的List
ArrayList = Object[]+线性表操作(增删改查)
LinkedList
LinkedList是采用双向循环链表实现的List
addFirst();
addLast();
removeFirst();
removeLast();
集:Set
元素无序,不能重复,是数学意义上的集合
Set 接口
|-HashSet
|-SortedSet
|-TreeSet
往set中存放对象的时候,会通过对象的equals()和hashCode进行比较,相同的会把前者覆盖(不能重复)
散列表/映射=======================================================
Map 接口
|-HashTable 旧,线程安全
|-HashMap 新,非线程安全
|-SortedMap
|-TreeMap 二叉排序树实现,按key排序
映射:将键映射到值
容量:散列表中散列数组的大小。
散列运算:从key 到散列值(散列数组的下标)的算法。
散列桶:散列值相同的元素的“线性集合”。
加载因子:散列数组的加载率:元素数量/散列数组大小,一般小于75%性能比较理想
散列查找:根据key计算散列值,根据散列值(下标) 找到散列桶,
在散列桶中按顺序比较key,如果一样就返回value。散列表中key不同,value可以相同。
常用方法:
clear();
containsKey(Object key);
containsValue(Object val);
put(K key,V val);
get(Object key);
remove(Object key);
isEmpty();
size();
HashMap
HashMap是以 键-值对(key:value)的形式存储对象,关键字key是唯一的不重复的
key和value可以是任何对象;
(key:value)成对放置在集合中;
重复的key算一个,重复添加是替换操作;
默认容量16,默认加载因子0.75
Map的迭代=============================================================
Collection<V> values(); 返回此映射包含的值的Collection视图
Set<K> keySet(); 返回此映射中所有key的Set视图
Set<Map.Entry<K,V>> entrySet(); 返回此映射中包含的映射关系的Set视图
泛型==================================================
泛型是java5以后提出的语法现象,作用是在编译器检查类型的约束(运行期不检查泛型)
如果不使用泛型,默认泛型是<Object>
集合的迭代==============================================
Iterator接口 描述类迭代模式操作
Collection<C> c = new ....<C>()
Iterator<C> ite = c.iterator();
while(ite.hasNext()){ //hasNext()是否仍有下个元素可迭代
C c = ite.next(); //next()返回迭代的下一个元素
if(...){
ite.remove(); //remove()从迭代器指向的 collection 中移除当前正在迭代的元素
}
}
for ... each
for( C c : collection){
//c指的就是当前元素,对c进行操作
}
Collections===========================================
Collection 是集合框架的根接口之一,代表抽象集合概念
Collections 是集合的工具类,类似数组的工具类Arrays,包括很多集合工具方法(静态方法)
.fill(List list,Object o) //用指定元素替换指定列表中的所有元素
.reverse(List list) //反转列表中元素顺序
.swap(List list, int i, int j); //在指定位置交换元素
.binarySearch(List list, Object o,[Comparator c]); //(在排序好的列表中)二分查找指定元素,返回index
.sort(List list); //排序
.sort(List list, [Comparator c]); //带比较器的排序
.max(Collection c, [Comparator c]);
.min(Collection c, [Comparator c]);
Comparable 和 Comparator ===========================
对象比较大小问题
默认比较:Comparable
Comparable表示可以比较的,实现这个接口表明这个类的实例可以比较大小,可以进行自然排序
compareTo()方法是在Comparable接口中定义的,是当前字符串与另外一个字符串比较
返回:如果当前字符串大,返回正数
如果当前字符串小,返回负数
如果相等,返回0;
String实现了Comparable接口(String是可以比较大小的)
实现Comparable接口的类:叫做可以默认比较(默认排序)的类型
如果实现Comparable,必须compareTo方法与equal结果一致
自定义比较:Comparator
Comparator 代表自定义比较规则,更加贴近业务实际,更加常用
写一个类实现Comparator接口,在compare方法中写比较逻辑。
/** 字符串长度比较器 */
class ByLength implements Comparator<String> {
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}
Collections.sort(nameList, new ByLength());
集合的复制=============================================================
java默认的复制是浅层复制
* 变量的赋值,复制的只是对象所在的地址
ArrayList<String> others = names;
集合复制有两种方法
1) clone()方法
clone()方法是Object定义的;
clone()是将当前对象进行复制,返回当前对象类型的副本实例
这个副本是浅层复制结果(java默认的所有复制,都是浅层复制)
ArrayList<String>list2 = (ArrayList<String>)list1.clone();
* clone只能复制本类型
2) 使用复制构造器
所有java集合类都定义了复制构造器,可以从一个集合中复制所有的数据,创建新集合对象
* 可以在不同类型集合间复制
ArrayList<String> names = new ArrayList<String>();
List<String> list2 = new LinkedList(names);
Set<String>set = new HashSet<String>(names);
集合与数组的转换==========================================================
1.集合到数组
1)集合提供简单的复制到数组的方法 toArray()
Object[] ary =list.toArray();
返回的是Object类型的数组
2)复制到指定类型数组 toArray(ary)
toArray(ary)方法会尽可能填充参数数组对象
如果参数对象长度不够,返回一个新数组对象,包含所有元素
如果参数对象长度够用,就填充null
String[] ary = new String[5];
ary = names.toArray(ary);
2.数组到集合
asList()方法可以将数组转换为长度不可变的List;
不支持增删:
List<String>list = Arrays.asList(ary);
//list.add("shanjp");//运行异常,不支持的方法
//再用集合的复制构造器即可得到长度可变的集合
List<String>list2=new ArrayList<String>(list);
list2.add("shanjp");
同步化(线程安全)=========================================================
Collections.synchronizedList()
Collections.synchronizedMap()
将非线程安全的list,map转换为线程安全