黑马程序员技术交流社区

标题: Java笔记---集合 [打印本页]

作者: 创造命运    时间: 2013-9-4 10:39
标题: Java笔记---集合
一、 集合:
集合中存储的都是对象的引用(地址);
迭代器其实就是在集合中取出元素的方式。
List结构的集合类:ArrayList类、LinkedList类、Vector类、Stack类
  E:\JAVA\MyJavaDemo\BiXiangDong\14day\ArrayList11或者10
Map结构的集合类: HashMap类、Hashtable类
Set结构的集合类: HashSet类、TreeSet类
  E:\JAVA\MyJavaDemo\BiXiangDong\14day\HashSet
Queue结构的集合类:Queue接口
List类:元素是有序的,元素可以重复。因为该集合体系有索引。
  List集合判断元素是否相同,依据的是元素的equals方法
  ArrayList:底层的数据结构使用的是数组结构。  特点:查询速度很快,但是增删稍慢。  线程不同步
  LinkedList:底层的数据结构使用的链表结构。  特点:增删很快,但查询稍慢
  Vector: 底层是数组数据结构。线程同步,被ArrayList替代了。
Map类:|--Hashtable:底层是哈希表,不可以存入null键和null值。 线程同步,效率低
        |--HashMap:底层是哈希表,允许使用null键和null值。 线程不同步,效率高
        |--TreeMap:底层是二叉树,线程不同步。可以用于给Map集合中的键进行排序。
Set类:元素是无序的(存入的取出的顺序不一定一致),元素不能重复
     HashSet:底层数据结构是哈希表。
      HashSet是如何保证元素的唯一性呢?
      是通过元素的俩个方法,hashCode和equals来完成。
      如果元素的hashCode值相同,才会判断equals是否为ture。
      如果元素的hashCode值不同,不会调用equals。
      开发时一般都要复写hashCode方法和equals方法
  对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode方法和equals方法
     TreeSet:可以对Set集合中的元素进行排序。
       底层数据结构是二叉树
       保证元素唯一性的依据是compareTo方法return 0。
       TreeSet排序的第一种方法:让元素自身具备比较性元素需要实现comparable接口,覆盖
           compareTo方法。这种方法也称为元素的自然顺序
       TreeSet排序的第二种方法:当元素自身不具备比较性时,或者具备的比较性不是所需要的
           这时就需要要集合自身具备比较性。
           定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
      
     Set集合的功能和Collection是一致的。
List类特有方法:凡是可以操作角标的方法都是该体系特有的方法。
  增:add(index, element);
      addAll(index, Collection);
  删:remove(index);
  改:set(index, element);
  查:get(index);
      sublist(from, to);
      listIterator();
      int indexOf(obj);获取指定元素的位置
      ListIterator listIterator();
LinkedList特有的方法:
  addFirst();
  addLast();
  getFirst();
  getLast();
  获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementExecption
  removeFirst();
  removeLast();
  获取元素,而且删除元素。如果集合中没有元素,会出现NoSuchElementExecption
     LinkedList特有的方法在JDK1.6出现了替代方法:
  offerFirst();
  offerLast();
  peekFirst();
  peekLast();
  获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementExecption
  pollFirst();
  pollLast();
  获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementExecption
     
ArrayList和Vector的区别:
  1、同步性:Vector是同步的,这个类中的一些方法保证了Vector中的对象是线程安全的,而ArrayList则是
     异步的,其中的对象不是线程安全的
  2、数据增长:Vector缺省下自动增长原来的一倍的数组长度,ArrayList是原来的50%,所以最后所获得的
     这个集合所占的空间总是比实际需要的大。
HashMap和Hashtable的区别:
  1、同步性:Hashtable是同步的,线程安全的;HashMap是异步的,不是线程安全的
  2、HashMap可以将控制作为一个表的条目的key或value,但是Hashtable是不能放入空值的(null)
     经验:
  1、如果要求线程安全,使用Vector或Hashtable;
  2、如果不要求线程安全,使用ArrayList或LinkedList或HashMap
  3、如果要求键值对,则使用HashMap或Hashtable;
  4、如果数据量很大,又要线程安全则考虑Vector。
