5.5学习内容总结

一:
1.问题:使用ArrayList集合存储元素遍历的时候,按照正常的操作出现了问题,
当前ArrayList集合中存储了两种类型的元素分别String和Integer类型,在遍历的时候,使用的是String接收的,对于Integer类型就出现了异常!
回想数组:
String[] str = new String[3] ;
str[0] = "hello" ;
str[1] = "world" ;
str[2] = 100 ; 错误的,

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

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

泛型的引出可以提供程序的安全性!

  1. 在早期的时候,使用Object类型代表任意类型,向上转型没有问题,
    使用向下转型的时候,可能会出现问题(需要的类型有问题),这个时候就需要引入泛型操作

    看API,接口,类,方法上有<E> ,都是泛型
    3.泛型高级(通配符)
    <?> :代表任意类型Object类型,或者任意的Java类
    <? extends E>:向下限定,E的子类或者E这个类型
    <? super E>:向上限定,E及其他的父类
    4.ArrayList是List接口中常用的一个子实现类

    遍历功能:
    1)一个是Collection的iterator()
    2)size()和get(int index)普通for循环
    5.Vector集合
    底层是一种可增长对象数组,查询快,增删慢
    线程安全,同步,执行效率高

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

    特有功能:
    添加功能
    addFirst(Object e):将指定的元素插入到列表的开头
    addLast(object e):将指定的元素添加到列表末尾
    获取功能:
    getFirst():获取列表第一个元素
    getLast():获取列表第二个元素

    删除功能
    public Object removeLast()
    7.需求:给集合中添加重复的元素(字符串类型),将重复的元素从集合去除掉!

    思路:
    1)创建一个旧集合,添加重复元素
    2)创建一个新集合
    3)遍历旧集合中的元素获取到每一个元素
    在旧集合中判断新集合中是否包含旧集合中的元素
    包含,不搭理
    不包含,添加到新集合中

    4)遍历新集合

public class ArrayListTest {

public static void main(String[] args) {

    //创建一个集合
    ArrayList list = new ArrayList() ;

    //添加元素
    list.add("hello") ;
    list.add("world") ;
    list.add("java") ;
    list.add("javaee") ;
    list.add("hello") ;
    list.add("world") ;
    list.add("hello") ;
    list.add("javaee") ;
    list.add("android") ;
    list.add("python") ;
    list.add("php") ;
    list.add("php") ;
        Iterator it2 = newList.iterator() ;
    while(it2.hasNext()) {
        String s = (String) it2.next() ;
        System.out.println(s);
    }
}

}
8.可变参数:当一个方法的参数个数不确定的时候,要使用可变参数

格式:
    修饰符 返回值类型  方法名(数据类型...变量名){...}

注意:
1)变量名:看成一个数组
2)使用的时候数据类型...
9.ArrayList集合存储自定义对象并遍历,有几种方式?
Iterator iterator() ;
listIterator listiterator();(可以不写)
普通for循环:size()/get(int index)
增强for循环
10.针对数组操作的工具类:Arrays,提供了一个方法:
public static <T> List<T> asList(T... a) :将数组转换成固定大小的集合

注意:如果使用此方法,那么集合的长度不可变

11.Jdk5以后的新特性:
增强for,静态导入,可变参数,泛型,自动拆装箱...
增强for循环的格式
for(数据大类型 变量名 : 数组或者集合对象名){
输出变量即可!
}

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

增强for循环的弊端:如果集合的对象是null,如果再次对集合操作,就会出现异常
对集合进行判断,非空判断解决

12.静态导入:Jdk5一个新特性
特点:
1)前提是该方法必须是静态的
2)导入到的一个方法的级别

静态导入的格式:
import static 包名.类名.方法名;

import static java.util.ArrayList.add; 方法必须是静态方法

常用类中哪个类中静态方法最多:Math

*之前导包:java.util.Scanner; 导入到类的级别


二:
1.Java针对这种技术----->Map集合 ,键值的映射关系的一种集合(接口)
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map<K,V> ,在Map集合中,只针对键有效,跟值无关 Map接口的子实现类:HashMap和TreeMap

面试题:
Map集合和Collection的区别?

    Map集合:是一种键和值的映射关系(双列集合)     当作为:夫妻对
    Collection集合:单列集合,只能存储一种类型的元素,当作为:光棍
间接关系:HashSet依赖于Map接口的子实现类HashMap的
       TreeSet依赖于Map接口的子实现类TreeMap的

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():判断映射关系是否为空
  1. Map集合的另一种方式的遍历 Set<Map.Entry<K,V>> entrySet() :和Map集合的遍历有关系(键值对对象)

    • 转发法: 1)获取所有的结婚证 2)通过结婚证分别找对应的丈夫和妻子 3)遍历输出
      3.Set集合和List集合的区别?
      Set集合:不允许元素重复,唯一的(元素可以为null) ,不能保证迭代的顺序恒久不变(底层哈希表和hascode)
      无序(存储和取出不一致)
      List:允许元素重复,并且存储特点:有序性(存储和取出一致)
      4.发现Set集合存储元素的时候,可以保证元素的唯一性,原因什么?

    看源码:
    @author Administrator

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

    String本身重写了equals方法,所以不需要再重写了!
    5.如果在开发中,元素唯一性,并且还要保证元素有序(存储和取出一致),使用LinkedHashSet集合

    如果开发中要使用集合排序的问题,使用TreeSet集合(红黑树结构),下午分解...
    自然排序
    选择器排序

LinkedHashSet集合:
底层是一种链接列表和哈希表组成
可以保证元素的唯一性,是由哈希表决定的(hashCode()和equals())
可以保证元素的迭代顺序一致(有序),存储和取出一致,是由链表决定
6.如果在开发中,元素唯一性,并且还要保证元素有序(存储和取出一致),使用LinkedHashSet集和
如果开发中要使用集合排序的问题,使用TreeSet集合(红黑树结构),下午分解...
自然排序
选择器排序
LinkedHashSet集合:
底层是一种链接列表和哈希表组成
可以保证元素的唯一性,是由哈希表决定的(hashCode()和equals())
可以保证元素的迭代顺序一致(有序),存储和取出一致,是由链表决定
7.TreeSet集合模拟情况下是通过自然顺序对集合中的元素排序

        TreeSet:
                可以保证元素唯一并且元素排序(Integer类型的元素自然升序)
                自然排序
                比较器排序

8.TreeSet集合的构造方式不同,使用的排序也不同
自然排序:自定义的类实现Compareable接口,然后创建TreeSet对象,通过无参构造形式创建对象
比较器排序 :public TreeSet(Comparator<E> comparator)

        两种方式:
            1)自定义一个类,该类实现Comparator接口,重写Comparator接口中的compare()方法
                2)直接使用接口匿名内部类的方式实现

猜你喜欢

转载自blog.51cto.com/13677893/2114718
5.5