集合
什么是数据结构
数据结构就是计算机存储和组织数据的方式
其实就是对数据进行增删改查操作
不同的数据结构底层的采用不同的存储方法(算法),操作的时候效率不一样,有一些比较快,有一些添加比较快等
常见的数据结构:
数组(Array)、链表(Linked List)、Hash(哈希表)、栈(Stack)、队列(Queue)、树(Tree)、图(Graph)、堆(Heap)
ArrayList的特点
ArrayList增删慢,改查快
LinkList增删快,改查慢
ArrayList\Vector\Stack的区别
Vector类:基于数组实现的列表,其实就是ArrayList的前身
ArrayList类:使用了synchronized修饰,相对于Vector类来说,线程比较安全,但是效率低了
Stack类:栈,是Vector的子类,具有先进先出的特征,push(压栈),pop(出栈)
ArrayList的常用方法
常用的四大方法------增加:add、删除:remove、修改:set、查询:get
方法 | 作用 |
---|---|
public boolean add(E e) | 添加 |
public void add(int index,E element) | 插入指定索引数据 |
public boolean addAll(Collection<? extends E> c) | 添加Collection接口对象数据 |
public E remove(int index) | 删除指定索引数据 |
public boolean removeAll(Collection<?> c) | 删除Collection接口对象数据 |
public E set(int index,E element) | 修改指定索引数据 |
public int size() | 获得集合长度 |
public boolean isEmpty() | 查看集合是否为空 |
public E get(int index) | 获得指定索引数据 |
public Object[] toArray() | 把集合转换成Object数组 |
public boolean contains(Object o) | 查看集合是否存在指定数据 |
泛型的定义和使用
定义:使用标识符来表示类型
使用:创建对象的时候给定类型
实际上底层实现就是Object强转
E-Element(在集合中使用,因为集合中存放的是元素)
T-Type(Java类)
K-Key(键)
V-Value(值)
N-Number(数值类型)
?-表示不确定的java类型
Iterator的常用方法
方法 | 作用 |
---|---|
boolean hasNext() | 查看迭代器是否有更多元素,如果有返回true,没有返回false |
E next() | 迭代获取下一个元素 |
default void remove() | 从底层集合中删除此迭代器返回的下一个元素 |
实现Collection接口对象的三种迭代方式
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
//for
for (int i = 0; i < list.size(); i++) {
String string = list.get(i);
System.out.println(string);
}
System.out.println("--------------");
//foreach
for (String string : list) {
System.out.println(string);
}
//java 1.8foreach
System.out.println("--------------");
list.forEach((k)->{
System.out.println(k);
});
//iterator
System.out.println("--------------");
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
String next = iter.next();
System.out.println(next);
}
}
Set、List、Map的区别
List和Set的父类接口都为Conllection,而Map没有继承Collection父接口,严格意义看Map不是 集合
只有继承了Collection接口才能生产迭代器进行迭代操作
list有序,允许重复元素,常用类ArrayList和LinkedList
-
ArrayList:增删慢,改查快
-
LinkedList增删快,查改慢
set无序,不允许元素重复,常用类HashSet和TreeSet
- HashSet使用hash算法,擅长操作等值查询
- TreeSet使用红黑树算法,擅长范围查询
map双元素集合,一次性保存key和value值,key不允许重复,value允许重复,常用类HashMap和TreeMap
- HashMap采用hash算法擅长等值查询
- 采用红黑树算法擅长范围查询
List集合添加使用add;删除使用remove;修改使用set;查询使用get
Set集合添加使用add;删除使用remove;修改先删除再增加实现修改操作;查询通过迭代器查询
Map添加键值对使用put;获取键的值使用get;修改key使用相同的名字value值不相同即可;删除使用remove
Set集合如何判断应用类型是否相同
set添加的时候判断集合中是否有hashcode值
没有直接把新的对象赋进对象里
相等在继续和集合中的对象equals对比
如果equals为true:则表示同一个对象,则不保存
如果equals为false:存储在之前对象相同的链表上(修改)
TreeSet比较问题
TreeSet比较应用类型必须实现Comparable接口
在比较方法中
this与o比较返回
1 this优先级比较高
-1 o优先级比较高
0 同一个对象
也可以创建一个类实现Comparator接口
让他们在接口的实现方法做判断
在创建TreeSet的时候给赋上去
HashSet查询的时候比较高效率,TreeSet做范围查询的时候比较高,开发中通常使用HashSet
Map接口
因为Map没有实现Collection接口也没有实现Iterable接口所以Map不能使用foreach操作,故Map并不是集合
创建Map接口的时候需要指定数据类型,K(key)代表的是键,V(value)代表的是键的值,Map是键值对,每一对键值对可以使用Entry表示
Map其实其实就是两个集合的结合key是set集合,value是list集合,set的一个值指向value的一个值,组成键值对
Map的常用方法
方法 | 作用 |
---|---|
public V put(K key,V value) | 保存一对键值对 |
public void putAll(Map<? extends K,? extends V> m) | 保存多对键值对 |
public V remove(Object key) | 删除一个键值对 |
public int size() | 获得键值对总数 |
public boolean isEmpty() | 查看map是否为空 |
public V get(Object key) | 获取一个键值对的值 |
public boolean containsKey(Object key) | 查看所有键中是否有此键 |
public boolean containsValue(Object value) | 查看所有值中是否有此值 |
public Set keySet() | 获取所有的键 |
public Collection values() | 获取所有的值 |
public Set<Map.Entry<K,V>> entrySet() | 把map映射成set集合,集合内容为所有的Entry对象 |
HashMap与TreeMap
HashMap基于哈希算法,Map中的key对象的hashCode决定了储存的位置,因为Map中的key是Set,所以HashMap不能保证先后顺序,也不能重复
TreeMap底层基于红黑树算法,Map中存储的key会默认使用自然排序(从小到大),和TreeSet一样可以自然排序也可以自定义排序
Map的迭代方法
//获取所有的key值
map.keySet();
//获取所有的value值
map.values();
//获取map中所有的键值对
Set<Entry<K,V> entrys= map.entrySet();
Arrays工具类
public static List asList(T…a);
讲对象数组转换成List集合,此处生成的数组是不能增加也不能减少的。
Collections工具类
此类封装了Set、List、Map操作的工具方法,比如拷贝、排序、搜索、比较大小等。