美文网首页
Java 3 对象容器

Java 3 对象容器

作者: 反复练习的阿离很笨吧 | 来源:发表于2019-02-08 21:01 被阅读0次

Ref:
什么是泛型
Java 容器 & 泛型(1):认识容器

3.1 顺序容器

我们首先学习的是顺序容器,即放进容器中的对象是按照指定的顺序(放的顺序)排列起来的,而且允许具有相同值的多个对象存在。

3.1.1 记事本程序的设计

需求分析:

  • 无限存储记录(用数组不合适)
  • 已存储数量
  • 查看记录
  • 删除记录
  • 列出所有记录

类的接口设计(使用层次):
add(String note);
getSize();
getnote(int index);
removeNote(int index);
list();

将人机交互(输入输出)与业务逻辑(数据处理)分开处理。

3.1.2 泛型容器类

ArrayList <String> notes=new ArrayList<String>();
容器类有两个类型:

  1. 容器的类型ArrayList
  2. 元素的类型<String>
package notebook;

import java.util.ArrayList;

public class NoteBook {
    private ArrayList <String> notes=new ArrayList<String>();
    public void add(String s) {
        notes.add(s);//ArrayList类自带的函数
    }
    
    public void add(String s,int location) {
        notes.add(location,s);//插入到当前位置,其他元素按顺序后移一位
    }
    
    public int getSize() {
        return notes.size();//ArrayList类自带的函数
    }
    
    public String getnote(int index) {
        return notes.get(index);
    }
    
    public void removeNote(int index) {
        notes.remove(index);
    }
    
    public String[] list() {//list返回一个数组,数组中是记事本的全部内容
        String[]a =new String[notes.size()];
//      for(int i=0;i<notes.size();i++)
//      {
//          a[i]=notes.get(i);
//      }
        notes.toArray(a);
        return a;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NoteBook nb=new NoteBook();
        nb.add("first");
        nb.add("second");
        nb.add("third",1);
        System.out.println(nb.getSize());
        System.out.println(nb.getnote(0));//输出0位置上的元素
        System.out.println(nb.getnote(1));
        nb.removeNote(1);
        String[] a=nb.list();
        for (String s:a) {
            System.out.println(s);
        }
    }
}

了解ArrayList内部的函数可以省很多力气。

3.2 对象数组

当数组的元素的类型是类的时候,数组的每一个元素其实只是对象的管理者而不是对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!


int数组和String数组的区别

String a=new String[10];

每个格子都是String类的管理者

对象数组中,每个元素都是对象的管理者而非对象本身。

FOR-EACH可以用于数组的遍历,
FOR-EACH中对象数组和普通数组有区别:
普通数组:

普通数组FOR-EACH
        int[] inta=new int[10];
        for(int k:inta)
        {
            k=1;
        }
这里k=0不会起到任何作用,inta数组的值还是初始的0。
因为FOR-EACH执行过程:通过数组的下标将元素逐个取出,并赋值给变量,相当于: int k = ia[i];

对象数组:

定义一个类value
class Value{
    private int i;
    public void set(int i) {this.i=i;}
    public int get() {return i;}
}
        Value[] a=new Value[10];
        for(int i=0;i<a.length;i++)
        {
            a[i]=new Value();//创建对象
            a[i].set(i);//给对象赋初始值
        }
        for(Value v:a)
        {
            System.out.println(v.get());
        }
        Value[] a=new Value[10];
        for(int i=0;i<a.length;i++)
        {
            a[i]=new Value();//创建对象
            a[i].set(i);
        }
        for(Value v:a)
        {
            System.out.println(v.get());
            v.set(0);
        }
        for(Value v:a)
        {
            System.out.println(v.get());
        }

在FOR-EACH循环中v.set(0);后,Value数组的值都变为0了。

3.3 集合容器(HashSet)

集合就是数学中的集合的概念:所有的元素都具有唯一的值,无重复元素,元素在其中没有顺序。
HashSet <String> s=new HashSet <String>();

import java.util.ArrayList;
import java.util.HashSet;

        ArrayList<String> a=new ArrayList<String>();
        a.add("first");
        a.add("second");
        a.add("first");
//      for(String s:a)
//      {
//          System.out.println(s);
//      }
        System.out.println(a);//可以直接输出Set
        System.out.println("----华丽的分割线----");
        HashSet<String> s=new HashSet<String>();
        s.add("first");
        s.add("second");
        s.add("first");
