数组
1.相同类型的数据
2.有长度限制
3.使用时索引越界
集合:
集合是javaAPI提供的一种容器
容器:
程序运行过程中,可以临时存放数据的容器
集合和数组之间的区别有:
数组的长度是固定的,集合的长度是可变的
数组中存储的是同一类型的元素,集合中存储的数据可以是不同类型的
数组中可以存放基本类型数据或者对象,集合中只能存放对象(但是可以自动装箱)
数组是由JVM中现有的 类型+[] 组合而成的,除了一个length属性,还有从Object中继承过来的方法
之外,数组对象就调用不到其他属性和方法了
集合是由JavaAPI中的java.util包里面所提供的接口和实现类组成的,这里面定义并实现了很多方
法,可以使用集合对象直接调用这些方法,从而操作集合存放的数据
1.创建容器对象
2.向容器中存放数据
3.从容器中获取数据
java.util.*
接口 类
集合框架中主要有三个要素组成:
- 接口
整个集合框架的上层结构,都是用接口进行组织的。
接口中定义了集合中必须要有的基本方法。
通过接口还把集合划分成了几种不同的类型,每一种集合都有自己对应的接口。
- 实现类
对于上层使用接口划分好的集合种类,每种集合的接口都会有对应的实现类。
每一种接口的实现类很可能有多个,每个的实现方式也会各有不同。
- 数据结构
每个实现类都实现了接口中所定义的最基本的方法,例如对数据的存储、检索、操作等方法。
但是不同的实现类,它们存储数据的方式不同,也就是使用的数据结构不同。
Collection接口
Collection接口是单列集合类的父接口,这种集合可以将数据一个一个的存放到集合中。它有两个重要
的子接口,分别是 java.util.List 和 java.util.Set
Collection是父接口,其中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列 集合对象。
Collection类型集合必须要有的基本的方法:(见javaAPI)
迭代器
为了能够方便的遍历集合中的每一个元素,API中提供了一个迭代器接口: java.util.Iterator
该接口可以很方便的迭代出集合中的元素。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollTest {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add(1);
coll.add("hello");
coll.add("sdjjdisj");
Iterator iter = coll.iterator();
for(;iter.hasNext();)
System.out.println(iter.next());
coll.clear();
}
}
java.util.Collection 接口继承了 java.lang.Iterable 接口 java.lang.Iterable 接口中,定义了获取迭代器的方法:
public interface Iterable {
Iterator iterator();
}
所以, Collection 接口及其子接口中,都有一个获取迭代器对象的方法: Iterator iterator();
hasNext()——判断迭代器中是否还有下一个对象
next()——获取迭代器中下一个对象
foreach循环(jdk1.5以后)(实际上还是Iterable实现的)
for(变量类型 变量名 : 集合/数组){
//操作变量
}
注意:这种方式只能用于遍历,不能对集合/数组中的元素进行修改
而且使用的集合必须是实现了Iterable这个接口的集合
数据结构
栈(先进后出)
JVM中的栈区中,main方法标注在最低端位置
队列(先进先出)
数组 (根据下标或索引存储数据,一组连续的空间)
查询快,插入/删除慢
链表(单向链表,双向链表)
查找慢,删除插入快
树(红黑树:查找插入效率都比较高)
二叉树中有一种叫做红黑树(Red/Black Tree),它最早被称为平衡二叉B树(symmetric binary Btrees),后来被称为红黑树。红黑树是一种特殊化的平衡二叉树,它可以在进行插入和删除的时候,如果左右子数的高度相差较大,
那么就通过特定操作(左旋、右旋)保持二叉查找树的平衡(动态平衡),从而获得较高的查找性能。
红黑树的每一个节点的左子树的所有数据都比自己小,而右子树的所有数据都比自己大,并且左右子树的高度近似
红黑树的约束:
- 根节点必须是黑色
- 其他节点可以是红色的或者黑色
- 叶子节点(特指null节点)是黑色的
- 每个红色节点的子节点都是黑色的
- 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
注意,红黑树的指定颜色的目的,是利用颜色值作为二叉树的平衡对称性的检查
哈希表
在JDK1.8之前是采用数组+链表进行实现
JDK1.8中,哈希表存储采用数组+链表+红黑树进行实现,当链表长度超过阈值(8)时,将链表转换为 红黑树
Collection
List
List是一种有序的集合
例如,向集合中存储的元素顺序是8、2、5。那么集合中就是按照这个顺序进行存储的
List是一种带索引的集合
可以通过元素的下标索引,精确查找对应的元素数据
List是一种可以存放重复数据的集合
可以把相同的数据,在List集合中多次保存
经常做插入删除操作的不建议用ArrayList)
Vector(线程安全的数组) LInkedList(链表)
Queue是队列接口 Deque是双端队列
Set 不能重复 无序列 没有索引(自动靠哈希值排序,对于插入的重复数据,只插入一次)
HashSet通过Hashmap实现,两者性能差不多
类/字符串插入set的情况要注意
HashSet中存储元素是无序的,主要因为它是靠对象的哈希值来确定元素在集合中的存储位置。
HashSet中元素不可重复,主要是靠对象的hashCode和equals方法来判断对象是否重复。
如果俩个对象的hashCode值相等,那么再使用equals判断是否俩对象是否相同, 如果俩个对象的hashCode值不同等,那么就不再使用equals进行判断了
java.util.Objects 是JDK1.7提供的一个对象的工具类,里面定义的一些静态方法,提供了操作对象的方法
例如,equals(Object a, Object b)方法可以判断俩个对象是否相等,当然也可以直接进行equals判断
例如,hash(Object… values)方法,可以根据若干个参数计算出一个哈希值,当然也可以自己设置哈希值
TreeSet是Set接口的子接口SortedSet的实现类
TreeSet可以将我们存进去的数据进行排序,排序的方式有俩种:
自然排序(如果一个类,实现了 java.lang.Comparable 接口,那么这个类的俩个对象就是可以比较大小的。)
public interface Comparable<T> {
public int compareTo(T o);
}
数据排序的前提,一定是可以比较出数据的大小(数据类型相同)
compareTo方法使用说明: int result = o1.compareTo(o2);
result的值大于0,说明o1比o2大
result的值小于0,说明o1比o2小
result的值等于0,说明o1与o2相等
compareTo方法的放回结果,只关心正数、负数、零,不关心具体的值是多少
比较器排序(也称客户化排序)
直接导入Comparator类使用其中的compare方法(通常匿名内部类)
public int compare(Object o1,Object o2) {
}
然后在初始化set的时候放入Comparator类创建的对象
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1,Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s1.age > s2.age? 1 : (s1.age==s2.age? 0 : -1);
}
};
Student stu1 = new Student("tom",20);
Student stu2 = new Student("tom",20);
Set<Student> set = new TreeSet<Student>(comparator);
set.add(stu1);
set.add(stu2);
}
Map
很多时候,我们会遇到成对出现的数据,例如,姓名和电话,身份证和人,IP和域名等等,这种成对出现,并且一一对应的数据关系,叫做映射。
java.util.Map<K, V> 接口,就是专门处理这种映射关系数据的集合类型。
Map类型集合与Collection类型集合,存储数据的形式不同:
Collection类型集合中,每次存一个数据。
Map类型集合中,每次需要存一对数据,key-value(键值对)
key值必须是唯一的,value值允许重复
键(key)和值(value)一一映射,一个key对应一个value
在Map中,通过key值(唯一的),可以快速的找到对应的value值
map——>Hashmap/TreeMap/HashTable/LinkHashmap
key值唯一也是通过hashcode和equals判断的
map集合里的add是put(K key,V value)(如果key存在,前面的value会被后面的value顶掉)
查找是否包含key——>containsKey() Value——>containsValues()
Map遍历
//返回Map集合中所有的key值
Set<K> keySet()
//返回Map集合中所有的value值
Collection<V> values()
//把Map集合中的的key-value封装成Entry类型对象,再存放到set集合中,并返回
Set<Map.Entry<K,V>> entrySet()
总结
集合:
需要临时存放数据
java.util
Collection
List
ArrayList 查找快,插入删除慢
LinkedList 插入删除快,查找慢
Vector 线程安全
Set (hashCode和equals判断两个对象是否相同)
HashSet
TreeSet 可以排序
1.相同数据类型
2.能进行自然排序 (能实现java.lang包下的
DataType implements Comparable {
compareTo(){}
}
方法
)
3.如果没有实现2的包,可以客户化排序
import java.util.Comparator;
Comparator comparator = new Comparator() { 。。。};
TreeSet o = new TreeSet(comparator);
Map(key-value键值对)
HashMap
TreeMap 可以排序
1.key值排序
2.key的数据类型最好一致
3.自然排序
DataType implements java.lang.Comparable {
compareTo(){}
}
-
new TreeMap(new Comparator){
compare(key1,key2);
}
-
HashTable x线程安全
-
LinkHashMap 按自己的顺序放进去