- 数组:对象数组。
数组缺点:
①数组长度固定,不可改变
②数组无法求出真实有效数据的个数
③用数组实现对象的增删改查比较麻烦
2. 集合:Collection接口、Map接口
Collection:一些collection允许有重复的元素,而一些不允许。一些collection是有序的(输入顺序和输出顺序一致),而另一些则是无序的
①Collection的长度会自动适应,不必要人工干预
②Collection可以获取到真实的数据个数
③用集合实现对象的增删改查,很方便,直接调用add方法即可
Collection的两个子接口:List(有序的)、Set
- List的两个最终实现类:ArrayList、LinkedList
- Set的两个最终实现类:HashSet、TreeSet
Map的两个最终实现类:HashMap、TreeMap
3. Collection的部分方法:(Collection一定重写了toString方法,否则打印的时候会打印内存地址)
add(Object a); //向集合中添加一个元素,也可以添加一个对象
addAll(); //可以将一个集合中的全部元素增加到另一个集合之中
clear(); //清空集合中的所有元素
size(); //求集合中真实数据的个数
contains(Object a); //判断集合中是否包含指定元素(对象),包含返回true
containsAll(); //判断集合是否包含了另一个集合的所有元素
isEmpty(); //判断集合是否为空
iterator(); //(迭代器)返回在此collection的元素上进行迭代的迭代器
iter.hasNext(); //判断集合是否有下一个元素
iter.next(); //取出下一个元素
Iterator iter=collection.iterator();
while(iter.hasNext()){
String result=iter.next();
System.out.println(result);
}
remove(); //删除集合中指定的对象
removeAll(); //从集合之中删除另一个集合中包含的元素
retainAll(); //与removeAll是相反操作,从一个集合之中,只保留另一个集合的所有元素
toArray(); //将集合转换为数组(集合和数组都是保存一堆数据的,可以相互转换)
4. List接口:除了有父类的方法外,还要部分自己的方法;List是有序的
add(int index,E element);
/*Collection的add方法添加的元素在集合末尾追加,在List接口中,
*有一个重载的add方法,可以将增加的元素指定到某一个具体的位置。
*/
addAll(int index,Collection<?extends E>c); //重载的方法,将指定collection中的所有元素都插入到表中指定位置(可选操作)。
get(); //返回指定位置的元素(类似于数组下标)。
indexOf(); //可以获取到某一个指定对象(元素)第一次出现在集合之中的位置,如不存在返回-1.(从前往后)
lastIndexOf(); //于indexOf相反,获取指定元素从后往前找第一次出现的位置
remove(); //可以删除第一次出现的指定对象
remove(int index); //可以删除指定索引位置的对象(Collection不能按照索引删,因为有一部分是无序的,而List是有序的,所以可以按照索引删)
set(); //将指定位置的元素修改为新的对象
subList(int formIndex,int toIndex); //类似subString,截取指定范围内的数据,formIndex包括,toIndex不包括(左闭右开)
5. List的实现类:
- ArrayList:动态数组,数组长度"可变"(普通数组一旦定义就不可改变),若添加元素,会开辟一个比原来空间多一点的空间,然后把原来的元素复制进来,再添加新的元素。
- LinkedList:ArrayList是连续的,LinkedList是散列的;每个元素都有一个内存地址,而每个元素包括两个部分(元素,地址),这里的地址放的是下一个元素的地址,所以通过这个地址就可以找到当前元素的下一个元素,像连接表一样链接在一起。
两种实现类的优缺点:
- 查询:ArrayList方便,LinkedList不方便。因为ArrayList是连续的,可以通过下标进行查询,LinkedList查找要一个个往下找,很麻烦
- 增删改:ArrayList不方便,LinkedList方便。因为ArrayList在中间删除了一个元素之后,该元素往后的元素都要往前挪一个位置;而LinkedList只需要将删除的元素的上一个元素的地址重新指向删除元素所指向的地址就行
6. 几个集合接口的区别
Collection:存储的数据是不唯一、无序的对象
List:存储的数据是不唯一、有序的对象
Set:存储的数据是唯一、无序的对象
Map:无序
有序:输入顺序于输出顺序是否一致
HashSet底层实现是HashMap,TreeSet底层实现是TreeMap
在使用上Collection的几个实现类基本上使用方法都一样,只是它们的底层不一样而已
HashXxx:底层借助了“哈希表”的数据结构;默认不支持排序
TreeXxx:底层借助了“红黑色”的数据结构;默认支持排序
-
Collection和Map是相互独立的,它们之间没有任何的继承关系,虽然它们的底层有关系,接口层没有任何关系。
-
Collection及它的子接口:单值集合
Map:”键值对“集合 (双值集合),可以根据键找到值,kv:一一对应
key是唯一的,value不唯一
10. Map接口部分方法:
put(key,value):增加数据
get(Object key):获取指定key的值,获取一个key返回一个value
size():获取元素的个数
containsKey(key):判断集合是否包含指定的key
containsValue(value):判断集合是否包含指定的value
将Map转为单值集合:
keySet():(因为Map中key是唯一的,所以转为set)转为只包含了key的单值集合
values():(转为Collection,不唯一)转为只包含了value的单值集合
remove(key):根据key删除数据,如果key不存在,不报错。
删除:Map中的类删除的返回值,就是删除的value对象,不是boolean,Collection中的类是boolean,返回true or false
- TreeMap是有序的、HashMap和HashTable是无序的,HashTable是方法同步的、HashMap是方法不同步的,这是两者最主要的区别
这就意味着:
HashTable是线程安全的(效率低)、HashMap是非线程安全的(效率高)
HashTable不允许null值、HashMap允许null值(key和value都允许)
如何遍历集合?list set map
①循环for(普通for【只适用有序集合】,增强for【建议】)
for( 元素类型 元素值 :需要遍历的集合 ){
}
②迭代器(集合通用) public interface Iterator{…}
默认是指向第一个元素的前一个元素,有两个方法结合使用:
hasNext():
(1)首先判断第一个元素的下一个元素是否存在;true or false
(2)如果有元素,引用后移,指向下一个元素,否则不移;
next():hasNext判断有元素后,取出当前元素
遍历map:将双值集合转为单值集合,即可使用迭代器
遍历map还可以通过entry遍历
entry=key+value
首先,取出entry:entrySet
然后for遍历,getKey()、getValue()就可以了