21.1 引出问题

一个问题?

前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决?

请做一个公司职员薪水管理系统,要求完成如下功能:

1、当有新员工时,将该员工加入到管理系统;

2、可以根据员工号,显示该员工的信息;

3、可以显示所有员工信息;

4、可以修改员工的薪水;

5、当员工离职时,将该员工从管理系统中删除;

6、可以按照薪水从低到高顺序排序;

7、可以统计员工的平均工资、最低和最高工资。

解决之道-链表或集合类:

我们想,如果有这样一种数组,可以动态的改变就好了,java的设计者为我们提供了一系列的集合类。

21.2 集合类分类

图中打红色三角的为常用的需要掌握的几个集合类。

从上面的图可以看出java集合类主要有以下几种:

1、List结构的集合类

ArrayList类,LinkedList(链表)类,Vector类,Stack类

2、Map结构的集合类

HashMap类,Hashtable类

3、Set结构的集合类

HashSet类,TreeSet类

4、Queue结构的集合

Queue接口

21.3 List结构的集合类

ArrayList类,LinkedList(链表)类,Vector类,Stack类

21.3.1 ArrayList

上图为结合代码画出的内存中的运行示意图。

演示代码如下:

 1 /**日期:2016-03-07
 2  * 功能:ArrayList演示
 3  */
 4 package test;
 5 //所有集合类都在java.util包中
 6 import java.util.*;
 7 public class Demo2 {
 8
 9     public static void main(String[] args) {
10         // TODO Auto-generated method stub
11
12         ArrayList al=new ArrayList();
13         System.out.println("此时al的长度为"+al.size());
14
15         Clerk clerk1=new Clerk("宋江",50,1000);
16         Clerk clerk2=new Clerk("吴用",45,1200);
17         Clerk clerk3=new Clerk("林冲",35,1500);
18
19         //添加职员对象
20         //有两种add方法,下面这种方式是将新对象添加到ArrayList的最后
21         //还有一种add方法是,将新对象添加到指定的位置
22         al.add(clerk1);
23         al.add(clerk2);
24         al.add(clerk3);
25         al.add(clerk1); //注意:可以重复添加一个对象
26         System.out.println("此时al的长度为"+al.size());
27
28         //遍历al,打印出每个职员的名字
29         for(int i=0;i<al.size();i++)
30         {
31             //需要实例化一个临时变量,来完成名字的读取
32             Clerk temp=(Clerk)al.get(i);
33             System.out.println("第"+i+"个人的名字为:"+temp.getName());
34         }
35
36         System.out.println("====删除吴用之后====");
37         //删除职员对象
38         al.remove(1);
39         for(int i=0;i<al.size();i++)
40         {
41             Clerk temp=(Clerk)al.get(i);
42             System.out.println("第"+i+"个人的名字为:"+temp.getName());
43         }
44     }
45
46 }
47
48 class Clerk
49 {
50     private String name;
51     private int age;
52     private int salary;
53
54     public String getName() {
55         return name;
56     }
57     public void setName(String name) {
58         this.name = name;
59     }
60     public int getAge() {
61         return age;
62     }
63     public void setAge(int age) {
64         this.age = age;
65     }
66     public int getSalary() {
67         return salary;
68     }
69     public void setSalary(int salary) {
70         this.salary = salary;
71     }
72
73     public Clerk(String name,int age,int salary)
74     {
75         this.name=name;
76         this.age=age;
77         this.salary=salary;
78     }
79
80 }

View Code

运行结果如下:

 1 此时al的长度为0
 2 此时al的长度为4
 3 第0个人的名字为:宋江
 4 第1个人的名字为:吴用
 5 第2个人的名字为:林冲
 6 第3个人的名字为:宋江
 7 ====删除吴用之后====
 8 第0个人的名字为:宋江
 9 第1个人的名字为:林冲
10 第2个人的名字为:宋江

View Code

21.2.2 LinkedList

链表

用法同ArrayList基本相同。

比ArrayList增加了一些方法,比如addFirst(往前面加)、addLast(往后面加)等。

21.2.3 Vector

向量

用法同ArrayList基本相同。

21.2.4 Stack

用法同ArrayList基本相同。

add时是往前面加。

21.4 Map结构的集合类

