Java集合类

集合概念及API

集合:Java API提供一系列类的实例,可以用于动态存放多个对象
JDK所提供的集合API位于Java.util包内。
Java Collection Framework图:Java Collection Framework图

集合的API

Collection接口定义了存取对象的方法。两个重要的接口
Set接口:存放的元素不包含重复的集合接口(无序)
List接口:存放元素有序且允许有重复集合接口
元素:对象、实例
重复:两个对象通过equals相等
有序:元素存入的顺序与取出的顺序相同
Map接口:定义了存储“键(key)—值(value)映射对”的方法。

Collection接口

定义了存取对象的方法
—int size(); 返回此collection中的元素数;
—boolean add(Object element); //想此collection中添加元素
—boolean remove(Object element); //从此element中添加元素
itetator iterator(); //返回在此collection的元素上进行迭代的迭代器
无论是什么都向上转型变成Object!
这里写图片描述

Iterator迭代器接口

所有实现了Collection接口的集合类都有一个iterator()方法用以返回一个实现了iterator接口的对象(称作迭代器)。用以方便的实现对集合内元素的遍历操作。
iterator接口中定义了如下方法:
—boolean hashNext(); //判断游标右边是否有元素
—Object next(); //返回游标右边的元素值并移到下一个位置
—void remove(); //删除游标左面的元素 (不确定右边是否有)

用for-each遍历Collection

Set接口

set接口没有提供除collection接口以外额外的方法,集合中元素不可重复。
JDK API中所提供集合类常用的有:

Set接口存放对象的原理

取对象时

——根据每个对象的哈希码值(调用hashCode();)算出存储索引,根据固定的算法,算出该对象在散列表中的位置(表元);
——如果对应的位置没有其他元素,就直接存入;
——如果该位置有元素了,会将新对象跟该位置的所有对象进行比较(调用equals();),查看该对象是否已经存在,不存在就存入。存在则直接使用。

存对象时

——根据对象的哈希码值计算出它的存储索引,在散列表的相应位置上的元素间进行少量比较就可以找到。

set接口存、取、删对象都有很高的效率

对于要存放到set集合中的对象,对应类一定要重写equal()和hashCode(Object)方法以实现对象相等规则。

Set实现类

HashSet

完全继承了Set,完全继承了Collection接口。
对数据存取效率比较高

Set存放自定义类

需重写自定义类的的HashCode()和equals()方法。

TreeSet

要求放入的元素必须是可排序的,

LinkedHashSet.

特点:
a)它是HashSet的子类
b)它可以记录元素添加的顺序,通过产生哈希码值的顺序进行记录。
c)对数据的插入、修改和删除效率高

List接口

1)实现List接口类中的元素是有序的,且允许重复。
2)List集合中的元素对应一个整数的序号记载其在集合的位置,可以根据序号存取集合中的元素。
List接口比Collection接口中新增的几个实用方法:
public Object get(int index);返回列表中的元素
public Object add(int index,Object element);在指定位置插入元素
public Object set(int index,Object element);退换指定位置的元素
public Object remove(int index);移除指定位置的元素
public ListIterator listiterator( );返回此列表元素的列表迭代器

ArrayList接口

原理:
ArrayList底层是通过一个动态数组实现的,可以根据元素的个数自动的扩大和缩小。
优点:
对于使用索引取出元素有较好的效率,使用索引来快速定位对象。
缺点:元素做插入或删除速度较慢。因为使用了数组,需要移动后面元素调整索引顺序。

LinkList接口

使用双向链表实现的集合,新增一些插入、删除的方法。
优点:
对频繁的插入或删除元素有较好的效率。适合实现栈和队列。

Vector类

原理:
Vector底层实际上也是通过一个动态数组来实现的
特点:
a)大多数操作和ArrayList相同
b)Vector线程安全的,ArrayList是线程不安全。
c)可以将集合转换成枚举类型

Map接口

Map存放数据以“键—值”映射对。
原理:
1)Map实现类中映射存储是通过键来唯一表示,map底层的“键”是用Set来存放的。
2)所以存入Map中的映射对的“键”对应的类必须冲洗hashCode()和equals()方法。
——String作为Map的键
——HashMap
使用频繁的类,检索效率高!
存放数据时是无序的
——LinkedHashMap
是HashMap的子类,对数据的插入和删除效率比较高!
记录元素加入hash码值的顺序。
——Hashtable下的properties
线程安全。不允许null作为键—值
Properties类表示了一个持久的属性集:Properties可保存在流中或从流中加载。属性集中每个键对应值都是一个字符串。
不使用put方法而使用setProperty(String key, String value)方法,因为存放的“键—值”也用getProperty(String key)。
不支持泛型操作。
从属性文件中得到的都是字符串。

从流中读取文件的过程

step1:通过IO流读取属性文件
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(“config.properties”);
step2:把InputStream对象加载到Properties对象中
Properties p = new Properties();
p.load(is);
step3:通过get方法获取内容

对象排序和排序集合

Comparable接口、comparator接口

Collection类

java.util.Collections集合类是操作集合的工具类,提供了一些静态方法实现了集合的一些常用算法。
void sort (List list);升序排序
void shuffle(List list);随机排序
void reverse(List list);反转
void copy (List dest ,List src);将src复制到dest中
List synchronizedList(List list);支持同步(线程安全)

范性

装入集合的数据都会被当Object来存放,从而失去了自己的实际类型。这就是为什么取出时要向下转型。

JDK5.0泛型

作用:
1)JVM编译器在检查泛型时可以通过,经运行异常转为编译异常。
2)解决模板编程问题,能够使用泛型开发出更加通用的类。
在定义一个集合时就指定集合存储的对象的数据类型如:
Set,List集合:
集合名称<数据类型> 对象名称 =new 集合名词 <数据类型>();
Map集合:
集合名词

JDK7.0

第一种作用:

            消除类型转换

第二种作用:

            自动进行装箱和拆箱

第三种作用:

            限制泛型中参数类型的范围
                     1 ) < ?>任何类型都可以调用
                     2)<? extends 类名>只允许当前类以及子类调用      
                     3)<? super 类名>只允许当前类以及父类调用  
                     4)<? extends 接口>只允许实现当前接口的类的调用      
    collection<String>  coll=new Arraylist<String>();

从集合中取出元素,无需转型。
优点:简化集合的使用、增强代码的可读性。
使用泛型使当前的方法和类型通用。
相当于在Object中声明要使用这个类型。使用时,自动变为声明的类型。

第四种作用:

方法的泛型:
         public static <T> void method (list<T> list){
            for(T t:list){
                    System.out.println(t); 
                    }
            }
    ——<T>:允许所有的泛型调用,允许任何类型的方法调用
    ——<T extends 类名>:只允许泛型为当前类及当前类的子类调用
    ——<T extends 接口>:表示继承了当前接口的参数进行调用
    ——<T extends  类名&接口>:表示继承了当前类又实现了当前接口参数进行调用。

第五种作用

getClass,返回Object运行时的当前类。
类的泛型:
语法:
【访问修饰符】 class 类型 <泛型类型>{}
泛型类:其中方法也是泛型方法。
注意:1)在泛型类中,不能生成泛型对象。(当有接口时不能成功)
2)静态方法中不能使用泛型。Java在编译时,必须制定具体的数据类型。静态方法初始化时,由于不能知道T的类型,所以JVM不能确定数据类型,无法分配空间。
3)catch,中不能使用泛型。无法确定异常类型。
作用:做好底层的封装,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值