title: Java进阶学习-3 容器类 对象数组 set HashMap
date: 2020-02-01 22:10:26
tags: Java学习
记事本Demo
功能设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TIA3yi3l-1580663767957)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201221246201.png)]
接口设计
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QosKmRN7-1580663767958)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201221306790.png)]
之前我们写的程序 人机交互(输入输出部分) 业务逻辑(对输入进行计算的部分)都在一块 初学的时候为了表达方便所以写在一块,真正的软件不是这样的。UI和业务逻辑要分开。
此处接口为业务逻辑。
容器类
ArrayList notes = new ArrayList
容器有两个类型:
容器的类型
元素的类型
对象数组
int[] ia = new int[10];
String[] a = new String[10]; //定义了一个String数组 为一个管理者
System.out.println(ia[0]+2);
// System.out.println(a[0].length());
String s = null;
System.out.println(s.length());
输出报错
String[] a = new String[10]; //定义了一个String数组 为一个管理者
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tGpNeXf6-1580663767961)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201230701698.png)]
所以String[]数组当中每一个是一个String类型的管理者 需要指向一个内容做管理
初始没管故为null
public static void main(String[] args) {
int[] ia = new int[10];
String[] a = new String[10]; //定义了一个String数组 为一个管理者
for(int i = 0; i < a.length; i++) {
a[i] = ""+i;
}
System.out.println(ia[0]+2);
System.out.println(a[0].length());
}
2
1
对象数组中的每一个元素都是对象的管理者而非对象本身。
创建了一个对象数组以后 还要创建对象以后 才有意义,原本没有可以管理的对象 故为null
对象数组的for-each循环
package notebook;
import java.util.ArrayList;
class Value {
private int i;
public void set(int i) {this.i = i;}
public int get() {return i;}
}
public class NoteBook {
private ArrayList<String> notes = new ArrayList<String>();
//ArrayList of String 范型类 是一种容器 notes为对象管理者
public void add(String s) {
notes.add(s);
}
public void add(String s, int location) {
notes.add(location, s); //在location插入一个元素 原来元素后移
}
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() { //不直接输出 而是返回一个结果的数组 为以后上层扩展服务
int[] ia = new int[10];
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) {
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) { //a在不断的改变管理对象
System.out.println(v.get());
v.set(0);
}
for(Value v : a) {
System.out.println(v.get());
}
}
}
0
1
2
3
4
5
6
7
8
9
0
0
0
0
0
0
0
0
0
0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfz73LYQ-1580663767964)(C:\Users\36987\AppData\Roaming\Typora\typora-user-images\image-20200201232537996.png)]
for-each循环可以 不断改变v指向的管理对象
容器也可以使用for-each循环
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("first");
a.add("second");
for( String s : a) {
System.out.println(s);
}
}
first
second
集合容器set
set去重
public static void main(String[] args) {
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("-----------");
HashSet<String> s = new HashSet<String>();
s.add("first");
s.add("second");
s.add("first");
for( String k : s) {
System.out.println(k);
}
}
first
second
first
-----------
first
second
容器可以直接输出
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("first");
a.add("second");
a.add("first");
System.out.println(a);
System.out.println("-----------");
HashSet<String> s = new HashSet<String>();
s.add("first");
s.add("second");
s.add("first");
System.out.println(s);
}
输出
[first, second, first]
-----------
[first, second]
set不排序
toString函数可以保证输出
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);
}
如果没有加上toString() 则不可以输出
所以在容器中都实现了toString()函数 才可以把 容器直接输出
System.out.println(a);
System.out.println(s);
HashMap()哈希表
package coins;
import java.util.HashMap;
import java.util.Scanner;
public class Coin {
private HashMap<Integer, String> coinnames = new HashMap<Integer, String>();
//必须要为Integer 不能用int
public Coin() {
coinnames.put(1, "penny"); //一个包裹类型的量可以接受int
coinnames.put(10, "dime");
coinnames.put(25, "quarter");
coinnames.put(50, "half-dollar");
coinnames.put(50, "五毛");
System.out.println(coinnames.keySet().size());
System.out.println(coinnames);
}
public String getName(int amount) {
if(coinnames.containsKey(amount))
return coinnames.get(amount);
else
return "NOT FOUND";
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int amount = in.nextInt();
Coin coin = new Coin();
String name = coin.getName(amount);
System.out.println(name);
}
}
10
4
{1=penny, 50=五毛, 25=quarter, 10=dime}
dime
键值唯一
遍历的方法
package coins;
import java.util.HashMap;
import java.util.Scanner;
public class Coin {
private HashMap<Integer, String> coinnames = new HashMap<Integer, String>();
//必须要为Integer 不能用int
public Coin() {
coinnames.put(1, "penny"); //一个包裹类型的量可以接受int
coinnames.put(10, "dime");
coinnames.put(25, "quarter");
coinnames.put(50, "half-dollar");
coinnames.put(50, "五毛");
System.out.println(coinnames.keySet().size());
System.out.println(coinnames);
for(Integer k : coinnames.keySet()) { //拿keySet
String s = coinnames.get(k);
System.out.println(s);
}
}
public String getName(int amount) {
if(coinnames.containsKey(amount))
return coinnames.get(amount);
else
return "NOT FOUND";
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int amount = in.nextInt();
Coin coin = new Coin();
String name = coin.getName(amount);
System.out.println(name);
}
}
10
4
{1=penny, 50=五毛, 25=quarter, 10=dime}
penny
五毛
quarter
dime
dime