1.collection接口:
List:接口,存储的数据是有序的(集合存储数据的顺序和添加数据的顺序是一致的),存储的数据是可以重复的
ArrayList:底层数据结构使用的是数组,线程不安全的,查找速度快,增删速度慢(数组开辟的内存是连续的)
Vector:底层数据结构使用的是数组, 线程安全的,查找速度快,增删速度慢,被ArrayList替代了
LinkedList:底层数据结构使用的是链表,线程不安全的,查找速度慢,增删速度快
set接口:存储的数据是为无序的,存储的数据是不可以重复的(不能存储相同的对象)
HashSet:数据结构是哈希表,线程不安全的,替代了HashTable
TreeSet:底层使用的是二叉树,线程不安全的,可以排序
注意:Set有没有自己特有的功能:没有
2.HashSet:数据结构是哈希表,线程不安全的,替代了HashTable
向集合中添加元素时,先比较哈希值,根据哈希算法计算哈希值,确定在堆中地址,如果哈希值都不相同,那么直接存入集合,
如果出现哈希值相同的,再调用equals()方法进行比较,如果返回true,则认为是相同的对象,则不存入集合,否则存入集合。
注意:同一个对象哈希值肯定相同,哈希值相同不一定是同一个对象,有可能重写hashCode()函数
contians()//判断包含某个对象也是依据int hashCode() 和boolean equals()方法
remove()//删除某个对象也是依据int hashCode() 和boolean equals()方法
3.TreeSet:底层使用的是二叉树,线程不安全的,可以排序
第一种排序方式:默认情况下TreeSet会调用加入到集合的对象的compareTo方法
需要对象所属的类实现Comparable接口的int compareTo(Object obj)方法
TreeSet会根据compareTo方法的返回值来判断谁大谁小,从而实现排序
当compareTo方法的返回值为0,认为是同一对象,不加入到集合中,这就是TreeSet保证对象唯一的方式
第二种排序方式:当对象的排序方式不符合我们的需求时,可以自定义排序方式
Comparator:接口
自定义排序方式:实现Comparator接口中的 int compare(Object o1,Object o2)
当存在自定义排序方式时,优先使用自定义的
按照字符串的长短排:当存在自定义排序方式时,优先使用自定义的排序方式
自定义排序方式:Comparator接口 int compare(Object o1,Object o2)
注意:1.排序发生时:添加对象的同时就排序了
2.TreeSet默认调用对象的compareTo()方法进行比较,因为Person中没有compareTo()方法,TreeSet无法确定谁大谁小,所以报错
3.一个类的对象如果是可排序的,那么这个类需要实现Comparable接口
4.如果没有实现Comparable接口,这抛出异常:ClassCastException:
4.泛型:使用<引用数据类型>来接收一种引用数据类型,目的是在编译时期就检查集合中的数据的类型,
如果不是指定的数据类型,则编译不通过,从而把运行时期的问题转移到了编译时期,提高了程序的安全性
作用:使用了泛型,在实现自定义排序方法时就不用类型转换了
添加的数据要和泛型的数据类型一致
通过泛型,确定集合中存储的数据的类型
5.一个类或接口能使用泛型,因为在定义类或接口时定义了泛型
1 定义泛型类: 2 3 /* 4 定义泛型类 5 6 class Student 7 { 8 } 9 class Worker 10 { 11 } 12 //使用泛型前 13 class Tool 14 { 15 private Object obj; 16 17 public void setObj(Object obj){ 18 this.obj=obj; 19 } 20 public Object getObj() 21 { 22 return obj; 23 } 24 }*/ 25 /*class Tool<T> //定义类 26 { 27 private T obj; 28 29 public void setObj(T obj){ 30 this.obj=obj; 31 } 32 33 public T getObj(){ 34 return obj; 35 } 36 } 37 class Demo9 38 { 39 public static void main(String[] args) 40 { 41 Student stu = new Student(); 42 Tool<Student> tool=new Tool<>(); 43 44 tool.setObj(stu); 45 46 Student w=(Student)tool.getObj(); 47 48 49 //Student stu = new Student(); 50 //Tool tool=new Tool(); 51 //tool.setObj(stu); 52 //Worker worker = (Worker)tool.getObj();//编译时期没问题,运行异常 53 } 54 }