Java基础(七)

(一)泛型
(1)数组直接定义了存储的类型,防止出现其他类型的元素,集合能不能也像数组一样,直接规定我们集合的存储类型,针对这种情况
一种技术:泛型
<数据类型> --- 引用数据类型

泛型:将明确的集合类型的工作推迟到了创建对象或者调用方法的时候,属于一种参数化类型,可以作为参数传递.
泛型的好处:
1)将运行时期异常提前到了编译时期
2)优化了设计,解决了×××警告线问题
3)避免了强制类型转换

泛型的引出可以提供程序的安全性!
(2)将泛型定义在类上
在早期的时候,使用Object类型代表任意类型,向上转型没有问题,
使用向下转型的时候,可能会出现问题(需要的类型有问题),这个时候就需要引入泛型操作

看API,接口,类,方法上有<E> ,都是泛型
把泛型定义在类上,提高程序安全性
解决了向下类型转换出现的问题:ClassCastException
问题:可以将泛型定义在类上,可不可以在类上不定义泛型,将泛型应用在方法上?
是可以在方法上定义的!
(3)将泛型定义在接口上
型的应用:在接口中,类中,方法上应用,在集合中应用最多!

接口中泛型,子实现类的第一种情况,就是已经知道是什么类型了
public class InterImpl implements Inter<String> {

@Override
public void show() {
    System.out.println("hello");
}

}
第二种情况,就是不知道具体的类型是什么
public class InterImpl<T> implements Inter<T>{

@Override
public void show() {
    System.out.println("hello");
}

}
(4)泛型高级(通配符)
<?> :代表任意类型Object类型,或者任意的Java类
<? extends E>:向下限定,E的子类或者E这个类型
<? super E>:向上限定,E及其他的父类
(二)集合
(1)ArrayList
ArrayList是List接口中常用的一个子实现类

