[JAVA · 初级]:19.容器类

概述

容器 就是存放数据的一个集合

(java提供了一个接口专门去约束我们容器的实现类)

Set: does not allow duplicate objects toenter the collection of elements

SortedSet: similar to set except that theelements in the set are stored in ascending order

List: is ordered, maintain an order asobjects are added and removed from the collection,can also contain duplicateentries of objects

Map: stores objects that are identifiedby unique keys, and may not store duplicate keys

SortedMap: similar to Map, except the objectsare stored in ascending order according to their keys

即:

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

–  Set 中的数据对象没有顺序且不可以重复。

–  List 中的数据对象有顺序且可以重复。

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

Collection方法

?    Collection 表示一组对象,它是集中,收集的意思,就是把一些数据收集起来。

?    Collection函数库是在java.util 包下的一些接口和类,类是用来产生对象存放数据用的,而接口是访问数据的方式。

?    Collection函数库与数组的两点不同:

1.数组的容量是有限制的,而Collection库没有这样的限制,它容量可以自动的调节 。

2.Collection函数库只能用来存放对象,而数组没有这样的限制。

?    Collection接口是Collection层次结构 中的根接口,它定义了一些最基本的访问方法,让我们能用统一的方式通过它或它的子接口来访问数据。

?    区别:Collection代表一组对象, Collection函数库就是java中的集合框架,Collection接口,是这个集合框架中的根接口。

?    存放在Collection 库中的数据,被称为元素(element) 。

Demo

