【容器的概念】

容器:Java API所提供的一系列的实例,用于在程序中存放对象。

【容器 API】

J2SDK所提供的容器API位于java.util包内。

{Collection[Set(HashSet,LinkedList),SrrayList]}{Map[HashMap]}

Collection接口--定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。

Set中的数据对象没有顺序且不可反复

  List中的数据对象有顺序且可反复

Map接口定义了存储“键(key)-值(value)映射对”的方法。

【Collection接口】

Collection接口中所定义的方法:

int size();

boolean isEmpty();

void clear();

boolean contains(Object element);

boolean add(Object element);

boolean remove(Object element);

Iterator iterator();

boolean containsAll(Collection c);

boolean addAll(Collection c);

boolean removeAll(Collection c);

boolean retainAll(Collection c);

Object[] toArray();

容器类对象在调用remove、contains等方法时须要比較对象是否相等,这会涉及到对象类型的equals方法和hashCode方法。对于自己定义的类型,须要重写equals和hashCode方法以实现自己定义的对象相等规则。

  注意:相等的对象应该具有相等的hash codes。

添加Name类的equals和hashCode方法例如以下:

public boolean equals(Object obj) {
if(obj instanceof Name) {
Name name = (Name) obj;
return (firstName.equals(name.firstName))
&& (lastNmae.equals(name.lastName));
}
return super.equals(obj);
}
public int hashCode() {
return firstName.hashCode();
}

【Iterator接口】

全部实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。

Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。

Iterator接口定义了例如以下方法:

boolean hasNext(); //推断游标右边是否有元素

Object next(); //返回游标右边的元素并将游标移动到下一个位置

void ermove(); //删除游标左面的元素。在运行完next之后该操作仅仅能运行一次

Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。

【JDK1.5增强的for循环】

实例:

import java.util.*;
public class EnhancedFor {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for(int i:arr) {
System.out.println(i);
} Collection<String> c = new ArrayList<String>();
c.add(new String("aaa"));
c.add(new String("bbb"));
c.add(new String("ccc"));
for(Object o : c) {
System.out.println(o);
}
}
}

注:Java1.5之后使用了泛型。(如<String>规定了容器存放元素类型)

增强的for循环对于遍历array或Collection的时候相当简便

缺陷:

  数组:

    不能方便的訪问下标值

  集合:

    与使用Iterator相比,不能方便的删除集合中的内容

    在内部也是调用Iterator

总结:除了简单遍历并读出当中的内容外,不建议使用增强for

【Set接口】

Set接口是Collection的子接口。Set接口没有提供额外的方法。但实现Set接口的容器类中的元素是没有顺序的。并且不能够反复。

Set容器能够与数学中“集合”的概念相相应。

J2SDK API中 所提供的Set容器类有HashSet,TreeSet等。

【Set方法举例】

import java.util.*;
public class Test {
public static void main(String[] args) {
Set<String> s1 = new HashSet<String>();
Set<String> s2 = new HashSet<String>();
s1.add("a");s1.add("b");s1.add("c");
s2.add("d");s2.add("a");s2.add("b");
//Set和List容器类都具有Constructor(Collection c)
//构造方法用于初始化容器类
Set<String> sn = new HashSet<String>(s1);
sn.retainAll(s2);
Set<String> su = new HashSet<String>(s1);
su.addAll(s2);
System.out.println(sn);
System.out.println(su);
}
}

【List接口】

List接口是Collection的子接口。实现List接口的容器类中的元素有顺序的,并且能够反复。

List容器中的元素都相应一个整数型的序号记载其在容器中的位置。能够依据序号存取容器中的元素。

J2SDK所提供的List容器类有ArrayList,LinkedList等。

Object get(int index);

Object set(int index,Object element);

void add(int index,Object element);

Object remove(int index);

int indexOf(Object o);

int lastIndexOf(Object o);

【List经常使用算法】

类java.util.Collections提供了一些静态方法实现了基于List容器的一些经常使用算法。

void sort(List) 对List容器内的元素排序

void shuffle(List) 对List容器内的对象进行随机排序

void fill(List,Object) 用一个特定的对象重写整个List容器

void copy(List dest,List src) 将src List容器内容复制到dest List容器

int binarySearch(List,Object) 对于顺序的List容器,採用这般查找的方法查找特定对象

【List经常使用算法举例】

import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> l1 = new LinkedList<String>();
List<String> l2 = new LinkedList<String>();
for(int i=0;i<=9;i++) { l1.add("a"+i); }
System.out.println(l1);
Collections.shuffle(l1); //随机排序
System.out.println(l1);
Collections.reverse(l1); //逆序
System.out.println(l1);
Collections.sort(l1); //排序
System.out.println(l1);
System.out.println(Collections.binarySearch(l1,"a5")); //折半查找
}
}

【Comparable接口】

问题:上面的算法依据什么确定容器中对象的“大小”顺序?

全部能够“排序”的类都实现了java.lang.Comparable接口,Comparable接口中仅仅有一个方法

public int CompareTo(Object obj); 该方法:

 返回 0 表示 this == obj

 返回正数表示 this > obj

 返回负数表示 this < obj

实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式。

【怎样选择数据结构】

衡量标准:读的效率和改的效率

  Array度快盖满

  Linked该快杜曼

  Hash两者之间

【Map接口】

实现Map接口的类用来存储 键-值 对。

Map接口的实现类有HashMap和TreeMap等。

Map类中存储的 键-值 对通过建来标识,所以键值不能反复。

Object put(Object key,Object value);

Object get(Object key);

Object remove(Object key);

boolean containsKey(Object key);

boolean containsValue(Object value);

int size();

boolean isEmpty();

void putAll(Map t);

void clear();

