JDK所提供的容器都在java.util包里面,下面开始讨论的都是JDK1.4版本的,只讲述基本知识,不涉及泛型

容器API的类图结构如下图所示

Set:元素无顺序且不可重复      List:元素有顺序且可以重复

所谓的重复,值得是两个元素equals

Collection接口中所定义的方法:

package com.collectiontest.demo;

public class Name {

    private String fistname,lastname;

    public String getFistname() {
return fistname;
} public String getLastname() {
return lastname;
} public Name(String fistname, String lastname) {
this.fistname = fistname;
this.lastname = lastname;
} @Override
public String toString() {
return "fistname"+" "+"lastname";
} }

定义一个Name类

package com.collectiontest.demo;

import java.util.ArrayList;
import java.util.Collection; public class BasicContainer { /**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
// TODO 自动生成的方法存根 @SuppressWarnings("rawtypes")
Collection c=new ArrayList();
c.add("hello");
c.add(new Name("f1", "f2"));
c.add(new Integer(100));
c.remove("hello");
c.remove(new Integer(100));
System.out.println(c.remove(new Name("f1", "f2")));
System.out.println(c);
} }

Main方法

容器的remove方法移除的也是能够equals成功的对象,在Main()方法的前两个remove操作中,String类和Integer类都已经覆写了Object类的equals方法了,所以可以移除成功并且返回True,而Name类默认继承Object类,也就继承了它的equals方法,Object的这个方法和“==”是一样,表示指向的是同一个对象,所以移除Name类会返回false

注:两个对象如果equals,那么他们的hascode()返回值应该也是相同的,容器类对象在调用remove、contains等方法时需要比较对象是否相等,这会涉及到对象类型的equals方法和hascode方法,对于自定义的类,需要重写equals和hascode方法以实现自定义的对象相等规则,一般比较对象的时候主要用的eqauls,当用Map接口的容器类时,如果对象作为键,那么就用的是hascode方法,因为这个效率更高,比如两个对象已经equals了,那么hascode方法就只需要返回某个字段的父类的hascode方法值就可以了

package com.collectiontest.demo;

public class Name {

    private String fistname,lastname;

    public String getFistname() {
return fistname;
} public String getLastname() {
return lastname;
} public Name(String fistname, String lastname) {
this.fistname = fistname;
this.lastname = lastname;
} @Override
public String toString() {
return "fistname"+" "+"lastname";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((fistname == null) ? 0 : fistname.hashCode());
result = prime * result
+ ((lastname == null) ? 0 : lastname.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Name other = (Name) obj;
if (fistname == null) {
if (other.fistname != null)
return false;
} else if (!fistname.equals(other.fistname))
return false;
if (lastname == null) {
if (other.lastname != null)
return false;
} else if (!lastname.equals(other.lastname))
return false;
return true;
} }

重写equals方法和hascode方法后的Name类

Iterator接口

package com.collectiontest.demo;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class BasicContainer { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根 @SuppressWarnings("rawtypes")
Collection c=new HashSet();
c.add(new Name("f1", "l1"));
c.add(new Name("f2", "l2"));
c.add(new Name("f3", "l3"));
c.add(new Name("f4", "l4"));
Iterator i=c.iterator();
while (i.hasNext()) {
//next()返回值为object类型,需要转换为相应类型,1.5之后有泛型
Name n=(Name)i.next();
System.out.println(n.getFistname()+" ");
}
} }

用iterator迭代元素

再来看一个删除元素的例子

package com.collectiontest.demo;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator; public class BasicContainer { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根 @SuppressWarnings("rawtypes")
Collection c=new HashSet();
c.add(new Name("f1", "l1"));
c.add(new Name("f2", "l2"));
c.add(new Name("f3", "l3"));
c.add(new Name("f4", "l4"));
Iterator i=c.iterator();
for (Iterator iterator = c.iterator(); iterator.hasNext();) {
Name name = (Name) iterator.next();
if(name.getFistname()=="f1")
{
iterator.remove(); //name的remove方法会将该元素锁定
//如果换成c.remove(name); 会产生例外
} }
} }

用iterator删除元素

Set接口

Set接口是Collection接口的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复

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

package com.collectiontest.demo;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; public class BasicContainer { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set s=new HashSet();
s.add("hello");
s.add(new Name("f1", "l1"));
s.add("hello"); //不会添加进去
System.out.println(s);
} }

添加元素并且遍历

package com.collectiontest.demo;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; public class BasicContainer { /**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Set s1=new HashSet();
Set s2=new HashSet();
s1.add("a");s1.add("b");s1.add("c");
s2.add("d");s2.add("b");s2.add("a");
//set和list容器类都具有Constructor(Collection c)构造方法用以初始化容器类
Set sn=new HashSet(s1);
sn.retainAll(s2);
Set su=new HashSet(s1);
su.addAll(s2);
System.out.println(sn);
System.out.println(su);
} }

set的另外一些方法

List接口

List接口是Collection接口的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复

List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

J2SDK API中所提供的Set容器类有ArrayList,LinkedList等,接口中的方法(当然,这是JDK1.4的版本)如下图

List常用算法:类Java.util.Collection提供了一些静态方法实现了基于List容器的一些常用算法

Comparable接口

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

所有可以“排序”的类都实现了java.lang.Comparable接口,Compare接口中只有一个方法

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

返回0表示 this==obj

返回正数表示 this>obj

返回负数表示 this<obj

实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式,比如我们在之前的Name类中实现该方法

    public int compareTo(Object object)
{
//先比较姓,如果姓一样就比较名
Name n=Name(object);
int lastcmp=lastname.compareTo(n.lastname);
return (lastcmp!=0)?lastcmp:fistname.compareTo(n.fistname);
}

如何选择数据结构

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

Array读快改慢Linked改快读慢Hash两者之间

Map接口

实现Map接口的类用来存储键值对,接口的实现类有HashMap和TreeMap等,接口的方法如图

在JDK1.5之前,Map接口中的方法还不具有自动装箱拆箱功能,例如添加一个数字1,必须这样写put("one",new Integer(1))

获得这个元素  int i=(Integer)map.get("one").intValue()

在JDK1.5之后,就可以直接这样写:put("one",1);  int i=(Integer)map.get("one")

JAVA基础知识:容器的更多相关文章

  1. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  2. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  3. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  4. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  5. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  6. Java基础知识-去重

    java基础知识-去掉list集合中的重复元素: 思路: 首先新建一个容器resultList用来存放去重之后的元素 然后遍历sourceList集合中的元素 判断所遍历的元素是否已经存在于resul ...

  7. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  8. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  9. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  10. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

随机推荐

  1. 3.Complementing a Strand of DNA

    Problem In DNA strings, symbols 'A' and 'T' are complements of each other, as are 'C' and 'G'. The r ...

  2. Qt错误总结

    Qt时常发生的错误总结 1,代码有问题,但是它却告诉你别的地方-比头文件不能读取,贼蛋疼! 2,库文件问题,会出现一大堆错误,这个时候就要好好检查库文件了. 3,版本问题,Qt版本升级时有些东西会变化 ...

  3. Android学习笔记

    1.问题:Error when loading the SDK:发现了以元素 'd:skin' 开头的无效内容 方法:删除了android-wear        用sdk\tools\lib下的de ...

  4. 未能加载文件或程序集“AspNetPager”或它的某一个依赖项。参数错误(转)

    未能加载文件或程序集“AspNetPager”或它的某一个依赖项.参数错误. 看你的的开发框架用的是多少的2.0, 3.0, 3.5, 4.0 那么删除的框架的文件夹也相对应的变化   删除 C:\W ...

  5. WINDOW(单调队列的应用)

    给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端, 你只能见到窗口的K个数,每次窗体向右移动一位,如下表: 你的任务是找出窗口在各位置时的 max value,min value ...

  6. 关于vue.js中class与style绑定的学习

    练习代码: html: <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  7. 用JQuery动态为选中元素添加/删除类

    在做一些tab页功能时,我们经常会见到如下样式: 即当选中一个元素时,在此元素下会添加相应的类,以示区别.今天就研究了一下如何用JQuery实现此效果. 1. HTML代码 <a id=&quo ...

  8. error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    以前一直用的VC6.0,最近换成VS2010了.哎这几天光折腾VS2010了. 曾经我以为程序没啥头绪忒头疼,现在觉得乱七八糟的编译问题才叫一个头裂=口= 原因:VC6.0中,如果没有直接显示指定的返 ...

  9. nginx入门篇----功能特性

    1.nginx功能特性 可以作为http服务器或者反向代理服务器 能够快速响应静态页面(html)的请求 支持FastCGI.SSL.Virtual Host.URL Rewrite.HTTP.Gzi ...

  10. c#线程之异步委托begininvoke、invoke、AsyncWaitHandle.WaitOne 、异步回调

    单靠自己看书学总是会走很多弯路,任何人也不列外,有些时候自己遇到的很多问题,其它别人在很久之前也可能遇到过,上网查查可以走很大捷径,对自己的学习有很大帮助,刚开始弄线程这块,一开始只是看书,很多东西都 ...