一、 集合:
集合中存储的都是对象的引用(地址);
迭代器其实就是在集合中取出元素的方式。
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、多个异常的处理规则
接口不能抛出异常。
|
|