Collection

来源:互联网 发布:lol韩服账号淘宝 编辑:程序博客网 时间:2024/06/03 20:41
1.集合
概念:集合是一种可变长度的数组
    数据类型:必须是引用数据类型(JDK 1.5提供了自动拆装箱机制)

2.ArrayList的继承体系
public class ArrayList extends AbstractList implements List{}


                    Collection 接口     
                                   |
     ----------------------------------------------------------------
     |                                                              |
    List接口 (存取有序,有索引,能重複)                      Set接口(存取无序,無索引,不能重複)
     |                                                              |
 ----------------                                             -------------
 |              |                                             |            |
ArrayList类    LinkedList类                                 HashSet类     LinkedHashSet类(存取有序)


      /*
       * 学习Java中三种长度表现形式
       *   数组.length 属性  返回值 int
       *   字符串.length() 方法,返回值int
       *   集合.size()方法, 返回值int
       */


3.Collection接口的方法
Object[] toArray()将集合转换成数组


boolean contains(Object o)判断集合中是否有该对象


void clear() 清空集合中的所有元素(集合仍存在)


void remove(Object o)移除某个集中的某个对象

4.迭代器
概念:迭代器是用来遍历集合元素的接口
迭代器的定义:Iterator it = 集合名.iterator(); 未指定迭代器中的数据类型,it为Iterator类型,其引用指向,Iterator接口实现类的对象
如果需要使用对象中的非继承的特有属性,则需要进行类型转换
     Iterator<数据类型> it = 集合名.iterator();已指定迭代器中的数据类型,it为Iterator类型,其引用指向,Iterator接口实现类的对象
如果需要使用对象中的非继承的特有属性,不需要进行类型转换,直接调用


迭代器的方法:
hasNext(); 判断是否有下一个元素,其初始索引指向-1;


next(); 返回集中的下一个元素
    注意事项:
1)迭代器中能对集合的进行删,但衹能用it.remove();


5.增强for循环
来源:JDK1.5版本后,出现java.lang.Iterable接口,Collection继承Iterable,用于实现增强for循环
格式:
for(数据类型 对象名 : 集合名){


增强for循环,用于遍历集合的对象,其中可以使用,集合自身的方法,对集合进行删除操作
好处:简化了遍历的代码
坏处:无法获取索引


6.泛型
来源:JDK1.5版本后,出现了泛型,用于指定集合中存储的类型,增强程序的安全性
本质:JAVA中的泛型是伪泛型,只在编译时期起作用,编译后,自动去除泛型
好处:将运行时,ClassCastException异常,提前到了编译时期


泛型类:
class  类名<E>{
public <E> function_1( <E> e){}//泛型类中的定义的数据类型,限定了该方法的参数类型和返回值类型


public <W> T[] function_2( T[] w){}//该方法自己定义泛型,不受类泛型影响
}


创建泛型类对象
类名<E> 对象名 = new 类名<E>();




泛型的接口:
带有泛型的接口:
public interface<E> 接口名{
abstract void 方法名(<E> e);


接口的实现类:
1)
public class 类名<E> implements 接口名<E>{
}
该方法,在继承时不指定泛型的数据类型,数据类型在创建对象时由对象指定


2)
public class 类名 implements 接口名<E>{
public funciont (<String> s){}
}
该方法,在继承时直接在重写接口的方法时指定泛型的数据类型


泛型的通配符:
<?> 其中问号就是通配符,其可以代码任意数据类型


泛型的限定:
<? extends A> 限定的是父类,上限限定,其对象可以是A的对象或者A的子类对象
<? super A> 限定的是子类,下限限定,其对象可以是A的对象或者A的父类对象


7.List接口
特点:
1)存取有序
2)有索引
3)可重复


主要实现类:
ArrayList:
存储形式:底层是数组实现
   特点:
1)增加删除慢
2)查询快
LinkedList:
存储形式:链表
   特点:
1)增加删除块
2)查询慢


特有方法:
1)E removeFirst()删除第一个元素,并且返回值为删除的元素
2)E removeLast()删除最后一个元素,并且返回值为删除的元素


3) addFirst(E e)添加一个元素到起始索引
4) addLast(E e)添加一个元素到末尾索引


5)E getFirst()获得起始索引的值
6)E getLast() 获得末尾索引的值


方法:
特有方法:使用索引进行操作
1)void add(index i ,Object o)
2)Object remove(int index)//返回值是被删除的元素
3) Object set(int index,Object o)//返回值是被覆盖之前的元素
4) Object get(int index)//返回值是该索引的上的元素的值


其它方法:
1)void add(Object o)//添加元素
2)Object remove(Object o)//移除元素




8.迭代器的并发修改异常(ConcurrentModificationException)
异常产生原因:在使用迭代器迭代集合的时候,修改集合的长度


避免手段:
1)不在迭代器迭代过程中修改长度
2)使用ListIterator迭代器操作元素


9.数据的存储结构
1)栈:先进后出
2)队列:先进先出
3)链表:增删块,查询慢
4)数组:增删慢,查询快


10.Vector类
概念:是Java早期的集合,List集合由该类改进而来
特点:是同步的
功能:该类提供的枚举Enumeration作为取出方式,是早期的迭代器




11.Set集合
特点:
1)存取无序
2)不可重复
3)无索引


Hash表:
加载因子:
当集合中的存储的元素数量>Hash表数量*加载因子,集合就要扩容

注意点:
如果未重写hashCode()方法,则在添加过程中,可以重复添加值相同的对象,因为系统返回的HashCode每次不一致
如果未重写equals()方法,则比较的是地址值,地址值相同的对象,可能值不同


存储顺序:
1)先根据对象计算出hashCode码
2)在Set集合中查询是否存在该hashCode,如果不存在,则直接存入,若存在,则进行第三步
3)若使用equals方法,比较值是否相等,若不相等,则存入,若相等,则不存入


主要实现类:
HashSet
特点:
数据结构:采用哈希表(属于散列表,JAVA有8种数据结构,散列表是其中一种),数组与链表的结合体
存取数据均比较快
线程不安全


LinkedHashSet
特点:
数据结构:基于链表的哈希表
与List区别:
去重原理:Set集合在存储数据的时候会调用hashCode()和equals()方法进行重复元素判断


 A:hashCode和equals的面试题
 /*
  *   两个对象  Person  p1 p2
  *   问题: 如果两个对象的哈希值相同 p1.hashCode()==p2.hashCode()
  *        两个对象的equals一定返回true吗  p1.equals(p2) 一定是true吗
  *        正确答案:不一定
  *        
  *        如果两个对象的equals方法返回true,p1.equals(p2)==true
  *        两个对象的哈希值一定相同吗
  *        正确答案: 一定
  */  
原创粉丝点击