//      for(String k:s)
//      {
//          System.out.println(k);
//      }
        System.out.println(s);
Console:
[first, second, first]
----华丽的分割线----
[first, second]

System.out.println(s);为什么可以直接输出呢?

class Value{
    private int i;
    public void set(int i) {this.i=i;}
    public int get() {return i;}
    public String toString() {return ""+i;}
}
public static void main(String[] args) {
    Value v=new Value();
    v.set(10);
    System.out.println(v);
}
Console:
10

如果没有public String toString() {return ""+i;}
则会错误地输出clock.Value@15db9742

类里面有了 toString()函数的话,在System.out.println时会自动调用toString()函数来输出。
ArrayList和HashSet类里肯定有这个功能的函数。

3.4 散列表(HashMap)

传统意义上的Hash表,是能以int做值,将数据存放起来的数据结构。
Java的Hash表可以以任何实现了hash()函数的类的对象做值来存放对象

import java.util.HashMap;
import java.util.Scanner;

public class Coin {
    private HashMap<Integer,String> coinnames=new HashMap<Integer,String>();
    //所有的类型必须是对象,不能使基本类型,比如这里要用integer,不能用int,integer是int的包裹类型
    public Coin()
    {
        coinnames.put(1, "penny");//包裹类型的变量可以直接接收对应的基础类型的变量
        coinnames.put(10, "dime");
        coinnames.put(25, "quarter");
        coinnames.put(15, "harf-dollar");
    }
    public String getName(int amount)
    {
        if(coinnames.containsKey(amount))
        {
            return coinnames.get(amount);
        }
        else
        {
            return "not found";
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in); 
        int amount=in.nextInt();
        Coin coin=new Coin();
        String name=coin.getName(amount);
        System.out.println(name);
        in.close();
    }

}
10
4
{1=penny, 25=quarter, 10=dime, 15=五毛}
dime
    public Coin()
    {
        coinnames.put(1, "penny");//包裹类型的变量可以直接接收对应的基础类型的变量
        coinnames.put(10, "dime");
        coinnames.put(25, "quarter");
        coinnames.put(15, "harf-dollar");
        coinnames.put(15, "五毛"); //键是唯一的
        System.out.println(coinnames.keySet().size()); //coinnames的大小
        System.out.println(coinnames); //直接输出
        System.out.println("-----遍历-----");
        for(Integer k:coinnames.keySet())
        {
            String s=coinnames.get(k);
            System.out.println(s);
        }
        System.out.println("--------------");
    }
  1. 这里HashMap<Integer,String>里面只能用Integer,不能用int。
  2. coinnames.put(15, "五毛");后,键值对就变成<15,五毛>
  3. coinnames.keySet().size()HashSet没有输出size的函数,可以用keySet()获得键的集合,通过集合获得HashSet的size。
  4. System.out.println(coinnames);HashSet和ArrayList一样,也可以直接输出的。
  5. 哈希表的遍历:通过keySet()来获得值。


    泛型容器

相关文章

  • Java 3 对象容器

    Ref:什么是泛型Java 容器 & 泛型(1):认识容器 3.1 顺序容器 我们首先学习的是顺序容器,即放进容器...

  • 关于Java中集合ArrayList、LinkedList以及H

    前言Java中容器对象主要用来存储其他对象,根据实现原理不同,主要有3类常用的容器对象: 1、ArrayList ...

  • Java学习第三周总结

    容器 容器(Container)- 承载其他对象的对象Collection List 列表 Set 集合从Java...

  • 概览

    概览 容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为J...

  • 集合总览

    概览 容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为J...

  • 强制类型转换

    Java有容器和对象之分1. 容器就是变量,它用来指向某个对象(地址) 1.1 容器其实是用来限定对象行为的,程序...

  • 集合工具

    一 。集合概念: 1.JAVA中集合类是用来存放对象的 2.集合相当于一个容器,里面包容一组对象----容器类 3...

  • 简谈spring父子容器

    spring的核心就是容器,何为容器,简单的说就是管理Java对象的一个大罐子,任何java对象都可以让sprin...

  • Java面试题

    Java面试 Java、框架、JVM Java 基础、容器、多线程、反射、对象拷贝、Java web模块、异常模块...

  • Java集合框架

    Java集合框架(Java Collections Framework)是存放大量对象的容器,被广泛使用。Java...

网友评论

      本文标题:Java 3 对象容器

      本文链接:https://www.haomeiwen.com/subject/cghosqtx.html