文章目录
回顾
- 集合顶层接口: Collection接口 -->list接口/set接口
- List接口的实现类: ArrayList LinkedList Vector
- List ArrayList LinkedList Vector
List接口(有序可重复) | 可以循环 遍历 迭代 |
ArrayList类 可变长度的数组 | 检索效率高,但是插入删除效率不高 |
LinkedList 类 链表数据 | 链表的增删效率高,因为有很多新方法 |
Vectork类 可变数组 | ArrayList一致,但支持同步 |
泛型再说明
- 概念: 泛型是 J D K 1.5 以 后 新 增 特 性 \color{#ff0036}{JDK1.5以后新增特性} JDK1.5以后新增特性,他的本质是参数化类型(ParameterizedType)的应用,可以用在 类型、接口、方法中,分别称为泛类型、泛接口、泛方法。泛型使用的主要目的之一就是为了指定容器要存的数据类型,保证类型的正确性
- 语法及使用
- 使用:泛类型、泛方法、泛接口;
- 语法:类名<参数类型>(){};
- 泛型擦除: 泛型只存在
编
译
期
间
\color{#ff0036}{编译期间}
编译期间,编译完成后,自动擦除,运行期间没有泛型。
- 编译期: 定义了泛型之后就无法把 一个String放到Integer中了,以为编译期泛型还在起作用
- 运行期:泛型自动擦除,list1和list2的类型都是ArrayList所以getClass是true
- Java泛型擦除,是Java泛型中的一个重要特性,其目的是避免过多的创建类而造成运行时的过度消耗
- 自定义泛型
- T Tpye 表示类型
- K V 分别表示键值中的Key、Value
- E 代表Element
- ? 代表不确定类型
public class Test02_自定义泛型 {
}
class Apple{}
class IPad extends Apple{}
class Orange{}
//泛型类1
class Op<T>{
private List<T> list;
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public static void main(String[] args) {
Op<Apple> op=new Op<Apple>();
System.out.println(op.getList());
Op<Orange> op2=new Op<Orange>();
System.out.println(op2.getList());
}
}
//泛型类2
class Op2<T extends Apple>{
private List<T> list;
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
//泛型方法
public <T> T t1(T name) {//T代表未知类型
return name;
}
public static void main(String[] args) {
Op2<Apple> op=new Op2<Apple>();
System.out.println(op.getList());
String a=op.t1("111");
Op2<IPad> op2=new Op2<IPad>();
System.out.println(op2.getList());
}
}
//泛型接口
interface i<T>{
}
1.set
1.1 Hashset
HashSet底层数据结构是哈希表如何保证元素的一致性?
- 通过两个方法 hashCode和equals
- 如果哈希值不同,直接添加打集合中
如果哈希值相同,在比较equals
重写equals和hashcode方法使得储存对象的时候能判断对象里面的属性是否相同
@override
public int hashCode(){
//Object.hash 底层上使用了array的hashCode方法,这个方法会把每个元素也就是传过去的属性一次获取到地址并且进行累加
return Object.hash(属性1,属性2……);
}
@Override
public boolean equals( Object o ){
//判断内存地址是否一致
if( this == o ) return true;
//判断o是否是null 并且this 和 o 的类型相同
if(o == null || o.getClass() != this.getClass()) return false;
类名 a = (类名)o;//把o的类型强转成本类的类 为了获取里面的属性
return this的整数类型的属性1 == a的整数类型属性1 && this的string的属性.equals(a的String类型的属性);
}
关于hashcode,我们一定要知道一个口诀:
-
hashcode相等,两个对象不一定相等,需要通过equals方法进一步判断;
-
hashcode不相等,两个对象一定不相等;
-
equals方法为true,则hashcode肯定一样;
equals方法为false,则hashcode不一定不一样,也有可能是一样;
1.2 TreeSet
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, Serializable
- 特点:
- 元素之间有一定的顺序
- 数值类:默认从小到大
- 字符串类:默认按照字典顺序
2.Map
键集,值集, 或键-值映射关系集的形式查看某个映射的内容
键不能重复,且每个键只对相应一个值,值可以重复
2.1 HashMap
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
- 描述:继承了Map,所以允许null值和null键。
- 构造方法:
- 常用方法
- 特点:
- 无序映射的键值对,键不能重复,值可以;
- 键和值都可以是null,如果对一个键重新赋值两次,那么这个键对应的是最后一个的值;
- 不同步;
- 遍历Map集合:可以使用keySet()获取键集 或者 entrySet() 获得 键-值对集
2.2 TreeMap
-
特点:
- 有序映射集合,这个有序是根据key;
- 允许通过实现自定义比较器实现新的比较规则;
- 不同步;
-
注意:TreeMap允许通过实现自定义的比较器实现新的比较规则。自定义一个类实现Comparator接口。例如数值从大到小,字符串按照长度从小到大。
未完待续……