<span style="font-size:18px;"><span style="font-size:18px;">public class Person {
  private intid;
  private Stringname;
  public Person(int id, String name) {
         this. id= id;    this. name = name;
  }
  public intgetId() {    return id;   }
  public StringgetName() {   return name;  }
  public voidsetId (int id) {
         this. id= id;
  }
  public voidsetName (String name) {
         this.name = name;
  }
  public StringtoString() {
         return “id: ” + id + “|name: ” + name;
  }
}
========================================================================
import java.util.*;
public class CollectionTest1 {
  public staticvoid main (String[] args) {
         Collectionc = new HashSet();
         c. add(new Person(1, “c++"));
         c. add(new Person(2, “java"));
         System.out.println(c. size() + ": " + c);
         System.out.println("contains: " + c. contains (new                                    Person(2, "java")));
         System.out.println(c. remove (new Person(2, " java")));
         System.out.println(c. size() + ": " + c);
  }
}</span></span>

输出结果:

Iterator接口

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

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

?    Iterator接口定义了如下方法:

Demo

<span style="font-size:18px;"><span style="font-size:18px;">import java.util.*;
public class IteratorTest1 {
  public staticvoid main(String[] args) {
         Collectionc = new ArrayList();
         c.add("good");   c.add("morning");
         c.add("key");    c.add("happy");
         for(Iterator it = c.iterator(); it.hasNext(); ) {
                Stringtem = (String) it.next();
                if(tem.trim().length() <= 3) {
                       it.remove();
                }
         }
         System.out.println(c);
  }
}
</span></span>

Set方法

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

?    Set 容器可以与数学中“集合”的概念相对应。

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

Demo

<span style="font-size:18px;">import java.util.*;
public class SetTest {
  public staticvoid main (String[] args) {
         Set s =new HashSet();
         s.add("hello");
         s.add("world");
         s.add(new Integer(4));
         s.add(new Double(1.2));
         s.add("hello"); // 相同的元素不会被加入
         System.out.println(s);
  }
}
</span>

List接口

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

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

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

Demo

<span style="font-size:18px;"><span style="font-size:18px;">import java.util.*;
public class ListTest {
  public staticvoid main(String[] argc) {
         List l1= new ArrayList();
         for (inti = 0; i <= 5; i++)
                l1.add("a"+ i);
         System.out.println(l1);
         list.add(3,"a100");
         System.out.println(l1);
         list.set(6,"a200");
         System.out.println(list);
         System.out.print((String)list.get(2) + " ");
         System.out.println(list.indexOf("a3"));
         list.remove(1);
         System.out.println(list);
  }
}</span></span>

常用算法

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

Demo

<span style="font-size:18px;"><span style="font-size:18px;">import java.util.*;
public class CollectionsTest {
     publicstatic void main(String[] argc) {
  List aList =new ArrayList();
  for (int i = 0;i < 5; i++)
         aList.add("a"+ i);
  System.out.println(aList);
  Collections.shuffle(aList);// 随机排列
  System.out.println(aList);
  Collections.reverse(aList);// 逆续
  System.out.println(aList);
  Collections.sort(aList);// 排序
  System.out.println(aList);
  System.out.println(Collections.binarySearch(aList,"a2"));
  Collections.fill(aList,"hello");
  System.out.println(aList);
   }
}
</span></span>

Comparable接口

问题:上面的算法根据什么确定集合中对象的“大小”顺序?

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

public int compareTo(Objectobj);

该方法:

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

Demo

<span style="font-size:18px;"><span style="font-size:18px;">public class Student implements Comparable {
               private Stringname;
               private Integerscore;
               publicStudent(String name, int score) {
                     this.name =name;
                     this.score =new Integer(score);
               }
               public intcompareTo(Object o) {
                     Student n =(Student) o;
                     int a =score.compareTo(n.score);
                     return (a !=0 ? a :                                                                  name.compareTo(n.name));
               }
               public StringtoString() {
                     return"name: " + name + " score: " +                                   score.toString();
               }
}
import java.util.*;
public class StudentTest {
               public static voidmain(String[] args) {
                     List l1 = newLinkedList();
                     l1.add(newStudent(“ttt", 66));
                     l1.add(newStudent(“bbb", 77));
                     l1.add(newStudent(“ccc", 99));
                     l1.add(newStudent(“fff", 88));
                     l1.add(newStudent(“aaa", 66));
                     System.out.println(l1);
                     Collections.sort(l1);
                     System.out.println(l1);
               }
}</span></span>

Map接口

?    实现Map接口的类用来存储键(key)-值(value) 对。

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

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

Demo

<span style="font-size:18px;"><span style="font-size:18px;">import java.util.*;
public class MapTest {
  public staticvoid main(String args[]) {
         Map m1 =new HashMap();
         Map m2 =new TreeMap();
         m1.put("one",new Integer(1));
         m1.put("two",new Integer(2));
         m1.put("three",new Integer(3));
         m2.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(newInteger(1)));
         if(m1.containsKey("two")) {
                inti = ((Integer) m1.get("two")).intValue();
                System.out.println(i);
         }
         Map m3 =new HashMap(m1);
         m3.putAll(m2);
         System.out.println(m3.size());
  }
}</span></span>

泛型

泛型的作用就是为了约束你传入对象的类型;

通俗来讲:传进去什么,拿出来什么。

?    起因:

–  JDK1.4以前类型不明确:

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

?   从集合中取出时往往需要转型,效率低,容易产生错误。

?    解决办法:

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

?   可以在定义Collection的时候指定

?   也可以在循环时用Iterator指定

?    好处:

–  增强程序的可读性和稳定性

Demo

<span style="font-size:18px;"><span style="font-size:18px;">import java.util.*;
public class MapTest1 {
    public staticvoid main(String args[]) {
           Map<String,Integer> m = new HashMap<String, Integer>();
           for(int i = 0; i < 5; i++) {
                  m.put(String.valueOf(i),1);
           }
           for(int i = 0; i < 5; i++) {
                  m.put(String.valueOf(i),1);
           }
           System.out.println(m.size()+ " distinct words detected:");
           System.out.println(m);
           Set<String>set = m.keySet();
           Iteratorit = set.iterator();
           while(it.hasNext()) {
                  System.out.println(m.get(it.next()));
           }
    }
}</span></span>

增强for循环

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

?     缺陷:

–    数组:

?     不能方便的访问下标值

–    集合:

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

?     总结:

–    除了简单遍历并读出其中的内容外,不建议使用增强for

业务思想

JAVA提供的这个接口专门约束我们容器的实现类,从很大程度上减轻了我们设计人员的负担,提高效率。

容器类的总结相对来说是比较零散的知识点,很难完整的讲述出来,在不断的使用中,可以得到更好地理解。

时间: 2024-11-02 23:50:25

[JAVA · 初级]:19.容器类的相关文章

m2014-c-&gt;c模拟java的hashmap容器类

转自:http://bbs.csdn.net/topics/390034346 在java中像ArrayList,HashMap都是现成的,在java.util包中,用的时候直接import java.util.*就行了. 前几天写了一c版的ArrayList,同时欢迎大家指出问题:http://topic.csdn.net/u/20120429/18/4ab4bc02-2496-4d3c-8151-1cbe51e6fe9d.html?seed=425415324&r=78416084 今天有空

美女求JAVA初级开发职位

//我知道自己算不上美女,标题上写美女纯粹是为了吸引眼球,轻拍 过完年了,想找工作,感觉在商用环境下自己的技术能提高的更快一些. 求JAVA初级开发或者实习生职位. 工作地点最好在上海 简单介绍下自己: 毕业好几年了,一直觉得自己是靠运气和勤奋行走江湖 虽然跌跌撞撞,但也一路走到今天 可是没有掌握什么技术一直是心中的遗憾 2014年9月开始在家里全职学习JAVA--(JAVA就是我要掌握的技术) 计划此生投身计算机界 通过看马士兵老师的视频,外加看书学习--(我还是很喜欢马老师讲课的风格的) 昨

Java中的容器类(List,Set,Map,Queue)

Java中的容器类(List,Set,Map,Queue) 一.基本概念 Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)Collection.一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,而Set不能有重复的元素.Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同). 2)Map.一组成对的“键值对”对象,允许你使用键来查找值.ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在

年底了,如何准备 Java 初级和高级的技术面试?

朋友最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只有当反复确认能力不行才会下结论. 相反,如果候选人给我的印象不错,我也会从多个角度来衡量,以免招进会说但不会干活的"大忽悠". 其实倒也不是我故意要为难候选人,毕竟入职后就是同事,但面试官的职责使然,而且,如果资深的面试官一般也这样. 写到这里,恐怕会吓到一些想要面试的朋友,能力强和能力弱

Java基础19:Java集合框架梳理

Java基础19:Java集合框架梳理 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList.HashMap.HashSet,也有不常用的Stack.Queue,有线程安全的Vector.HashTable,也有线程不安全的LinkedList.TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系.下面就上面的各个接口.基类做一

如何成为一名Java初级程序员

目前,JAVA是开发人员的热宠,很多论坛都有不少热爱JAVA的开发人员,也有不少想成为JAVA程序员,但苦于不知道该如何学习,也不清楚该学些什么知识才能成为一个JAVA程序员.本人在这里抛砖引玉,和大家讨论成为一个JAVA初级程序员应该具有的知识,与大家共享. 个人认为想成为一个合格的JAVA初级程序员应该具备如下知识: 一.面向对象的知识:JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,

面试题 -- Java初级开发

Java初级开发面试题 2019-11-02  17:40:45  by冲冲 1.String String是定义在 java.lang 包下的一个类.它不是基本数据类型.String是不可变的. JVM使用字符串池来存储所有的字符串对象.字符串常量池存在于Java的堆内存中.(JDK1.6及以前常量池放置于方法区/永久代,JDK1.7开始放置于堆,可能是因为方法区太小了) ① 问题:该段代码中有几个字符串被创建? String str = new String("Cat"); 解析:

Java同步并发容器类

同步容器 同步容器类包括vector和Hashtable.此外还包括jdk1.2中添加的一些功能相似的类,这些同步封装器是由Collections.synchronizedXxx等工厂方法创建的.这些类实现线程安全的方式是:将它们的状态封装起来,并对每个共有方法都进行同步,使得每次只有一个线程能访问容器的状态. 同步容器类的问题 同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护复合操作.容器上常见的复合操作包括:迭代以及条件运算,例如若没有KEY值则添加,有则覆盖.在同步容

Java笔记(19):IO流(01)

1.try...catch的方式处理异常1 1 package cn.itcast_02; 2 3 /* 4 * 异常:程序出现了不正常的情况. 5 * 6 * 程序的异常:Throwable 7 * 严重问题:Error 我们不处理.这种问题一般都是很严重的,比如说内存溢出. 8 * 问题:Exception 9 * 编译期问题:不是RuntimeException的异常 必须进行处理的,因为你不处理,编译就不能通过. 10 * 运行期问题:RuntimeException 这种问题我们也不处