集合
-
Collection
(接口)继承于Iterable
(接口)拥有Iterator()(迭代方法), -
Iterator
(接口)迭代处理(所有来自于Collection的都能做迭代处理) -
Collection
分两支
List
(接口) 有序可重复,存取顺序一致
Set
(接口) 无序不重复,存取顺序不一致 -
List
分三支
ArrayList
(类) 随机的增加或删除效率低,查询效率高
LinkedList
(类) 随机的增肌或删除效率高,查询效率低
Vector
(类) 底层是数组实现的,在多线程环境下是安全的,是线程同步的,效率较低,现在很少使用了 -
Set
分两支HashSet
(类)HashSet
底层是HashMap
底层是哈希表
(很少用到)TreeSet(
类)实现SortedSet
(接口,无序不重复,存入元素可以按照元素的大小顺序自动排序)
TreeSet
(递归)TreeSet
底层是TreeMap
,TreeMap
底层是一个可排二叉树数据结构
Iterator中拥有hasNext();是否是最后一个元素判断
next();返回下一个元素(element/E)
remove();移除方法,
Map
(接口)Map
中的value如果都是null,那么Map
就是一个Set
集合
Map
集合以键值对的方式存储元素(key和value)key起主导作用,value 只是附属在key上,key是无序不可重复的
Map
分三支HashMap
(类)底层是哈希表,HashMap
的value如果都是null的话,其实就是个HashSet
集合,或者说HashSet
是HashMap
的key部分
TreeMap
(类) 实现SortedMap
(接口)底层是可排二叉树,key无序不可重复,但是存入的key可以按照元素的大小顺序自动排序
Properties
(类)继承并代替自HashTable
(类)
二叉树比较左面的比上面的小,右面的比上面的大
集合的主要功能是增删改查
for循环与while循环for循环时你知道循环次数,while时你不知道循环次数
Iterator 新对象= 对象.iterator();将对象迭代处理,这样新对象可以调用迭代的方法
大多数对象的定义方法为,父类 对象= new 子类();
数组的长度不可变,集合的长度是可变的,可以扩容的
集合里的类型都是Object(包括所有类型),引用类型
面向接口编程:对象.add(1)等同于 对象.add(new Integer(1))
对象.contains(key)判断对象中是否含有关键字,返回布尔类型
2. List集合
常用的方法
- add(Object) 添加元素
- get(index下标) 获取元素,只能获取元素,null站位不算
- size(); 获取集合中元素的个数
- indexOf(E元素); 根据元素获取相应的下标值
- clear(); 清除所有元素
- remove(index/E); 可按元素移除,可按下标移除(当元素的名称和下标的名称一致时,下标优先级较高)
- toArray(); Object[] 把集合转换成数组
- subList(index,index); 从该集合的第几位到第几位组成一个新的集合
- Arrays.asList(对象); 把一个可变类型转换成集合
可变参数:
长度类型可变的声明 type…parm(参数)
在参数中只能有一个,只能在最后一个参数使用
public static void main(String[] args) {
List lst = new ArrayList();
//初始化集合
for(int i=0;i<5;i++){
lst.add("java"+i);
}
//-----------使用for显示-------------------------------
//for(int i=0;i<lst.size();i++){
//System.out.println(lst.get(i));
//}
//-----------使用Iterator迭代模式显示-------------------------------
//Iterator it = lst.iterator();
//while(it.hasNext()){
//System.out.println(it.next());
//}
//-----------使用Iterator迭代模式显示----变形---------------------------
//for(Iterator it = lst.iterator();it.hasNext();){
//System.out.println(it.next());
//}
//-----------使用加强for显示-----相当于in-------------------------
for(Object obj:lst){//lst集合中的元素先赋值给obj参数,让它把值带出来
System.out.println(obj);
}
}
Collections.reverse(parm对象);倒序
3. Set集合
去掉重复值(底层是Map
实现)
- contains(); 判断元素是否存在,返回布尔类型
- isEmpty(); 判断是否为空
哈希表,提供快速的存取操作,哈希表示基于数组的,所以不能扩展
对象不相同哈希码也不同
HashSet
中的数据 是无序不重复的,HashSet
按照哈希算法存取的,当向其中插入数据时,他会调用对象的hashcode() 得到该对象的哈希码,然后根据哈希码计算出该对象插入到集合中的位置
自定义的引用类型,Set
去重,判断hashcode的同时,还要判断equals,所以两个方法必须同时重写,不同时重写无效
equals()为真时,哈希码一定要相同
覆盖hashCode方法
public int hashCode(){
return (name==null)?0:name.hashCode();
}
覆盖 equals方法
public boolean equals(Object obj){
if(this==obj){
return ture;
}
if(obj instanceof Person){
Person p=(Person)obj;
return this.name.equals(p.name);
}
return false;
}
Java 要求:
两个对象equals相等,那么他的hashcode相等
两个对象equals不相等,那么它的hashcode并不要求他不相等,但一般建议不相等
hashcode相等不代表两个对象相等(采用equals比较)
类型不同的元素之间不能排序
comparable接口
如果想对某个属性进行排序必须有comparable接口
自定义的类实现comparable接口并实现comparTo方法
覆盖方法:public int compareTo(Object o){
类名 对象=null;(局部变量初始化 )
if(o instanceof 类名){
对象=( 类名) o;
}
(升序) return this.要比较的属性方法 - 对象.要比较的属性方法
} }
compartor接口
不在类中实现comparable接口,而是在调用该方法的类时编译compartor方法
Comparable
和Comparator
的区别?
一个类实现了Comparable
接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator
可以看成一种算法的实现,将算法和数据分离,Comparator
也可以在下面两种环境下使用:
- 类的没有考虑到比较问题而没有实现
Comparable
,可以通过Comparator
来实现排序而不必改变对象本身 - 可以使用多种排序标准,比如升序、降序等
在Map
中,如果把自定义的类当做key两个方法必须重写
测试:
Source Folder源码测试包
自其中创建一个包,包内接JUnit,选中JUnit Test Case,加JUnit 文件
单元测试可以使用断言,this.assertEquals(对象,值);判断对象是否为该值时
测试:
6.1 开发流程:调研(获取用户的原始表单[保密协议])----设计–详细设计(页面、数据字典)–team(coding)[风险评估、质量管理]
----程序员:编码和单元测试—QA测试:用例测试、系统测试、压力测试—打包上线–售后—维护
----测试:白盒测试或黑盒测试
模板模式:(相同的放在一起,不相同的拿出来)
模板模式的接口是做参数来用的(接口的方法不能实现,否则没有意义)
模板模式代码格式
首先定义一个接口,接口中的方法不实现
在主方法中调用模板方法,模板方法参数为接口类型的对象,在接口参数中new 接口,并实现方法,而在模板中调用接口方法
执行顺序,先执行主方法参数,再执行模板,当遇到实现方法时,返回主方法参数中执行实现方法,执行完毕继续返回模板,执行调用实现方法下的方法,依次执行。
参考模板模式代码
JavaBean
(一个标准的Java类,有自己的属性,并且属性有getter.setter方法)
作用:可以做数据的载体
别名: VO:纯做数据载体
beans:有可能做数据载体,有可能不做数据载体
domain:放的都是bean文件
(不能乱起)entiey:在数据库中对应了某张表,才叫domain
pojo:除了bean外还有自己的业务处理方法
Map
接口
形式:键值对key/value
key不能重复,value可以重复
常用hashmap,
如果使用自定义类作为map的键对象,必须重写equals和hashcode
Map
方法:
- clear(); 清空
- containsKey(key); 判断是否存在key
- containsValue(value); 判断是否存在value
- entrySet(); 转换为Set集合
- equals();
- get(Object key); 根据key获取对应的value
- hashcode();
- isEmpty(); 判断是否为空
- keySet(); 获取所有的key值,返回set集合
- values(); 获取所有的value值
- put(key,value); 添加map集合
- remove(key); 根据key移除指定的元素
- size(); 获取键值对(k-v)的数量,返回Collection
Entry,
拓展 --> 泛型
标准定义泛型
类名<类型> lst=new 类名<类型(新版本可省略)>();
泛型可以嵌套
可以使用泛醒来改善自定义比较器
自定义泛型
泛型可以不确定,当使用时再明确类型
不确定的泛型名称可以不是T,只要符合标识符命名就行,T为规范