-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一集合。
1,java是一种面向对象的语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。
而对多个元素进行存储,数组的长度是固定的,不能满足元素变化的要求,所以java提供了集合供使用。
2,集合的特点
1、长度可以发生改变
2、只能存储对象
3、可以存储多种类型对象(一般存储的还是同一种)
3,集合和数组的区别
1、长度问题
数组固定
集合可变
2、存储元素问题
数组可以是基本类型,也可以是引用类型。
集合只能是引用类型。
3、是否同一类型
数组元素类型一致。
集合元素类型可以不一致。
4,集合体系的由来
集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类。
而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系结构。
数据结构:数据存储的方式。
程序 = 算法 + 数据结构
如何学习和使用一个继承体系呢?
学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。
二,Collection的功能
1、添加功能(掌握)
boolean add(Object obj):向集合中添加一个元素。
boolean addAll(Collection c):向集合中添加一个集合的元素。
2、删除功能(掌握)
void clear():删除集合中所有的元素。
boolean remove(Object obj):删除集合中指定的元素。
boolean removeAll(Collection c):删除集合中指定的集合元素。
3、判断功能(掌握)
boolean isEmpty():判断集合是否为空。
boolean contains(Object obj):判断集合是否包含指定的元素。
boolean containsAll(Collection c):判断集合是否包含指定的集合中的元素。
4、遍历功能(掌握)
Iterator iterator():迭代器。
hasNext():判断是否还有元素
next():获取下一个元素
5、长度功能(掌握)
int size():获得集合的元素个数。
6、交集功能
boolean retainAll(Collection c):判断集合中是否有相同的元素。
7、转换功能
Object[] toArray():把 集合变成数组。
迭代器的使用
1、使用步骤
1、通过集合对象获取迭代器对象。
2、通过迭代器对象判断。
3、通过迭代器对象获取。
2、迭代器原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。
这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种
集合的时候,只要该集合内部实现这个接口即可。
集合的常见使用步骤:
1、创建集合对象
2、创建元素对象
3、把元素添加到集合中
4、遍历集合
1、通过集合对象获取迭代器对象。
2、通过迭代器对象判断。
3、通过迭代器对象获取。
迭代的常见操作
hasNext();//有下一个元素,返回真
next();//取出下一个元素
remove();//移除
三。List
元素有序(指存储顺序和取出顺序是否一致),可重复。
List的特有功能1、添加功能
void add(int index,Object obj):
2、删除功能
Object remove(int index):
3、修改功能
Object set(int index,Object obj):
4、获取功能
Object get(int index):
int indexOf(Object obj):
ListIterator listIterator():
List的遍历方式
1、Iterator迭代器
2、ListIterator迭代器(了解)
3、普通for+get()
ListIterator迭代器 (列表迭代器)
是Iterator的子接口。
并发修改异常 concurrentModificationException
当我们通过迭代器迭代元素过程中,又通过集合去添加元素是不允许的,因为迭代器依赖集合存在,
如果集合发生改变,迭代器也会发生改变,迭代器没变,集合变就会报错。
通过迭代器遍历集合,不能通过集合去增删
解决办法
1可以全部通过集合操作,元素添加到最后,通过for遍历时候,通过集合操作
2可以通过迭代器操作,元素添加到遍历的元素后面通过迭代器对集合进行操作
LinkedList
LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。线程不安全,效率高。
特有方法:
1、增加
addFirst();
addLast();
2、获取
//获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
getFirst();
getLast();
3、删除
//获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
添加功能如果每个元素都是用First,遍历就是倒过来的。
Vector :底层使用的是数组数据结构。特点:查询速度快,增删速度慢。线程安全,效率低。
ArrayList:底层使用的是数组数据结构。特点:查询速度快,增删速度慢。线程不安全,效率高。
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表,线程不安全,效率高。保证元素唯一性的原理是:判断元素Hashcode值是否相,
如果相同继续判断equals方法是否为true。
TreeSet:底层数据结构是二叉树,线程不安全,效率高。对元素进行排序可实现:
A:自然排序(元素具备比较性)TreeSet的无参构造,要求对象所属的类实现Comparable接口。
B:比较器排序(集合具备比较性)TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
五,Map
1 Map是一个键值对形式的集合。它的元素都是有键和值组成。
2 Map和Collection的区别?(面试题)
A:Map 是由键值对组成的集合,Map的键(key)是唯一的,值(value)可以重复。
B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。
3 HashMap和Hashtable的区别?(面试题)
HashMap:线程不安全,效率高。允许null键和值。
Hashtable:线程安全,效率低。不允许null键和值。
Map的功能
1、添加
Vput(K key,V value);//添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的 值。
voidputAll(Map <? extends K,? extends V> m);//添加一个集合
2、删除
clear();//清空
Vremove(Object key);//删除指定键值对
3、判断
containsKey(Objectkey);//判断键是否存在
containsValue(Objectvalue)//判断值是否存在
isEmpty();//判断是否为空
4、获取
Vget(Object key);//通过键获取对应的值
size();//获取集合的长度
Collection<V>value();//获取Map集合中所以得值,返回一个Collection集合
Map集合遍历方式:
A:丈夫找妻子
1:把所有丈夫给集合起来。Set<K> ketSet()
2:遍历丈夫集合,获取到每一个丈夫。增强for , 迭代器
3:让丈夫去找妻子。get(Object key)
B:根据结婚证找丈夫和妻子(理解,别人写你能看懂即可)
1:获取所有结婚证的集合。Set<> entrySet()
2:遍历结婚证集合,获取到每一个结婚证对象。迭代器,增强for
3:通过结婚证对象获取丈夫和妻子getKey()和getValue()
public class HashMapDemo {
public static void main(String[] args) {
// 创建集合对象
HashMap<String, String> hm = new HashMap<String, String>();
// 创建并添加元素
hm.put("刘备", "孙尚香");
hm.put("曹操", "卞氏");
hm.put("孙权", "步练氏");
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "***" + value);
}
System.out.println("---------------------");
// 遍历2
Set<Map.Entry<String, String>> hmSet = hm.entrySet();
for (Map.Entry<String, String> me : hmSet) {
String key = me.getKey();
String value = me.getValue();
System.out.println(key + "***" + value);
}
}
}
思路:
A:把字符串变成字符数组。
B:定义一个TreeMap集合。Character做键,Integer做值。
C:遍历字符数组,获取到每一个字符。
D:拿到该字符,到TreeMap集合中找对应的值
E:根据返回值是否为null
是:存储,把次数记录为1
否:把数据++,然后重写存储
F:把TreeMap的数据拼接成一个字符串。
public class TreeMapDemo {
public static void main(String[] args) {
String s = "cbxzbvavdvgd";
// 把字符串变成字符数组。
char[] chs = s.toCharArray();
// 定义一个TreeMap集合。Character做键,Integer做值。
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
// 遍历字符数组,获取到每一个字符。
for (Character ch : chs) {
// 拿到该字符,到TreeMap集合中找对应的值
Integer i = tm.get(ch);
// 根据返回值是否为null
// 是:存储,把次数记录为1
// 否:把数据++,然后重写存储
if (i == null) {
tm.put(ch, 1);
} else {
i++;
tm.put(ch, i);
}
}
// System.out.println(tm);
// 把TreeMap的数据拼接成一个字符串。
StringBuilder sb = new StringBuilder();
Set<Character> set = tm.keySet();
for (Character ch : set) {
Integer i = tm.get(ch);
sb.append(ch).append("(").append(i).append(")");
}
String result = sb.toString();
System.out.println(result);
}
}