8.java集合总结
数组:存储一组相同数据类型的数据结构,长度固定不能改
*charAt可以遍历字符串
数据结构:存储数据的特点
*集合中存储的都是对象的引用(地址)
? 通配符。也可以理解为占位符。
泛型的限定;
基本数据类型和静态成员不能使用泛型
*在返回值类型前加泛型
*compareAble接口 实现此接口必须实现compareto方法 让对象本身具备比较性
*无源码,不能让自身具备比较性,则实现comparator,可以实现同一类对象有多种不同的排序方式
*需要自定义一个比较器类,不需要对象自身具有比较性
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限
------Collection-----------------------------------------------------------------------------
|--List:元素有序,可重复(equals比较)。集合体系有索引。独有ListIterator
|--ArrayList: 底层数据结构
数组 特点:查询速度很快。但是(频繁)增删稍慢。线程不同步。
|--LinkedList:底层数据结构 双向链表 特点:增删速度很快,查询稍慢。线程不同步。实现了队列(Queue)接口(实现接口Duque双端队列用push和pop也可以用offer和
*poll),所以可以模拟栈和队列(用Queue中的offer和poll方法)
|--Vector: 底层数据结构 数组(向量) 特点 线程同步。被ArrayList替代了。因为效率低。枚举就是Vector特有的取出方式。
-->Stack:继承Vector 先进后出的数据结构
|--Set:元素无序,不重复。无特殊方法
|--HashSet 底层 哈希表 散列存放 无序 不重复 根据哈希码存储和读取数据 存取删效率高 改效率慢 存取对象的类一般要重写hasdcode和equals方法
*重点:如果是修改元素,要先删除,然后添加,直接修改的话,由于hashcode建立后不能改变,所以引用转向别的hashcode地址,原有元素依然存在
*而此时,由于jvm发现原有元素引用没有消除,所以不会被回收,这种操作很容易造成内存溢出
|--TreeSet 底层 二叉树 自动排序 不重复,可传比较器
|--LinkedHashSet 它继承与HashSet、又基于LinkedHashMap来实现的 存入取出顺序一致,元素不重复
----------------------------------List集合通用方法---------------------------------------------------------
*增 add() add(3,E)在角标3位置插入数据 addAll() 添加子集合
*删 clear() remove(1)删除下表为1元素remove(E)移除集合中第一次出现的E元素removeAll()
*改 set(1,abc)将角标为1的元素替换成abc subList(1,5)将1-5元素当子集合返回 toArray()
*查get(1)得到角标为1的元素 indexOf(E)/lastIndexOf()E在集合中第一次/最后出现出现的角标
*判 contains(E)判断某元素是否在集合中equals() isEmpty()
**迭代器 Iterator it = al.iterator();it.hasNext())it.next()
**ListIterator hasPrevious() Previous()逆向遍历 remove set 跟最后next有关
LinkedList:特有方法:
addFirst(); offerFirst(添加) ;pollFirst(获取移除);peekFirst(获取不移除)
addLast(); offerLast(E e) pollLast();peekLast();
getFirst();
getLast();
pop() push()
element() 获取但不移除
removeFirst();
removeLast();
--------------------set集合-----------------------------------------
Set:无序,不可以重复元素。
|--HashSet:数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素类需要实现Comparable接口,覆盖compareTo方法。
这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。新建比较器类(也可以本类继承),继承Comparator接口,复写compare方法
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
------比较-------------------------------------------------------------------
*Vector和ArrayList
vector线程同步 安全,而arraylist线程异步不安全。arraylist效率比较高。
对于大集合,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%+1.数据量比较大时,用vector有一定的优势。
*arraylist和linkedlist
ArrayList数组结构,LinkedList链表结构。
ArrayList查询快,LinkedList增删快
若只对单条数据增删操作,ArrayList的速度反而优于LinkedList。
*HashMap与TreeMap
HashMap元素固定,无序,TreeMap元素不固定,有序
插入、删除和定位元素用HashMap
遍历集合用TreeMap
----------------------**Map集合特点-----------------------------------------------------------------
|--Hashtable:底层 哈希表数据结构,不允许null。线程同步效率低。
|--HashMap: 底层 哈希表数据结构,允许 null。不同步效率高。
|--TreeMap: 底层 二叉树数据结构。线程不同步。键自动排序。
**Map集合通用方法:
增:put(K key, V value) putAll(Map<? extends K,? extends V> m)
删:clear() remove(Object key)
查:get(Object key)
判:containsKey(Object key) containsValue(Object value) isEmpty()
特:entrySet(kv集合) keySet(k的set集合) values(v的collection集合)
TreeMap特有:
ceilingEntry(K key) 返回本key Entry对象 firstEntry() lastEntry() firstKey() lastKey()
floorEntry(K key返回小于等于给定键的最大键) floorKey(K key)
map集合的两种取出方式:
*TreeMap中 复写cmopare里面返回0 put(new Person("小李",30),"年轻") put(new Person("小李",50),"老了") 输出值为小李30,老了,因为先比较了键相同,则键不懂,值覆盖
*遍历map集合Iterator<String> it=ma.keySet().iterator();
while(it.hasNext()){
String a=it.next();
System.out.println(a+":"+ma.get(a));
}
1,Set<k> keySet:将map中的键存入Set集合,用迭代器得到key,通过get方法获取值。
2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
而这个关系的数据类型就是:Map.Entry
Entry其实就是Map中的一个static内部接口。
集合工具类:
reverse(List<?> list) sort(List<T> list) sort(List<T> list, Comparator<? super T> c)
binarySearch(List<? extends Comparable<? super T>> list, T key) swap(List<?> list, int i, int j)
---------------------------------------------------------------------------------------------
System:类中的方法和属性都是静态的。
currentTimeMillis() 获取当前系统时间
exit(int status) 0 为正常退出 gc() 运行垃圾回收器
out:标准输出,默认是控制台。
in:标准输入,默认是键盘。
获取系统属性信息: getProperties();
*TreeMap中 复写cmopare里面返回0 put(new Person("小李",30),"年轻") put(new Person("小李",50),"老了") 输出值为小李30,老了,因为先比较了键相同,则键不懂,值覆盖
*遍历map集合Iterator<String> it=ma.keySet().iterator();
while(it.hasNext()){
String a=it.next();
System.out.println(a+":"+ma.get(a));
}
*charAt可以遍历字符串集合
*if(map.containsKey(c)){
count=map.get;
count++;
}else{
count=1;
}
*Map.Entry:键值对类,getValue() getKey()