Java面向对象程序设计(三)--对象容器

一、容器与对象数组

Java里有很多很好用的容器,它拥有丰富的功能,不错的性能以及很好的可操作性。

数组可以看作一种容器,但是它一旦开始固定数组长度就不能进行改变。

所以一般来说容器是能够自动扩大容量的数据结构。

所以在面向对象中有了对象容器的概念。

下面是写的一个模拟记事本,可以实现增加(两种形式),删除和查看(都是通过索引),以及列出来的功能。

ArrayList是Java中的一个范型容器类,需要引入

它是一个不需要指定长度的容器,它可以根据内部的数据自动扩充(当然不会把计算机内存占满啦^_^)

但是需要指定内部元素的数据类型,不能像python那样混合,下面的例子中就是指定为String

.add()可以往后面放东西

.size()返回长度,这个长度是动态变化的

.get(int index)返回对应索引位置的元素

.remove(int index)删除对应索引位置的元素,如果失败会throw异常

.toArray()可以自动把这个容器里的元素按顺序放进括号内指定的数组。其实就是一个for循环,但是少码字啊!

还有很多功能就自己慢慢探索吧

package notebook;

import java.util.ArrayList;//ArrayList需要调用这个

public class Notebook {
	private ArrayList<String> notes = new ArrayList<String>();
	public void add(String s)
	{
		notes.add(s);
	}
	public void add(String s, int location)//这样可以根据索引插入元素
	{
		notes.add(location, s);
	}
	public int getsize()
	{
		return notes.size();
	}
	public String getnote(int index)
	{
		return notes.get(index);
	}
	public void removenote(int index)
	{
		notes.remove(index);
	}
	public String[] 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) {
		Notebook nb = new Notebook();
		nb.add("first");
		nb.add("second");
		nb.add("third",1);
		System.out.println(nb.getsize());
		System.out.println(nb.getnote(1));
		String[]a = nb.list();
		for(String s:a)//对象容器也可以使用for-each循环
		{
			System.out.println(s);
		}
	}

}

对象数组中每个元素都是对象的管理者而非对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!

上面的例子中String [] a中每个单元并不会放真正的字符串,而是放着某一个String对象的管理者

如果没有东西,那么其内部为null,即没有管理的东西

二、HashSet和HashMap

HashSet就类似于C++的Set的,没什么好说的

public static void main(String[] args) {
		HashSet<String> s = new HashSet();
		s.add("piano");
		s.add("guitar");
		s.add("piano");
		for(String k:s)
		{
			System.out.println(k);//这个依次输出每个元素
		}
		System.out.println(s);//这个直接输出一个集合
}

 

注意for-each循环和直接system.out.println(s)输出的格式是不同的

HashMap就类似于C++里的Map

这个数据结构有多好用就不费口舌了

假如我们要实现一下硬币种类的排列。(注意这个类要适用于各国硬币,所以不用switch case)

package coin;
import java.util.*;
public class Coin {
	HashMap<Integer, String> Coinkinds = new HashMap<Integer, String>();//HashMap里面的数据类型必须是对象而不能是普通的数据类型,Integer是int的包裹类型,是一种对象
	public Coin()
	{
		Coinkinds.put(1,"一分");
		Coinkinds.put(2,"两分");
		Coinkinds.put(5,"五分");
		Coinkinds.put(10,"一角");
		Coinkinds.put(20,"两角");
		Coinkinds.put(50,"五角");
		Coinkinds.put(50,"五毛");//因为一个key只能对应一个value,所以key只对应与最后一个value
		System.out.println(Coinkinds);
		System.out.println(Coinkinds.keySet().size());//这个HashMap的key所形成的集合的大小
		for(Integer n:Coinkinds.keySet())//HashMap遍历好像只能这么麻烦,而且出来是无序的
		{
			System.out.println(n+" "+Coinkinds.get(n));
		}
	}
	public String getname(int amount)
	{
		if(Coinkinds.containsKey(amount))
		{
			return Coinkinds.get(amount);			
		}else
		{
			return "not found";
		}
	}
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int amount = in.nextInt();//如果输入50
		Coin c = new Coin();
		System.out.println(c.getname(amount));//那么这里输出是五毛而不是五角
		in.close();
	}

}

 

嗯就这样了

发布了99 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43721423/article/details/95863378