1:集合(理解)
(1)java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。
而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能
满足变化的要求。所以,java就提供了集合供我们使用。
(2)集合的特点:
A:长度可以发生改变
B:只能存储对象
C:可以存储多种类型对象(一般存储的还是同一种)
(3)集合和数组的区别
A:长度问题
数组固定
集合可变
B:存储元素问题
数组可以是基本类型,也可以是引用类型。
集合只能是引用类型。
C:是否同一类型
数组元素类型一致。
集合元素类型可以不一致。
(4)集合体现的由来
集合是存储多个元素的容器,但是,由于数据结构不同,java就提供了多种集合类。
而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系
结构。
数据结构:数据存储的方式。
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
(5)如何学习和使用一个继承体系呢?
学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。
2:Collection的功能
(1)Collection的功能
A:添加功能(掌握)
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合
B:删除功能(掌握)
void clear():删除集合里的所有内容
boolean remove(Object obj):删除集合里的指定元素
boolean removeAll(Collection c):删除指定集合
C:判断功能(掌握)
boolean isEmpty():判断集合是否为空
boolean contains(Object obj):判断集合内是否包含指定元素
boolean containsAll(Collection c):判断集合是否包含另一个集合的全部内容
D:遍历功能(掌握)
Iterator iterator():迭代器,用于对集合内对象的遍历
E:长度功能(掌握)
int size():集合内对象的个数
F:交集功能
boolean retainAll(Collection c):判断两个集合是否有相同的元素
G:转换功能
Object[] toArray():把集合转换成对象数组
(2)迭代器的使用
A:使用步骤
a:通过集合对象获取迭代器对象。
b:通过迭代器对象判断。
c:通过迭代器对象获取。
B:迭代器原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。
这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种
集合的时候,只要该集合内部实现这个接口即可。
C:迭代器源码
public interface Iterator
{
public abstract boolean hasNext();
public abstract Object next();
}
public interface Collection
{
public abstract Iterator iterator();
}
public interface List extends Collection
{
...
}
public class ArrayList implements List
{
public Iterator iterator()
{
return new Itr();
}
private class Itr implements Iterator
{
public boolean hasNext(){...}
public Object next(){...}
}
}
(3)集合的常见使用步骤:
A:创建集合对象
B:创建元素对象
C:把元素添加到集合中
D:遍历集合
a:通过集合对象获取迭代器对象。
b:通过迭代器对象判断。
c:通过迭代器对象获取。
(4)Collection存储字符串和自定义对象并遍历。
A:存储字符串
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();
while(it.hasNext())
{
String s = (String)it.next();
System.out.println(s);
}
B:存储自定义对象(自己补齐)
//创建集合
Collection c= new ArrayList();
//创建对象name age
Student s1= new Student("HHH",12);
Student s2= new Student("HHH",13);
//把对象添加到集合中
c.add(s1);
c.add(s2);
//增强For遍历
for(Student s:c)
{
System.out.println(s..getName()+"**"+s.getAge());
}
3:List的特有功能(掌握)
(1)List的特有功能(自己补齐)
A:添加功能
void add(int index,Object obj):在指定位置 添加指定元素
B:删除功能
Object remove(int index):删除元素并把删除的元素返回
C:修改功能
Object set(int index,Object obj):把指定位置的元素修改为指定的元素。返回修改前的值。
D:获取功能
Object get(int index):获取指定索引的对象
int indexOf(Object obj):返回此列表中指定元素第一次出现的索引。不包含则返回-1;
ListIterator listIterator():列表迭代器。
(2)List的遍历方式
A:Iterator迭代器
B:ListIterator迭代器(了解)
C:普通for
(3)ListIterator迭代器
A:是Iterator的子接口。
B:有自己的特有功能,可以逆向遍历数据,但是需要先正向遍历。一般不用。
(4)List集合存储字符串和自定义对象并遍历。(自己补齐)
A:存储字符串
B:存储自定义对象
3:List的三个儿子(掌握)
(1)List的三个儿子特点:
List
|--ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
(2)到底使用谁?根据需求看
是否要安全:
是:Vector
否:ArrayList,LinkedList
查询多:ArrayList
增删多:LinkedList
如果你什么都不知道,用ArrayList。
(3)ArrayList(存储字符串和自定义对象)
(4)Vector(存储字符串和自定义对象)
有自己的特殊功能。
但是不用,被新功能给替代了。
(5)LinkedList(存储字符串和自定义对象)
有自己的特殊功能。可以很方便的操作头和尾。
1:Set(掌握)
(1)Set的特点:
元素无序,唯一。
注意:这里的顺序是指存储和取出顺序。
2:HashSet(掌握)
(1)HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。
(2)怎么保证的呢?
HashSet底层数据结构是哈希表。
它依赖两个方法:hashCode()和equals()
顺序:
首先,判断hashCode()值是否相同。
相同:
继续走equals()方法,根据其返回值:
true:说明元素重复,不添加到集合。
false:说明元素不重复,添加到集合。
不同:直接添加到集合。
(3)怎么重写hashCode()和equals()方法呢?(忘了吧)
hashCode():
把对象的所有成员变量值相加即可。
如果是基本类型,就加值。如果是引用类型,就加哈希值。
equals():
A:this==obj
B:!(obj instanceof Student)
C:所有成员变量的值比较。基本类型用==,引用类型用equals()。
如果不会,自动生成。
(4)案例:(掌握)
HashSet存储字符串并遍历
HashSet存储自定义对象并遍历
针对自定义对象:
需求:如果对象的成员都相同,我们就认为是同一个元素。
3:TreeSet(理解)
(1)TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。
按照实际的需求,可以对元素进行排序。并且保证唯一。
(2)怎么保证的呢?
排序:底层结构是二叉树。按照树节点进行存储和取出。
两种实现:
A:自然排序(元素具备比较性)
TreeSet的无参构造,要求对象所属的类实现Comparable接口。
B:比较器排序(集合具备比较性)
TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
唯一:根据返回值是否为0。
注意:
如果同时有两种方案,以谁为主呢?以比较器为主。
在集合中的数据结构问题
ArrayXxx:底层数据结构是数组。查询快,增删慢。
LinkedXxx:底层数据结构是链表。查询慢,增删快。
HashXxx:底层数据结构是哈希表。跟两个有关。hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种排序方式。Comparable接口和Comparator接口
什么时候,使用哪种Collection集合。
元素唯一吗?
唯一:
Set
需要排序吗?
需要:TreeSet
不需要:HashSet
不知道,用HashSet。
不唯一:
List
需要安全码?
需要:Vector
不需要:ArrayList和LinkedList
查询多:ArrayList
增删多;LinkedList
不知道,用ArrayList。
1:Map(掌握)
(1)Map是一个键值对形式的集合。它的元素都是有键和值组成。
(2)Map和Collection的区别?(面试题)
A:Map 是由键值对组成的集合,Map的键是唯一的,值可以重复。
Map是由键值对组成的集合,Map的键是唯一的,值可以重复
B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。
(3)HashMap和Hashtable的区别?(面试题)
HashMap:线程不安全,效率高。允许null键和值。
Hashtable:线程安全,效率低。不允许null键和值。
(4)Map的功能:(自己补齐)
A:添加功能 V put(K key, V value)
当key在集合中不存在时,添加元素;当key在集合存在时,替换
B:判断功能 boolean containsKey(Object key):判断指定的键是否在集合中
boolean containsValue(Object value):判断指定的值是否在集合中
boolean isEmpty()判断集合是否为空
C:删除功能
void clear():清空所有键值对数据
V remove(Object key):根据指定的键删除键值对
D:获取功能
Object get(Object key):根据键获取值
Set <K> keySet():获取所有键的集合
Collection<V> values():获取所有值的集合
E:长度功能
(5)Map的两种遍历方式(思路补齐)
A:丈夫找妻子
Set<String> set=hm.keySet();
for(String s:set)
{
String str=s.get(s);
System.out.println(str);
}
B:根据结婚证找丈夫和妻子
2:HashMap(掌握)
(1)HashMap存储字符串并遍历
键:String
值:String
(2)HashMap存储自定义对象并遍历
键:String
值:Student
(3)HashMap存储自定义对象并遍历
键:Student
值:String
需求:如果对象的成员变量值都相同,我们则认为是同一个对象。
3:TreeMap(理解)
(1)TreeMap存储字符串并遍历
键:String
值:String
(2)TreeMap存储自定义对象并遍历
键:String
值:Student
(3)TreeMap存储自定义对象并遍历
键:Student
值:String
需求:如果对象的成员变量值都相同,我们则认为是同一个对象。
同时,我们还要按照年龄排序。