集合
集合框架
集合,数组都是对多个数据进行存储操作的结构,简称java容器。
java集合可分为Collection和Map两种体系
- Collection接口(单列)
- List 元素有序,可重复的集合
- ArrayList
- LinkedList
- Vector
- Set 元素无序,不可重复的集合
- HashSet
- LinkedHashSet
- TreeSet
- List 元素有序,可重复的集合
- Map接口(双列 KV)
- HashMap
- LinkedHashMap
- TreeMap
- Hashtable
- Properties
Collection接口的方法
Collection coll = new ArrayList();
- add(Object e) 将元素添加到集合
- size() 获取添加元素的个数
- addAll(Collection coll1) 将coll1集合中的元素添加到当前的集合中
- isEmpty() 判断集合是否为空
- contains() 判断当前集合中是否包含obj 会调用所在类的equals方法
- containsAll() 判断形参coll中所有的元素是否都在当前集合中
- remove() 从当前集合中移除obj元素
- removeAll(Collection coll1) 从当前集合移除coll1中所有元素
- retainAll(Collection coll1) 获取交集
- equals() 集合是否相同
- hashCode() 返回当前对象的哈希值
- toArray() 集合到数组的转换
- iterator() 返回Iterator接口的实例,用于遍历元素
- iteraor对象称为迭代器,主要用于遍历Collection集合中元素,即提供一种方法,而又不暴露该对象的内部细节。迭代器模式就是为容器而生。
- 继承了java.lang.Iterable接口
- 仅用于遍历集合
- 每次调用都得到一个全新的迭代器对象
- next()
- hasnext()
while(iterator.hasNext()){
System.out.println(iterator.next());
}
List接口
- 动态数组
- 三个实现类
- ArrayList
- 作为List接口主要实现类
- 线程不安全 效率高
- 使用object[] elementData存储
- LinkedList
- 底层使用双向链表存储
- 用于频繁插入和删除操作
- Vector
- 古老实现类
- 线程安全的 效率低(使用synchronized实现)
- object[] elementData
- ArrayList
函数使用
- ArrayList
- add()
- addall()
- indexOf() 集合中首次出现的位置
- LastIndexOf()
- remove(int index) 按索引删除
- remove(Object o) 按元素删除
- subList(int fromIndex, int toIndex) 返回左闭右开集合
源码解析
- ArrayList
- ArrayList list = new ArrayList();
- jdk7 底层创建了长度为10的Object[]数组 默认扩容到1.5倍,将原有数据复制到新数组中
- jdk8 变化 声明时创建空列表 在使用add方法时长度为10
- LinkList
- LinkedList list = new LinkList();
- 链表
- Vector
- 存储无序的不可重复的数据
- 向Set中添加的数据,其所在类一定要重写hashCode()和equals()
- HashSet
- Set接口主要实现类
- 线程不安全 可以存储Null值
- 底层数组+链表
- LinkedHashSet
- 作为HashSet子类
- 可按添加顺序遍历
- 为每个数据维护两个引用
- 用于频繁便利
- TreeSet
- 可以按照添加对象进行排序
- 不能添加不同类的对象
- 两种排序接口
- 所用到的Person类
- 所用到的Person类
public class Person implements Comparable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Person o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
```java
public Person() {
}
//按照姓名从小到大排列, 年龄从小到大
@Override
public int compareTo(Person o) {
Person user = (Person) o;
//return this.name.compareTo(user.name);
int compare = this.name.compareTo(user.name);
if(compare !=0){
return compare;
}else {
return Integer.compare(this.age,user.age);
}
}
- 自然排序 实现Comparable接口
- ```java
@Override
public int compareTo(Person o) {
//return this.name.compareTo(user.name); 先比较name再比较age
int compare = this.name.compareTo(user.name);
if(compare !=0){
return compare;
}else {
return Integer.compare(this.age,user.age);
}
}
TreeSet set = new TreeSet(com); //初始化
- 定制排序 实现Comparator接口
- ```java
Comparator com = new Comparator() {
//按照年龄排列
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Person && o2 instanceof Person){
Person u1 = (Person) o1;
Person u2 = (Person) o2;
return Integer.compare(u1.getAge(), u2.getAge());
}else {
throw new RuntimeException("输入的数据类型有误");
}
}
};
TreeSet set = new TreeSet(com); //初始化
Map方法
- HashMap
- Map的主要实现类
- 线程不安全
- 可以存储Null
- LinkedHashMap 适用于频繁遍历操作
- TreeMap
- 实现排序遍历
- 考虑key的自然或定制排序
- 底层使用红黑树实现
- Hashtable
- 古老实现类
- 线程安全
- Properties:用来处理配置文件 KV均为String
- HashMap的底层实现原理 (JDK7)
- Hash map = new HashMap();
- 底层创建了长度16的Entry[]数组
- map.put(k1,v1);
- 调用k1所在类的hashCode()计算哈希值,得到在Entrey中存放的位置
- 如果此外无 则成功
- 如果不为空 比较k1的哈希值 ,
- 不同 添加成功(以链表实现)
- 相同 调用k1的equals()方法,
- 如果false,添加成功(以链表实现)
- 如果true ,替换value
- 默认扩容为原来的2倍
- JDK8中 声明时未创建 Node[]非Entry[]
- jdk7只有数组+链表
- jdk8 数组+链表+红黑树
- 当数组的某一个索引的位置的元素以链表形式存在且个数>8 且当前数组的长度>64时,此时索引上的位置所有数据改为红黑树存储
- Hash map = new HashMap();
- Map结构的理解
- key 无序 不可重复 Set存储
- Value 无序 可重复 Collection存储
- entry 无序 不可重复 Set存储
方法
- Map map = new HashMap();
- rmove()
- put()
- putAll()
- size()
- clear()
- get()
- isEmpty()
- containsKey()
Set keySet() 返回所有key构成的集合
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
Collection values() 返回所有value构成的Collection集合
Collection collection =map.values();
for(Object obj : collection){
System.out.println(obj);
}
Set entrySet() 返回所有key-value对构成的Set集合
Set entrySet = map.entrySet();
Iterator iterator1 = entrySet.iterator();
while (iterator1.hasNext()){
Object obj = iterator1.next();
// entrySet集合中的元素都是entry
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey()+"-->"+entry.getValue());
}
Collections
-
Collections是操作Collection ,Map的工具类
reverse(List)
- shuffle(List) 随机排列
- sort(List) 升序
- sort(List , Comparator) 指定Comparator
- swap(List , int i, int j) i处和j处交换
- Object max(Collection)
- Object max(Collection , Comparator) 返回给定的Comparator下的最大元素
- Object min(Collection)
- Object min(Collection, Comparator)
- int frequency(Copllection, Object) 返回指定元素出现的次数
- void copy(List dest,List src) 将src copy到dest中
- bollean replaceAll(List list, Object oldVal, Object newVal) 替换