【容器的概念】

容器: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. createObjectURL方法 实现本地图片预览

    ie6 可以直接显示本本地路径的图片 如: <img src="file://c:/3.jpg" />  ~~~网上都说ie7就不支持这种文件系统路径的url,但测试 ...

  2. Delphi启动/停止Windows服务,启动类型修改为"自动"

    unit U_StartServices; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...

  3. docker学习笔记:修改无法启动的容器中的内容

    我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题.导致容器关闭后,无法启动. 这事需要重新修改配置文件. 正常情况下可以通过 docker exe ...

  4. 流行的Python项目汇总

    年有哪些流行的Python项目呢?下面,我们一起来看下. 一.测试和调试 python_koans :Python Koans 算 “Ruby Koans” 的一部分,作为交互式教程,可以学习 TDD ...

  5. configure.ac

    # # Copyright (C) - Tobias Brunner # Copyright (C) - Andreas Steffen # Copyright (C) - Martin Willi ...

  6. 解决 RichTextBox 文件格式不对问题

    RichTextBox文件格式不对: 原因:富文本框的LoadFile方法只支持RTF格式的文件或者标准的ASCII文本本档,,我们一般的文本文档是ANSI或者UTF-8的格式,所以,报这个错. 解决 ...

  7. Web端的Tab控件在切换Tab时Load数据出错的处理

    我们在应用Web端的Tab控件时,不管是Jquery easyui的还是Ext的Tab控件都会遇到一个问题,在Tab1正在加载数据的时候我们切换到Tab2,再切换回来,Load数据的控件就会出错,出错 ...

  8. HDOJ 2680 Dijkstra

    题目大意: 给你一个有向图,一个起点集合,一个终点,求最短路.... 解题思路: 1.自己多加一个超级源点,把起点集合连接到超级源点上,然后将起点与超级源点的集合的路径长度设为0,这样就称为一个n+1 ...

  9. c#与java中byte字节的区别及转换方法

    原文:c#与java中byte字节的区别及转换方法 在java中  byte的范围在 [-128,127] 在C#中  byte的范围在 [0,255] 所以 java程序与C#程序 进行数据传输的时 ...

  10. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    原文 Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件 第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Win ...