2019.8.5 NIIT第二十天 种一棵树最好的时间就是十年前,和现在
泛型
泛型的使用可以有效降低代码重复,可以利用泛型来代替各种未知的参数
具体作用:
- 在设计时使用泛型简化代码
- 在使用泛型类时传入具体类型,起到约束作用
- 泛型都是引用类型,基本数据类型无法传输,需要使用包装类
多态类型的使用
多态中的类型转换规则:
- 子类转父类直接转 向上转直接转
- 父类转子类可能会出错 向下转要强转 计算机只认申明类型,在使用的时候认为是申明类型
Animal a3=new boy();
boy b1=(boy)a3;
a3实际为boy类型,但是在使用的时候认为是Animal,所有转换的时候需要强转 但是a3实际为boy类型,所有强转之后不会报错
List接口
实现类:LinkedList
LinkedList与ArrayList不同,LinkedList是方便添加或删除的List。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作, 所以该具体子类的特点在于提供了大量首尾操作。
- public void addFirst(E e) 添加首个元素
- public void addLast(E e) 添加最后元素
- public E getFirst() 获取首个元素
- public E getLast() 获取最后元素
定义时可以直接定义为父类List 标识符; 由于申明是父类,所以在使用子类方法时需要强转0.0
数据结构
-
栈 后进先出 LIFO Stack栈结构 详见API LinkedList实现栈功能,但是部分功能没有,详见API
-
队列 先进先出 LILO List集合默认采用队列的数据结构 Queue队列接口 详见API
offer和add的区别在于,offer有返回值,add没有返回值 面试必问:LinkedList和ArrayList的区别
| 类型 | 结构 | 存储差异 | 增删改速度 | 查询 | 应用场景 |
|---|---|---|---|---|---|
| ArrayList | 数组结构 | 有索引 | 慢(需要重建索引) | 快(有索引) | 当数据用于广泛查询时使用ArrayList(<90%) |
| LinkedList | 链表结构 | 无索引 | 快(只需要操作两个元素) | 慢(无索引) | 当数据用于频繁增删改使用LinkedList |
HashSet
HashSet是一个无序的容器 需要通过迭代器进行遍历 里面元素不能重复,如果出现相同的则覆盖,保证只有一个 HashSet作用:去重复 所有的List都可以直接打印出内部所有元素 因为打印默认调用toString方法,在List,Set中将toString进行了重新 可以利用set的不重复性进行去重
import java.util.HashSet;
import java.util.Iterator;
public class TestHashSet {
public static void main(String[] args) {
HashSet<String> set=new HashSet();
set.add("1");
set.add("2");
set.add("ds f");
set.add("4ffdsafd");
set.add("6");
Iterator<String> p=set.iterator();
while(p.hasNext()) {
System.out.println(p.next());
}
//获取元素个数
System.out.println(set.size());
//再次添加重复的元素
set.add("4ffdsafd");
set.toString();
System.out.println(set.size());
HashSet<Character> set1=new HashSet();
String str="fdsafawqfhdsabdkfhdsbgaq";
char[] crr=str.toCharArray();
for (char c : crr) {
set1.add(c);//利用了cwt的不重复性,自动去重
}
System.out.println(set1);
}
}
LinkedHashSet可以把无序变成有序 按添加顺序显示
package Day20;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class TestLinkedHashSet {
public static void main(String[] args) {
LinkedHashSet<Integer> set=new LinkedHashSet();
set.add(88);
set.add(77);
set.add(66);
set.add(55);
set.add(77);
set.add(33);
set.add(22);
set.add(11);
Iterator<Integer> p=set.iterator();
while(p.hasNext()) {
System.out.println(p.next());
}
System.out.println("-----------------");
}
}
TreeSet
可以进行自然排序,即对数字,字母等元素进行排序
package Day20;
import java.util.Iterator;
import java.util.TreeSet;
public class TestTreeSet {
public static void main(String[] args) {
TreeSet<Integer> list=new TreeSet();
list.add(1);
list.add(4);
list.add(2);
list.add(5);
list.add(3);
Iterator<Integer> p=list.iterator();
while(p.hasNext()) {
System.out.println(p.next());
}
TreeSet<String> list1=new TreeSet();
list1.add("fdjskla");
list1.add("djskla");
list1.add("jskla");
list1.add("skla");
list1.add("kla");
Iterator<String> p1=list1.iterator();
while(p1.hasNext()) {
System.out.println(p1.next());
}
}
}
contains方法
public boolean contains(Object o) 如果此列表中包含指定的元素,则返回 true。
contains方法的运行原理: 查找列表ArrayList元素的地址,此方法比较的是两个对象的地址
解决办法:不去比较地址 应用场景:当放入一个new对象时,与集合中一个元素内容相同,但是由于地址不同,使用contains方法被认为不是一个对象时需要重写equals方法
- equals如果是String的话,比较值
- 如果是引用类型比较的是地址,会去调p1==p2,而==默认是比较p1和p2的hashcode值,所以还需要重写hashcode方法
重写equals步骤
- 将传进来的对象强转成当前对象
- 挨个比较属性
- 当比较是基本类型的时候,则直接比较其值
- 当比较引用类型的时候,直接比较之前重写的hashcode方法的返回值
重写hashCode方法
- 将对象的每个属性的hashcode值相加
- 为了避免碰巧情况:两组属性不同但是之和相同,需要加入一些干扰系数
equals重写的时候调用了hashcode方法进行地址的判断,所以需要重写hashcode方法 当对象的属性是整型的时候hashcode返回值为此整型值 当对象的属性是引用类型的时候hashcode返回值为地址
面对情况: 比较两个引用类型是否相等的时候,一般使用equals方法 要求我们重写类中的equals方法和hashcode方法 在equals方法中判断每个属性是否一致 hashcode方法中去返回每个属性的hashcode值的和,并设置干扰系数避免碰巧情况
JAVA单列集合框架总结
Collection:父类接口,规范集合中的方法 add remove clear Iterator contains(查询) List:有序,课重复
- ArrayList:基于数组:查询快
- LinkedList:基于链表:增删改快 Set:无序,不可重复
- HashSet 去重,无序
- LinkedHashSet可以按照加入的顺序进行打印
- TreeSet:可以排序
Map集合
双列集合是每个元素都有键与值两部分组成的集合,记录的是键值对对应关系。即通过键可以找到值
通过HashMap进行双列数据操作
Set<Map.Entry<K,V>> entrySet() 详见API