Java-day15泛型&Set
1.泛型
概述:广泛的类型,在定义一个类的时候,类型中有些方法参数不确定,
就使用一个符号来表示这些不确定的类型
ArrayList<Integer> array = new ArayList<Integer>();
标注了类型以后会自动进行类型检测和类型转换
泛型的好处:(1)提高了数据的安全性,将运行时的问题暴露在编译阶段;
(2)避免了类型的强制转换
泛型类的定义
1.带有泛型的类
class 类名<泛型类型1,泛型类型2,……>{
……
}
说明:1.类名后面跟着的是泛型类型,就是泛型的声明,就相当于确定了类的类型
2.泛型的声明需要一个合法的标识符,常用的大写字母 T Q W K V T
3.泛型的确定,在使用时再确定类型
class Contain<T>{
ArraysList<T> arr = new ArrayList<T>();//新特性,后面的<>可以省略类型
public T get(){}
public void add(T t)
}
4.泛型方法的定义
1.在声明方法中,带着泛型声明的方法,及时==就是方法声明。
2.格式:
修饰符<泛型声明1,泛型声明2,……> 方法名(参数列表){}
3.说明
1.在方法上声明的泛型在整个类中都可以使用;
2.如果非静态的方法没有任何泛型的声明,可以使用类中定义的泛型
3.如果静态方法上名,没有泛型的声明,就不能使用类泛型,
需要自己定义自己的泛型类型
5.泛型接口的定义和使用
1.带着泛型定义的接口,就是泛型接口
2.格式
interface 接口名称<泛型1,……>{}
3.说明
1.在接口中定义的泛型作用范围是整个接口
2.泛型接口被实现时,有两种方式
1.实现时已被声明的类不在是一个泛型类,而是一个确定类型的类;
2.实现时声明的类还是一个泛型类,可以在创建对象的时候确定类型
4.集合体系中,大量的接口都存在实现和继承的关系
Collection<E> List<E> ArrayList<E>
6.通配符
?extends E:E的类型及其子类类型
?super E:E的类型及其父类
Animals
Dog
YellowDog
method(? extends E)
method(? super E)
练习:
1.模拟一个栈,完成先进后出的特点
2.模拟一个队列,完成先进后出的特点
2.Set
1.是Collection的子接口
2.特点:无序的,没有前后之分,没有位置的概念,所有的元素都在集合中;
没有索引,相同值的元素不能重复,因为无法区分;
集合本身不保证顺序,即存入的顺序和取出的顺序不保证一致;
3.Set的实现类
1.HashSet:使用哈希表的存储方式来存储元素的集合
Set set = new HashSet();
2.Set集合的遍历
1.转成数组,遍历数组
Object[] toArray() 返回一个包含 set 中所有元素的数组。
2.转成数组
<T> T[] toArray(T[] a) 返回一个包含此 set 中所有元素的数组;
返回数组的运行时类型是指定数组的类型。
(数组长度大于等于集合元素的个数,没有创建新的数组,只是产生了一个新的引用,多的位置上都填充为null值)
(数组长度小于集合元素的个数,则创建新的数组,把集合中数组存储进新数组中并返回对应的地址,打印时创建的数组内容都为空,结果都在我们存放的新数组中)
3.迭代器
Iterator iterator = set.iterator();
4.高级for循环
格式:for(元素的数据类型 元素名:要遍历的数组或者集合)
说明:元素名称虽然是固定的,但是随着循环的执行,每次代表的元素却不相同
使用高级for循环,由于没有索引,无法获取元素的值,则不能修改
底层是迭代器,不能与集合同时操作,否则会发生并发修改异常;
4.HashSet 如何保持数据唯一
1.重写HashCode()方法
2.重写equals()方法
TreeSet (底层是二叉树)
1.使元素本身具有比较性
泛型类实现Comparable接口,重写compareTo()方法
2.使集合本身具有比较性
写一个比较器,在创建集合的传入匿名内部类
new Comparator<Student>(){
重写compare()方法;
}
3.当元素本身和集合都具有比较性时,使用集合的比较性,元素的比较性被忽略
4.二叉树排序的三种方式
先(根)序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
2.中(根)序遍历的递归算法定义:(默认)
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
3.后(根)序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
5.LinkedHashSet
1.是HashSet的一个子类,和HashSet保证元素唯一的原理相同
2.将每个元素存储的时候,都记录了前后元素的地址
3.可以根据元素存储的顺序,使其取出顺序保持不变