薪资管理系统
小球加挡板的游戏(数组的应用)

    Collections类:专门用于对集合进行操作的工具类
    Arrays工具类:用于操作数组的工具类
    Example: E:\JAVA\MyJavaDemo\BiXiangDong\17day

    可变参数:
其实就是一种数组参数的简写形式,不用每一次都手动的建立数组对象,只要将要操作的元素作为参数传递即可
隐式的将这些参数封装成了数组
可变参数一定要定义在参数列表的最后面
     静态导入:
可以减少书写
import java.util.*;   导入的是util包下面的所有的类
import static java.util.Arrays.*;  导入的是Arrays这个类下面的所有静态成员
当类名重名时,需要指定具体的包名
当方法重名时,需要指定所属的对象或者类。

二、泛型的基本概念
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的
创建中,分别称为泛型类、泛型接口、泛型方法。
泛型的好处:1、简单安全
    2、在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率
泛型的优点:类型安全
  向后兼容
  层次清晰
  性能较高,用GJ(泛型JAVA)编写的代码可以为JAVA编译器和虚拟机带来更多的类型信息,这些信息对JAVA
      程序做进一步优化提供条件。
  可以用不确定的类型代表任意类型,通过反射机制可以提高代码重用率
黑马(毕向东):
泛型: JDK1.5版本以后出现,为了解决安全问题,是一个安全机制
好处:1、将运行时期出现的问题ClassCastExecption,转移到了编译时期,方便程序员解决问题。
  让运行时期问题减少,安全。
       2、避免了强制转换的麻烦
泛型格式:通过<>来定义要操作的引用数据类型。
泛型通常在集合框架中很常见,只要见到<>就要定义泛型,<>就是用来接收类型的
泛型类、泛型方法、静态泛型方法、泛型接口、泛型限定  
example:  E:\JAVA\MyJavaDemo\BiXiangDong\15day\Generic泛型
张孝祥 --> 高新技术 --> 视频37
  泛型的实例类型只能是引用类型,不能是基本数据类型    <  高新技术->视频->40  >
  泛型是给编译器看的。
  ArrayList<E>类定义和ArrayList<Integer>类引用中涉及的术语:
   整个称为ArrayList<E>泛型类型
   ArrayList<E>中的E称为类型变量或类型参数
   整个ArrayList<Integer>称为参数化的类型
   ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
   ArrayList<Integer>中的<>念着typeof
   ArrayList称为原始类型
  参数化类型与原始类型的兼容性:
   参数化类型可以引用一个原始类型的对象,编译报告警告
    Collection<String> c = new Vertor();
   原始类型可以引用一个参数化类型的对象,编译报告警告
    Collection c = new Vector<String>();
  参数化类型不考虑类型参数的继承关系:
   Vector<String> v = new Vector<Objcet>();   //错误
   Vector<Object> v = new Vector<String>();   //错误
  在创建数组实例时,数组的元素不能使用参数化的类型
  泛型中的?通配符
   限定通配符的上边界:
    Vector<? extends Number> x = new Vector<Integer>();
   限定通配符的下边界:
    Vector<? super Integer> x = new Vector<Number>();
   限定通配符总是包括自己
      
三、异常------基本概念
当出现程序无法控制的外部环境问题(用户提供文件不存在,文件内容损坏,网络不可用……)时,JAVA就会用异常对
象来描述

JAVA中用2种方法处理异常:
  1、在发生异常的地方直接处理,try...catch(....finally)
  2、将异常抛给调用者,让调用者来处理。throws(抛出)
异常分类:
  1、检查性异常:java.lang.Execption
   程序正确,但外部的环境条件不满足
  2、运行期异常:java.lang.RuntimeExecpton
   程序存在bug,如数组越界,0被除等
  3、错误:java.lang.Error
   环境问题,如内存耗尽等
  顶层异常是java.lang.Throwable类,以上三者都是他的子孙类
异常处理:
  1、try....catch
  2、finally
   将finally放在try...catch..语句后面,finally一般都会得到执行,相当于一个万能的保险,
   即使前面的try块发生异常,而又没有对应的异常的Catch块,finally将马上执行
  以下情形finally将不会被执行:
   1、finally块中发生了异常;
   2、程序所在线程死亡;
   3、在前面的代码中调用了System.exit();
   4、关闭CPU
  3、多个异常的处理规则
      
接口不能抛出异常。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2