###1.Set(接口)
##1.1 HashSet集合(是Set的实现类)
特点:
元素存取无序
元素不能重复
没有索引,
遍历方式:
只能通过迭代器和增强for循环遍历。
格式:
//创建集合对象
Set set = new HashSet();
方法:
从Collection中继承的方法
Hashset认为
只要是new出来的东西他都认为不是同一个东西
例:
stu.add(new Student(“哈哈”,14));
stu.add(new Student(“哈哈”,14));
这俩个都可以存到集合中
只有重写了hashCode才会认为是同一个东西,才只会存储一个到集合中
##1.2 LinkedHashSet集合
特点:
元素存取有序,取出的顺序和存储的顺序是一致的
元素不能重复
没有索引,
##1.3 TreeSet集合
元素有序,可以按照一定的规则进行排序,具体排序方式取决于构造方法
- TreeSet():根据其元素的自然排序进行排序
- TreeSet(Comparator comparator) :根据指定的比较器进行排序
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以不包含重复元素的集合
TreeSet和HashSet完全不同:
他的底层是基于二叉树原理:小的去自己的左边,大的去自己的右边;在获取元素的时候是从最左边开始取,
这个顺序导致TreeSet具有排序的功能。
***在开发过程中使用请使用ArrayList进行排序。
原因:TreeSet如果比较的值得到的是0就会认为是重复的元素,就会自动删除;
如果有多个字段的就需要每个字段进行一一比较,比较麻烦所以不会用TreeSet比较。
2. 自然排序 (了解)
2.1 比较器排序Comparator的使用
3.泛型 (重点)
3.1 概述:
泛型定义格式
- <类型>:指定一种类型的格式。这里的类型可以看成是形参
- <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参
- 将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
泛型的好处:
*把运行时期的问题提前到了编译期间
*避免了强制类型转换
**注意:并不是所有情况都适合用泛型,
如果已经确定参数的类型就不要用泛型,直接定义需要的类型格式就行
3.2 泛型类
定义格式:
修饰符 class 类名<类型> { }
好处:
*可以在类中任何地方使用这个泛型
缺点:
*创建完对象,泛型就会确定不可改变
-
示例代码
-
泛型类
public class Generic<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } }
-
-
测试类
public class GenericDemo { public static void main(String[] args) { Generic<String> g1 = new Generic<String>(); g1.setT("林青霞"); System.out.println(g1.getT()); Generic<Integer> g2 = new Generic<Integer>(); g2.setT(30); System.out.println(g2.getT()); Generic<Boolean> g3 = new Generic<Boolean>(); g3.setT(true); System.out.println(g3.getT()); } }
3.3 泛型方法
定义格式:
修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
示例代码
-
带有泛型方法的类
public class Generic { public <T> void show(T t) { System.out.println(t); } }
-
测试类
public class GenericDemo { public static void main(String[] args) { Generic g = new Generic(); g.show("林青霞"); g.show(30); g.show(true); g.show(12.34); } }
3.4 泛型接口:
定义格式:
修饰符 interface 接口名<类型> { }
示例代码
-
泛型接口
public interface Generic<T> { void show(T t); }
-
泛型接口实现类
public class GenericImpl<T> implements Generic<T> { @Override public void show(T t) { System.out.println(t); } }
-
测试类
public class GenericDemo { public static void main(String[] args) { Generic<String> g1 = new GenericImpl<String>(); g1.show("林青霞"); Generic<Integer> g2 = new GenericImpl<Integer>(); g2.show(30); } }
###4 泛型通配符(类型通配符)
4.1 作用:限定泛型的
格式:
*? 没有限定
*?extends 类 ----->你的泛型只能是这个类或者是他的子类
*?super 类 ------->你的泛型只能是这个类或者是他的父类
4.2 可变参数
格式:
数据类型...变量名
本质:
是一个数组
可变参和数组的区别:
可变参数介绍
可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
-
可变参数定义格式
修饰符 返回值类型 方法名(数据类型… 变量名) { }
-
可变参数的注意事项
- 这里的变量其实是一个数组
- 如果一个方法有多个参数,包含可变参数,可变参数要放在最后