集合框架笔记(下)

原创 2007年09月20日 16:26:00

       前面学习了ArrayList类,Collections类,迭代子Iterator,比较器Comparator;非常愉快。今天学习的内容包括,LinkedList类,HashSet类,TreeSet类,HashMap类,TreeMap类,以及Properties类。今天顺便翻开以前的笔记看了看,发现反射API已经忘得差不多了,郁闷。由此可见学习的时间一定要紧凑,一定要多复习,像我这样认真记了笔记并做了总结的都忘记了,才一个月不到。汗。
      首先复习一下数据结构,堆栈(Stack)就像一个子弹夹,先放入的子弹后射出来(FILO);队列就好像银行排队,先进的人先出来(FIFO)。
      在略说一下集合框架中的几个接口类型,包括:
           List:通过迭代子来精确地控制元素的随机访问;
           Set:  不允许重复元素出现,
           Map:  存储键值对,不允许相同的键出现。
     1.  LinkedList类:
           LinkedList它本身类似于一个双向循环链表,可以实现栈,队列,双向队列的功能,它常用的成员函数如下
           addFirst(),将某个元素加到链表头;
           addLast(),将某个元素加到链表尾;
           getFirst(),查看队头元素;
           getLast(),查看队尾元素;
           removeFirst(),删除并返回队头元素;
           removeLast(),删除并返回队尾元素;
           实际上LinkedList和ArrayList是很相似的,但是却各有用途,LinkedList更便于于添加和删除操作,而ArrayList更加方便于随机访问。
     
     2.HashSet类:
           将元素存储在一种称为“散列表”的结构中,以要存储的元素为自变量,通过散列函数的计算而得到其在散列中的存储地址,如果散列表中的元素的个数达到总位置的某个比例(称为负载因子,默认为0.75),将对自身进行扩容,并重新计算每个元素的位置,产生新的散列表,并且删除原表。构造HashSet类的对象时,默认的容量是16个元素,负载因子默认为0.75,当然,容量和负载因子都可以在构造时自己指定。
           因为HashSet中不允许出现重复的因子,因而它必须存在一个判断的标准,如何判断两个要加入哈希散列中的元素是否相等?HashSet判定的标准是依照这两个因子产生的散列码是否相等,散列码会依照java.lang.object.hashCode()函数产生,因此这个函数必须被重写,但是又不必我们程序员自己来实现这一技术,因为各标准类型都重写了hashCode(),我们只要有选择地调用就可以了(注:这个散列码实际上是依照内存地址产生的);而hashCode()函数和java.lang.object.equals()函数息息相关,因此equals函数也必须重写,而且必须保证,用equals()比较相等的两个元素,其产生的散列码也必须相等。因而,必须注意,在欲放入hashSet中的类中必须同时重写hashCode()和equals();
     3.TreeSet类
           放入其中的元素会按照自然顺序进行排列,要求欲放入其中的类实现Comparable接口。当然,也可以在构造TreeSet对象时调用某个构造函数载入一个Comparator因子,这个在前面已经提到过,是java.util下的一个接口,我们又称之为比较器。
           HashSet性能要优越于TreeSet,而TreeSet实现了排序。
     4.HashMap类
          HashMap和前面提到的类都不同,他内部存储的是键值对(key_value),一个键对应于一个值,不允许重复的键出现,但是允许值出现空值。
          常用的函数有
                put(key,value)  放入键值对
                get(key) 通过键获得值
                Set keySet() 获得所有键的视图
                Collection values() 获得所有值的视图
                Set entrySet()  这个函数的用法是,先得到一个Set,然后将一个Iteratror关联这个Set,然后利用next()获得Set中的元素,将每个元素赋值给一个Map.Entry类型的量,这个Map.Entry类型中有函数getKey()和getValue()可以分别获得键和值,为了更好的说明,引用一段代码如下
            HashMap hm=new HashMap();
     hm.put(1,"zhangsan");
     if(!hm.isEmpty())
     {
    Set s=hm.keySet();                  //返回键值
    Collection c=hm.values();           //返回值
    iteratorTool(s.iterator());
    iteratorTool(c.iterator());          //iteratorTool()这里是我自定义的一个输出函数
    Set end=hm.entrySet(); //这里返回的set实际上是Map.entry
    Iterator it=end.iterator();
    while(it.hasNext())
    {
     Map.Entry xa=(Map.Entry)it.next();
     System.out.println(xa.getKey()+" "+xa.getValue());
              }
           }
          另外,在java.util包下,还有一个十分有用的properties,等学习了I/O操作以后再详细的写出来。
