学习java—第二十天学习笔记

160 阅读5分钟

2019.8.5 NIIT第二十天 种一棵树最好的时间就是十年前,和现在

泛型

泛型的使用可以有效降低代码重复,可以利用泛型来代替各种未知的参数

具体作用:

  1. 在设计时使用泛型简化代码
  2. 在使用泛型类时传入具体类型,起到约束作用
  3. 泛型都是引用类型,基本数据类型无法传输,需要使用包装类

多态类型的使用

多态中的类型转换规则:

  • 子类转父类直接转 向上转直接转
  • 父类转子类可能会出错 向下转要强转 计算机只认申明类型,在使用的时候认为是申明类型
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

数据结构

  1. 栈 后进先出 LIFO Stack栈结构 详见API LinkedList实现栈功能,但是部分功能没有,详见API

  2. 队列 先进先出 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步骤

  1. 将传进来的对象强转成当前对象
  2. 挨个比较属性
  3. 当比较是基本类型的时候,则直接比较其值
  4. 当比较引用类型的时候,直接比较之前重写的hashcode方法的返回值

重写hashCode方法

  1. 将对象的每个属性的hashcode值相加
  2. 为了避免碰巧情况:两组属性不同但是之和相同,需要加入一些干扰系数

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