21.4.1 HashMap

 演示代码如下:

 1 /**日期:2016-03-06
 2  * 功能:HashMap,Hashtable演示
 3  */
 4 package test;
 5 import java.util.*;
 6 public class Demo3 {
 7
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10
11         //创建一个HashMap对象
12         HashMap hm=new HashMap();
13
14         Emp emp1=new Emp("s001","花荣",1200.5f);
15         Emp emp2=new Emp("s002","李逵",1010.5f);
16         Emp emp3=new Emp("s003","晁盖",1500.5f);
17         //将emp放到hm中,s001等为键(key),emp1等为值(value)
18         hm.put("s001", emp1);
19         hm.put("s002", emp2);
20         hm.put("s003", emp3);
21         hm.put("s001", emp3); //该条语句会用emp3覆盖emp1,结果s001对应emp1
22         hm.put("s001", emp1); //覆盖回来
23
24         //查找编号对应的员工
25         if(hm.containsKey("s001"))
26         {
27             System.out.println("有该员工!");
28             //取出该员工的姓名,hm.get("s001")为Object对象,需要转换成Emp对象,参考float转换成int
29             System.out.println("该员工的姓名为:"+((Emp)(hm.get("s001"))).getName());
30         }else
31         {
32             System.out.println("没有该员工!");
33         }
34         System.out.println();
35
36         //遍历HashMap中的所有key和value,稍微麻烦
37         //Iterator迭代
38         Iterator it=hm.keySet().iterator();
39         //hasNext返回一个boolean值
40         while(it.hasNext())
41         {
42             //取出key,it.next()为Object对象,通过头String()转换为String对象
43             String key=it.next().toString();
44             //通过key去除value
45             Emp emp=(Emp)hm.get(key);
46             System.out.println("员工编号:"+emp.getEmpNo());
47             System.out.println("员工姓名:"+emp.getName());
48             System.out.println("员工薪水:"+emp.getSal());
49         }
50         System.out.println();
51         //HashMap可以放入空值null
52         HashMap hm1=new HashMap();
53         hm1.put(null,null);
54         System.out.println("空值的结果为:"+hm1.get(null));
55     }
56
57 }
58
59 class Emp
60 {
61     private String EmpNo;
62     private String name;
63     private float sal;
64
65     public Emp(String EmpNo,String name,float sal)
66     {
67         this.EmpNo=EmpNo;
68         this.name=name;
69         this.sal=sal;
70     }
71
72     public String getEmpNo() {
73         return EmpNo;
74     }
75
76     public void setEmpNo(String empNo) {
77         EmpNo = empNo;
78     }
79
80     public String getName() {
81         return name;
82     }
83
84     public void setName(String name) {
85         this.name = name;
86     }
87
88     public float getSal() {
89         return sal;
90     }
91
92     public void setSal(float sal) {
93         this.sal = sal;
94     }
95 }

View Code

运行结果如下:

 1 有该员工!
 2 该员工的姓名为:花荣
 3
 4 员工编号:s001
 5 员工姓名:花荣
 6 员工薪水:1200.5
 7 员工编号:s002
 8 员工姓名:李逵
 9 员工薪水:1010.5
10 员工编号:s003
11 员工姓名:晁盖
12 员工薪水:1500.5
13
14 空值的结果为:null

View Code

21.4.2 Hashtable

用法同HashMap基本相同。

21.5 ArrayList和Vector的区别

ArrayList和Vector都是java的集合类,都可以用来存放java对象,这是它们的相同点,但是它们也是有区别的:

1、同步性:

Vector是同步的,这个类中的一些方法保证了Vector中的对象是线程安全的。

ArrayList是异步的,因此ArrayList中的对象并不是线程安全的。

因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合,那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。

Tricks:单机的程序一般不涉及同步性;做服务器的时候会涉及同步性。

2、数据增长:

从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你想这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度,它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据,那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

21.5 HashMap和Hashtable的区别

HashMap与Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是它们也有区别:

1、历史原因:

Hashtable是基于陈旧的Dictionary类的。

HashMap是java 1.2引进的Map接口的一个实现。

2、同步性:

Hashtable是同步的,这个类的一些方法保证了Hashtable中的对象是线程安全的。

HashMap是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合,那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。

3、值:HashMap可以让你将空值(null)作为一个表的条目的key或value,但是Hashtable是不能放入空值(null)的。

21.6 经验总结

进一步理解集合框架

Java的设计者给我们提供了这些集合类,在后面编程中是相当有用的,具体什么时候用什么集合,要根据我们刚才分析的集合异同来选取。

韩顺平经验总结:

1、如果要求线程安全,使用Vector、Hashtable;

2、如果不要求线程安全,应使用ArrayList、LinkedList、HashMap;

3、如果要求键值时,则使用HashMap、Hashtable;

4、如果数据量很大,又要线程安全考虑Vector。

转载于:https://www.cnblogs.com/PistonType/p/5251433.html