【Map方法举例】

import java.util.*;
public class Test {
public static void main(String[] args) {
Map<String,Integer> m1 = new HashMap<String,Integer>();
Map<String,Integer> m2 = new TreeMap<String,Integer>();
m1.put("one" , new Integer(1));
m1.put("two" , new Integer(2));
m1.put("three" , new Integer(3));
m1.put("A" , new Integer(1));
m2.put("B" , new Integer(2));
System.out.println(m1.size());
System.out.println(m1.containsKey("one"));
System.out.println(m2.containsValue(new Integer(1)));
if(m1.containsKey("two")) {
int i = ((Integer)m1.get("two")).intValue();
System.out.println(i);
}
Map<String,Integer> m3 = new HashMap<String,Integer>(m1);
m3.putAll(m2);
System.out.println(m3);
}
}

【Auto-boxing/unboxing】

在合适的时机自己主动打包、捷豹

  自己主动将基础类型转换为对象

  自己主动将对象转换为基础类型

【JDK1.5泛型】

起因:

  JDK1.4曾经类型不明白:

    装入集合的类型都被当做Object对待。从而失去自己的实际类型。

从集合中取出时往往须要转型,效率低,easy产生错误。

解决的方法:

  在定义集合的时候同一时候定义集合中对象的类型

    能够再定义Collection的时候指定

    也能够在循环时用iterator指定

优点:增强程序的可读性和稳定性。

【总结】

一个图;一个类Collections;三个知识点for,Generic,Auto-boxing/unboxing;六个接口

Java总结之容器的更多相关文章

  1. Java多线程-并发容器

    Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...

  2. 转:java多线程--同步容器

    java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...

  3. java中的容器问题

    小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...

  4. java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类

    本文关键词: java集合框架  框架设计理念  容器 继承层级结构 继承图 集合框架中的抽象类  主要的实现类 实现类特性   集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...

  5. Java复习 之容器

    小生快要准备找工作了 现在开始复习一下Java基础之容器 Set和List是一个个往里面存 Map是两个两个往里面装 所谓重复指的是他们互相equals Collection 接口定义了存取一组对象的 ...

  6. java 从spring容器中获取注入的bean对象

      java 从spring容器中获取注入的bean对象 CreateTime--2018年6月1日10点22分 Author:Marydon 1.使用场景 控制层调用业务层时,控制层需要拿到业务层在 ...

  7. Java中的容器和注入分析

    为什么会出现容器的注入? 容器:顾名思义,装东西的器物. 至于spring中bean,aop,ioc等一些都只是实现的方式:具体容器哪些值得我们借鉴,我个人觉得是封装的思想.将你一个独立的系统功能放到 ...

  8. Java并发--同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...

  9. Java进阶06 容器

    Java中有一些对象被称为容器(container).容器中可以包含多个对象,每个对象称为容器中的一个元素.容器是用对象封装的数据结构(data structure). 充满梦想的容器 不同的数据结构 ...

  10. Java中的容器(集合)之ArrayList源码解析

    1.ArrayList源码解析 源码解析: 如下源码来自JDK8(如需查看ArrayList扩容源码解析请跳转至<Java中的容器(集合)>第十条):. package java.util ...

随机推荐

  1. MessageBox不能前置显示的问题

    在MFC的开发中,经常会遇到一些莫名奇妙的问题,可能是经验不足的原因吧. 进入正题....在手头的项目中,用MFC做的界面应用.在某一天突然发现程序界面不能进行响应,经过反复的调试后发现:Messag ...

  2. 为centos添加第三方源

    默认centos自带的源少了很多好软件,所以需要添加第三方源一.安装CentOS yum源优先级插件yum-prioritiesyum install yum-plugin-priorities.no ...

  3. OpenRisc-31-关于在设计具有DMA功能的ipcore时的虚实地址转换问题的分析与解决

    引言 之前,我们在讨论基于ORPSoC的ipcore设计时提到过DMA的问题,当时我们实现DMA的功能时,访问的是local memory,并没有使用主存(即外部的SDRAM),使用的是本地的一块存储 ...

  4. CSS - 解决使用浮动,父窗体不能撑高问题

    浮动的父级元素一定要用 clear 清除浮动,否则高度会无法撑开.

  5. 高级UIKit-03(NSFileManager、NSFileHandle)

    fileManager文件管理器 [day04_1_FileManager_Search] :查找文件 fileManager有一个方法可以判断文件是否是文件夹, fileExistsAtPath:i ...

  6. 基于visual Studio2013解决C语言竞赛题之0705矩阵转置

     题目 解决代码及点评 /* 5. 写一函数,将一个3×3的矩阵转置. */ #include <stdio.h> #include <stdlib.h> void mai ...

  7. 项目优化经验分享(六)SVN冲突和处理

    上一篇博客我们分享了新增需求的确定思想<站在全局看问题>.今天我们来分享项目开发中SVN冲突的解决经验:SVN冲突和处理! 引言 开发过项目的人都知道,公司开发一个项目都会使用到版本号控制 ...

  8. Ubuntu 挂载ISO文件的方法

    1.在终端中输入:sudo mkdir /media/iso 在/media下生成一个iso文件夹用来挂载iso文件2.然后输入:sudo mount -o loop /home/X/X/XXXX.i ...

  9. TangoWalk小组课程与优惠(20131208更新) | TangoWalk 学跳阿根廷探戈舞

    TangoWalk小组课程与优惠(20131208更新) | TangoWalk 学跳阿根廷探戈舞 TangoWalk小组课程与优惠(20131208更新) Posted by redsky on 2 ...

  10. Study notes for Latent Dirichlet Allocation

    1. Topic Models Topic models are based upon the idea that documents are mixtures of topics, where a ...