今天的总结就写完啦,期间被人拉去打游戏,耽误了一点时间,不过不要紧啦。
下面是源代码,为了便于输出,我自定义了一个iteratorTool()的函数,不管是要输出什么,只要获得一个Iteratror作为参数就可以了,这就是面向对象的威力啦。但是让我百思不得其解的是,在第30行,本来这里是应该要写一个if else语句的,但是一旦写了这样的语句,编译的时候会提示“缺少返回值”,让我十分郁闷。下面的源代码我会注明一下,请高手们多多指正啦。
import java.util.*;
class Student implements Comparable //TreeSet必须实现该接口以按自然顺序排列
{
 Student(int id,String name)
 {
  this.id=id;
  this.name=name;
 }
 int id;
 String name;
 public String toString()
 {
  return id+":"+name;
 }
 public int hashCode()
 {
  return this.name.hashCode();
 }
 public boolean equals(Object o)           //HashSet必须重写hashCode()和equals()
 {
  Student s=(Student)o;
  if(id==s.id&&name==s.name)
        return true;
  else
        return false;
 }
  public int compareTo(Object p)
 {
    Student m=(Student)p;
    return name.compareTo(m.name);  //百思不得其解的地方,无法写成if else
 }                      
}

class LinkedListTest
{
 public static void iteratorTool(Iterator i)
 {
  while(i.hasNext())
  {
   System.out.println(i.next());
  }
 }
 public static void main(String[] args)
 {
  //-----------------------以下为LinkedList练习
  Student s1=new Student(2,"zhangsan");
  Student s2=new Student(3,"lisi");
  Student s3=new Student(4,"wangwu");
  LinkedList link=new LinkedList();
  //like Stack
  link.addFirst(s1);
  link.addFirst(s2);
  link.addFirst(s3);
  System.out.println("First in last out");
  while(link.size()>0)          //size()是成员函数,查询元素个数
        System.out.println(link.removeFirst());
  
   //------------------------以下为HashSet练习
   HashSet hash=new HashSet();
   Student s4=new Student(1,"zhangsan");
   Student s5=new Student(2,"zhangsan");
   hash.add(s1);       //如果s1未在哈希散列表中存在则添加
   hash.add(s2);
   hash.add(s3);
   hash.add(s4);
   hash.add(s5);       //事实上s5会添加失败
   System.out.println("-------------------------------");
   System.out.println("Now,it's HashSet time");
   iteratorTool(hash.iterator());   //哈希表需要通过迭代器进行访
   System.out.println("-------------------------------");
   System.out.println("Now,it's TreeSet time");
   TreeSet tree=new TreeSet();
   tree.add(s1);
   tree.add(s2);
   tree.add(s3);
   tree.add(s4);
   tree.add(s5);
   iteratorTool(tree.iterator());
   System.out.println("---------------------------------");
   System.out.println("Now it's HashMap time");
   HashMap hm=new HashMap();
   hm.put(1,"zhangsan");
   hm.put(2,"zhangsan");
   hm.put(2,"wangsan");
   if(!hm.isEmpty())
   {
    Set s=hm.keySet();                  //返回键值
    Collection c=hm.values();           //返回值
    System.out.println("the key summary");
    iteratorTool(s.iterator());
    System.out.println("the values summary");
    iteratorTool(c.iterator());
    Set end=hm.entrySet(); //这里返回的set实际上是Map.entry
    Iterator it=end.iterator();
    System.out.println("--------------------------------");
    System.out.println("Test Map.Entry,");
    while(it.hasNext())
    {
     Map.Entry xa=(Map.Entry)it.next();
     System.out.println(xa.getKey()+" "+xa.getValue());
    }
   }
 }

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java集合框架学习笔记

  • 2008-09-30 09:53
  • 196KB
  • 下载

黑马程序员_学习笔记集合框架(I)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Java的Collection集合类是一种工具类,用于存储不定长度的数据。 Collecti...

(32)Java学习笔记——集合框架 / Collection 接口 / Iterator 迭代器

集合: 存储多个对象的容器类型的变量。集合类提供了变化长度的需求。 集合和数组的不同点: A/ 长度区别: ------| 数组长度固定 ------|集合长度可变 B/ 内容不同 ------|...

[学习笔记]Java集合框架之Map集合

Map集合 1. 概述 Map集合是一个接口,和Collection集合不同的是,它是双列集合,也就是说它所存储的是键值对。 2. 特点 Map集合存储的是键值对,其中键要...

JavaSE学习笔记--集合框架

---------------------- http://edu.csdn.net/heima" target="blank">android培训、http://edu.csdn.net/heima...

(34)Java学习笔记——集合框架 / 泛型

泛型: 是一种吧类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。 格式: 此处的数据类型只能是引用类型。 好处: A/ 把运行时期的问题提前...

黑马程序员_JAVA笔记14——集合框架(List、HashSet、TreeSet)

------- android培训、java培训、期待与您交流! ---------- 1、为什么出现集合类,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储...

【黑马程序员】Java笔记--集合框架

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(contai...

Java学习笔记——JCF集合框架

List基本使用 特别是有顺序,所有可以用get(i)读取出来 public static void main(String[] args) { //1、List基本使用 List ls...

(36)Java学习笔记——集合框架 / Set集合

Set集合 不包含重复元素,存储顺序和取出顺序不一致 HashSet 不保证Set的迭代顺序,特别是不保证该顺序恒久不变。 范例: package cn.itcast_01; import ja...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)