韩顺平循序渐进学java 第21.22.23.24讲 集合相关推荐

  1. 网沙(爱玩啥)韩顺平.循序渐进学.java.从入门到精通系列视频分享

     网沙(爱玩啥)韩顺平.循序渐进学.java.从入门到精通系列视频分享 韩顺平.循序渐进学.java.从入门到精通.第0讲-开山篇 韩顺平.循序渐进学.java.从入门到精通.第1讲-内容介绍.项 ...

  2. 韩顺平循序渐进学java 第13讲 抽象类.接口

    13.1抽象类 13.1.1 概念 当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,称为抽象方法,用abstract来修饰该类,称为抽象类. 13.1.2 抽象类-深入讨论 抽象 ...

  3. 韩顺平循序渐进学java 第10.11讲 继承.重载.覆盖

    10.1 继承-四大特征之三 10.1.1 概念 继承可以解决代码复用,让编程更加接近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定 ...

  4. 韩顺平循序渐进学java 第19讲 多维数组

    19.1 二维数组 高维数组在工作中用到的不多,所以只介绍二维数组. 1.定义 语法:类型 数组名[][]=new 类型[大小][大小] 比如:int a[][]=new int[2][3] 2.分析 ...

  5. 韩顺平循序渐进学java 第12讲 多态

    12.1 多态-四大特征之四 12.1.1 概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态. 可以这样理解:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 12.1.2 注意 ...

  6. 量化私募投资百亿头部量化私募企业在招岗位:《量化研究员》21/22/23届,校招/秋招/社招都看年base40-100万+bonus

    量化私募投资百亿头部量化私募企业 在招岗位:<量化研究员> 21/22/23届,校招/秋招/社招都看 年base40-100万+bonus(实盘+cut) 965上班制度 通过slam_p ...

  7. 【小白学Java】D19》》》Collection集合

    集合与数组的区别: 集合长度是可变的,数组的长度是固定的 数组中存储的是同一类型的元素,可以存储基本数据类型值,集合存储的都是对象,而且对象的类型可以不一致,在开发中一般当对象多的时期使用集合进行存储 ...

  8. 22.23.24.25.盒须图(boxplot)、棉棒图(Stem Plot; Lollipop plot)、极坐标图、雷达图(Radar Chart)

    22.盒须图(boxplot) 23.棉棒图(Stem Plot; Lollipop plot) 24.极坐标图 25.雷达图(Radar Chart) 22.盒须图(boxplot) 盒须图(也称为 ...

  9. 【java学习】从头再来一遍(附韩顺平_循序渐进学Java零基础【完整笔记】)

    计划任务 1.每天学习至少2个小时 2.完成教程中的课程作业 3.记录学习笔记 笔记下载-泉哥博客https://www.quange.cc/note/java/learn-java/712.html

最新文章

  1. 文件操作(ifstream、ofstream、fstream)
  2. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
  3. 基于队列的生产消费设计java_生产者-消费者设计模式
  4. 安装了email模块还是报错_科普:利用Python smtplib和email模块实现自动发送邮件功能...
  5. 服务器一键建php网站,搭建服务器 - 我的lnmp一键安装报错 - php中文网博客
  6. 函数式编程(Functional Programming)
  7. HibernateAnnotation入门实例
  8. linux里强制覆盖,Linux cp命令无法强制覆盖
  9. 图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!
  10. Matlab猜数字游戏GUI界面设计
  11. (娱乐项目)Python图片转换成矩阵数据,矩阵数据转换成图片
  12. Java拾遗补阙 ----- Super、This关键字使用总结
  13. 【NOIP practice】BSOJ 3140 冲出亚洲 模拟
  14. android 工具栏透明,Android 系统状态栏沉浸式/透明化完整解决方案
  15. ccd坏点测试软件,如何测试CCD坏点(ZT)
  16. php 统计中英混杂word文档字数,wordfrequencycount
  17. import和export
  18. 牛客编程巅峰赛S1第3场 - 黄金钻石 A.简单题 B.dfs C.并查集
  19. 机器学习Matplotlib的简单使用
  20. oracle通过UTL_SMTP包发送邮件

热门文章

  1. word度量单位无效_【一定要看】这篇Word毕业论文排版全攻略,25个技能请收藏好~...
  2. flash作业_在线作业产品的基本构成与逻辑分解
  3. Helm 3 完整教程(十七):Helm 流控制结构(1)if / else 语句
  4. 错误代码:1120当前Hsql数据库已被另一线程锁定
  5. Eclipse、IntelliJ IDEA、TortoiseSVN清除svn帐号
  6. 【软考】2021软件设计师复习开坑指南
  7. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题
  8. 2018届c++B 格雷码;调手表(lowbit运算)
  9. Unity3D基础9:获取鼠标键盘输入
  10. 关系代数操作应用、关系元组运算应用