遍历功能:
    1)一个是Collection的iterator()
    2)size()和get(int index)
    3)普通for循环
  4)增强for循环 
    5)针对数组操作的工具类:Arrays,提供了一个方法:
  • public static <T> List<T> asList(T... a) :将数组转换成固定大小的集合

    注意:如果使用此方法,那么集合的长度不可变
    (2)Vector集合
    底层是一种可增长对象数组,查询快,增删慢
    线程安全,同步,执行效率高

    特有功能:

  • public void addElement(Object obj)------->add(Object obj)
  • public Enumeration elements():返回此向量的枚举--->相当于:public Iterator iterator()
  • boolean hasMoreElements() --->boolean hasNext() ;
  • Object nextElement() --->Object next() ;
    (3)LinkedList集合
    LinkedList集合的特点:
    底层是一种链表实现,查询慢,增删快
    线程不安全的,不同步,执行效率高

    特有功能:
    添加功能

  • addFirst(Object e):将指定的元素插入到列表的开头
  • addLast(object e):将指定的元素添加到列表末尾
    获取功能:
  • getFirst():获取列表第一个元素
  • getLast():获取列表第二个元素
  • 删除功能
  • public Object removeFirst()移除并返回此列表的第一个元素。
  • public Object removeLast()
    (4)集合的嵌套遍历
    //增强for遍历:大集合
    for(大集里面的数据类型<小集合数据类型> 变量名: 大集合对象名) {
    for(小集合里面的数据类型 变量名:小集合对象名) {
    System.out.println(s.getName()+"---"+s.getAge());
    }
    }
    (5)Map集合
    1) 需求:有很多学生,学生有姓名,有学号,根据学生的学号查找学生?
    之前学习的集合,可以将姓名,学号作为学生类的中两个成员变量,创建集合的时候存储这个类型,可以的
  • 关键只知道学生学号,通过学号找姓名
    Key Value

    学号1 姓名1
    学号2 姓名2
    学号3 姓名3
    学号1(重复的键) 姓名4

    Java针对这种技术----->Map集合 ,键值的映射关系的一种集合(接口)
    将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
    Map<K,V> ,在Map集合中,只针对键有效,跟值无关
    2)
    Map接口的功能:
    V put(K key,V value) :添加功能:将指定的值和键关联起来
    如果当前的这个键是一次存储,则返回值null
    如果不是第一次存储,返回值是第一次对应的值,当前的值就把之前的键对应的值替换掉!

    获取功能
  • Set<Map.Entry<K,V>> entrySet() :和Map集合的遍历有关系(键值对对象)
  • Set<K> keySet():获取映射关系中所有的键的集合
  • int size()返回此映射中的键-值映射关系数
    删除功能
  • void clear():删除所有映射关系
  • Vremove(Object key)如果存在一个键的映射关系,则将其从此映射中移除

    判断功能:

  • boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true
  • boolean containsValue(Object value):映射关系中是否包含指定的值
  • boolean isEmpty():判断映射关系是否为空
    3)两种遍历方法
    1、这种遍历方式实际开发中经常用的...
    Set<K> keySet():获取映射关系中所有的键的集合

    V get(Object key):通过键找值
    转换法:
    1)将所有的丈夫集中起来
    2)让丈夫它对应的妻子
    3)将他们遍历出来
    Map集合的另一种方式的遍历 Set<Map.Entry<K,V>> entrySet() :和Map集合的遍历有关系(键值对对象)

    转发法: 1)获取所有的结婚证 2)通过结婚证分别找对应的丈夫和妻子 3)遍历输出

    思路: 1)获取所有的键值对象entrySet()
    2) K getKey() 和 v getValue(),获取键值对对象中的每个键和每个值
    3)遍历

    思路:
    1)获取所有的键的集合
    2)通过键找它对应的值
    3)遍历即可
    (6)Set集合
    1)Set集合和List集合的区别?
    Set集合:不允许元素重复,唯一的(元素可以为null) ,不能保证迭代的顺序恒久不变(底层哈希表和hascode)
    无序(存储和取出不一致)

    2) HashSet集合的add方法底层依赖于双列集合HashMap,它依赖于两个方法,HashCode()方法和equals()方法
    先比较字符串的HashCode()码值一样,再比较equals()方法
    如果hasCode码值一样,还要比较内容是否相同,由于存储String,重写了equals()方法

    String本身重写了equals方法,所以不需要再重写了!
    3)自定义的类并没重写于hashCode()和equals()方法这两个方法,解决,重写这两个方法

    (三)JDK5以后的新特性
    Jdk5以后的新特性:
    增强for,静态导入,可变参数,泛型,自动拆装箱..
    (1)可变参数:当一个方法的参数个数不确定的时候,要使用可变参数
    格式:
    修饰符 返回值类型 方法名(数据类型...变量名){...}
    注意:
    1)变量名:看成一个数组
    2)使用的时候数据类型...

    注意:根据具体的需求去完成,一般情况,知道有这个特性就可以了
    (2)增强for
    增强for循环的格式
    for(数据大类型 变量名 : 数组或者集合对象名){
    输出变量即可!
    }

    增强for的出现时替代迭代器的,所以在遍历集合或者遍历数组就可以使用增强for去完成

    增强for循环的弊端:如果集合的对象是null,如果再次对集合操作,就会出现异常
    对集合进行判断,非空判断解决
    (3)静态导入
    特点:
    1)前提是该方法必须是静态的
    2)导入到的一个方法的级别

    静态导入的格式:

  • import static 包名.类名.方法名;

    *import static java.util.ArrayList.add; 方法必须是静态方法
    常用类中哪个类中静态方法最多:Math

    之前导包:java.util.Scanner; 导入到类的级别
    静态导入是导入到方法的级别
    注意:本身当前的某个类中的方法名和需要被静态导入的方法名一样,必须加上前缀

猜你喜欢

转载自blog.51cto.com/13670525/2114958