学习笔记之集合

集合

  • Collection(接口)继承于Iterable(接口)拥有Iterator()(迭代方法),

  • Iterator(接口)迭代处理(所有来自于Collection的都能做迭代处理)

  • Collection分两支
    List(接口) 有序可重复,存取顺序一致
    Set(接口) 无序不重复,存取顺序不一致

  • List 分三支
    ArrayList(类) 随机的增加或删除效率低,查询效率高
    LinkedList(类) 随机的增肌或删除效率高,查询效率低
    Vector(类) 底层是数组实现的,在多线程环境下是安全的,是线程同步的,效率较低,现在很少使用了

  • Set分两支 HashSet(类) HashSet底层是HashMap底层是哈希表
    (很少用到)TreeSet(类)实现SortedSet(接口,无序不重复,存入元素可以按照元素的大小顺序自动排序)
    TreeSet(递归) TreeSet底层是TreeMapTreeMap底层是一个可排二叉树数据结构
    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集合,或者说HashSetHashMap的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方法

ComparableComparator的区别?
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

  1. 类的没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
  2. 可以使用多种排序标准,比如升序、降序等

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为规范

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值