JAVA入门到精通-第24讲-容器、集合类
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151016648-1817555980.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151017063-231290154.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151017373-711798409.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151017825-1619752455.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151018226-1051645582.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151018575-1635016068.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151018873-764804626.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151019201-1189902637.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151019733-1078695179.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151021712-1778970514.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151022709-647533795.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151023714-1746430475.png)
![](https://img2018.cnblogs.com/blog/1167156/201811/1167156-20181130151024202-1677613427.png)
从上面的图可以看出java集合类主要有以下几种:
List结构的集合类
ArrayList类,LinkedList类,Vector类,Stack类
集合框架List结构集合类--ArrayList类的使用(无同步性,线程不安全)[Demo139.java]
//java集合类用法--List结构--ArrayList类
import java.util.*;//集合类基本上在util包中
public class Demo139 {
public static void main(String[] args) {
//定义ArrayList对象
ArrayList al=new ArrayList();
//显示大小
System.out.println("al大小:"+al.size());
//向all中加入数据(类型是Object)
//创建一个职员
Clerk clerk1=new Clerk("宋江",50,1000);
Clerk clerk2=new Clerk("吴用",45,1200);
Clerk clerk3=new Clerk("林冲",35,1300);
//将clerk1加入到al中
al.add(clerk1);
al.add(clerk2);
al.add(clerk3);
//可不可以放入同样的对象?
al.add(clerk1);
//显示大小
System.out.println("al大小:"+al.size());
//如何访问al中的对象(数据)
//访问第一个对象
//Clerk temp=(Clerk)al.get(0);
//System.out.println("第一个人的名字是:"+temp.getName());
//遍历al所有的对象(数据)
for(int i=0;i<al.size();i++){
Clerk temp=(Clerk)al.get(i);
System.out.println("名字:"+temp.getName());
}
//如何从al中删除一个对象
al.remove(1);
System.out.println("===删除吴用===");
//遍历al所有的对象(数据)
for(int i=0;i<al.size();i++){
Clerk temp=(Clerk)al.get(i);
System.out.println("名字:"+temp.getName());
}
}
}
//定义一个员工类
class Clerk{
private String name;
private int age;
private float sal;
public Clerk(String name,int age,float sal){
this.name=name;
this.age=age;
this.sal=sal;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
LinkedList集合类的使用方法[Demo141.java]
//LinkedList集合类的使用
import
java.util.*;
public
class Demo141 {
public static void main(String[] args) {
LinkedList ll=new LinkedList();
Empp emp1=new
Empp("sa01","aa",1.2f);
Empp emp2=new
Empp("sa02","bb",1.2f);
Empp emp3=new
Empp("sa03","cc",1.2f);
//addFirst表示把emp1加载(链表)队列的最前面
ll.addFirst(emp1);//addFirst方法是可以插入在数组之前
ll.addFirst(emp2);//也可以理解为addFirst方法是后进先出的方法
//addLast表示把emp3加载(链表)队列的后面
ll.addLast(emp3);
System.out.println("测试LinkedList集合类中的addFist及addLast方法");
for(int i=0;i<ll.size();i++){
System.out.println(((Empp)ll.get(i)).getName());
}
//remove表示将某一条数据进行删除
ll.remove(emp1);//将ll中的emp1数据删除
System.out.println("测试LinkedList集合类中的remove方法");
for(int i=0;i<ll.size();i++){
System.out.println(((Empp)ll.get(i)).getName());
}
ll.removeAll(ll);//清除整个链表
System.out.println("测试LinkedList集合类中的remmoveall方法");
for(int i=0;i<ll.size();i++){
System.out.println(((Empp)ll.get(i)).getName());
}
}
}
//创建员工类
class
Empp{//在同一个包中的类,可以同包中的其它class文件直接访问或调用
//定义成员变量工号、姓名、薪水
private String empNo;
private String name;
private float sal;
//创建构造函数,初始化成员变量
public Empp(String empNo,String name,float
sal){
this.empNo=empNo;
this.name=name;
this.sal=sal;
}
//使用set、get方法进行数据传递
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
===============================================================================
Vector集合类的使用(线程安全具有同步性) [Demo142.java]
//Vector集合类(向量)的使用方法
import
java.util.*;
public
class Demo142 {
public static void main(String[] args) {
//Vector的用法
Vector vv=new Vector();
AEmp emp1=new
AEmp("1","aa",1.2f);
AEmp emp2=new
AEmp("2","bb",1.2f);
AEmp emp3=new
AEmp("3","cc",1.2f);
vv.add(emp1);
vv.add(emp2);
vv.add(emp3);
//遍历
for(int i=0;i<vv.size();i++){
AEmp emp=(AEmp)vv.get(i);
System.out.println(emp.getName());
}
}
}
//创建员工类
class
AEmp{
//定义成员变量工号、姓名、薪水
private String empNo;
private String name;
private float sal;
//创建构造函数,初始化成员变量
public AEmp(String empNo,String name,float
sal){
this.empNo=empNo;
this.name=name;
this.sal=sal;
}
//使用set、get方法进行数据传递
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
===============================================================================
Stack集合类(栈)的使用[Demo143.java]
//Stack集合类(栈)的使用方法
package
com.haiding.set;
import
java.util.*;
public
class Demo143 {
public static void main(String[] args) {
//Stack的用法
Stack stack=new Stack();
AEmp emp1=new
AEmp("s1","aa",1.2f);
AEmp emp2=new
AEmp("s2","bb",1.2f);
stack.add(emp1);
stack.add(emp2);
for(int i=0;i<stack.size();i++){
System.out.println(((AEmp)stack.get(i)).getName());
}
}
}
//创建员工类
class
AEmp{
//定义成员变量工号、姓名、薪水
private String empNo;
private String name;
private float sal;
//创建构造函数,初始化成员变量
public AEmp(String empNo,String name,float
sal){
this.empNo=empNo;
this.name=name;
this.sal=sal;
}
//使用set、get方法进行数据传递
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
-------------------------------------------------------------------------------
集合框架--深入讨论
ArrayList和Vector的区别
ArrayList与Vector都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别:
1、同步性
Vector是线程同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是线程异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
2、数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
===============================================================================
Map结构的集合类
HashMap类,Hashtable类
HashMap集合类的使用[Demo143.java]
//HashMap集合类的使用
import java.util.*;
public class Demo143 {
public
static void main(String[] args) {
//创建HashMap对象
HashMap hm=new HashMap();
Emp
emp1=new Emp("s001","aa",3.4f);
Emp
emp2=new Emp("s002","bb",5.6f);
Emp
emp3=new Emp("s003","cc",1.2f);
//将emp放入到hm中
//hm.put(null,null);//可以放空值
hm.put("s001",
emp1);
hm.put("s002",
emp2);
hm.put("s002",
emp3);//不允许key重复,所以emp3会覆盖emp2
//如果你要查找编号是s002
if(hm.containsKey("s002")){//取键值containsKey
System.out.println("有该员工");
//如何取出,键<key>值
Emp
emp=(Emp)hm.get("s002");
System.out.println("名字"+emp.getName());
}else{
System.out.println("没该员工");
}
//遍历HashMap中所有的key和value值
//Iterator迭代
Iterator
it=hm.keySet().iterator();
//hasNext返回一个boolean值
while(it.hasNext()){
//如果有下一个取出key值
String
key=it.next().toString();
//通过key取出value
Emp
emp=(Emp)hm.get(key);
System.out.println("名字:"+emp.getName());
System.out.println("工资:"+emp.getSal());
}
}
}
//创建员工类
class Emp{
//定义成员变量工号、姓名、薪水
private
String empNo;
private
String name;
private
float sal;
//创建构造函数,初始化成员变量
public
Emp(String empNo,String name,float sal){
this.empNo=empNo;
this.name=name;
this.sal=sal;
}
//使用set、get方法进行数据传递
public
String getEmpNo() {
return
empNo;
}
public
void setEmpNo(String empNo) {
this.empNo
= empNo;
}
public
String getName() {
return
name;
}
public
void setName(String name) {
this.name
= name;
}
public
float getSal() {
return
sal;
}
public
void setSal(float sal) {
this.sal
= sal;
}
}
-------------------------------------------------------------------------------
Hashtable集合类的使用(Hashtable具有同步性,线程安全)
import java.util.*;
public class Demo144{
public
static void main(String []args){
Hashtable
ht=new Hashtable();//Hashtable与HsahMap在用法上一致
Emp
emp4=new Emp("s101","a1",2.2f);
Emp
emp5=new Emp("s102","a2",1.2f);
Emp
emp6=new Emp("s103","a3",4.2f);
ht.put("s101",
emp4);
ht.put("s102",
emp5);
ht.put("s103",
emp6);
//遍历
for(Iterator
it=ht.keySet().iterator();it.hasNext();){
String
key=it.next().toString();
Emp
emp=(Emp)ht.get(key);
System.out.println("名字:"+emp.getName()+"\t工资:"+emp.getSal());
}
}
}
//创建员工类
class Emp{
//定义成员变量工号、姓名、薪水
private
String empNo;
private
String name;
private
float sal;
//创建构造函数,初始化成员变量
public
Emp(String empNo,String name,float sal){
this.empNo=empNo;
this.name=name;
this.sal=sal;
}
//使用set、get方法进行数据传递
public
String getEmpNo() {
return
empNo;
}
public
void setEmpNo(String empNo) {
this.empNo
= empNo;
}
public
String getName() {
return
name;
}
public
void setName(String name) {
this.name
= name;
}
public
float getSal() {
return
sal;
}
public
void setSal(float sal) {
this.sal
= sal;
}
}
-------------------------------------------------------------------------------
HashMap和Hashtable集合类的区别
HashMap与Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别。
1、历史原因
Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个实现。
2、同步性
Hashtable是线程同步的。这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是线程异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
3、值
HashMap可以让你将空值作为一个表的条目的key或value但是Hashtable是不能放入空值的(null)
集合框架--深入讨论
进一步理解集合框架
java的设计者给我们提供了这些集合类,在后面编程中是相当有用的,具体什么时候用什么集合,要根据我们刚才分析的集合异同来选取。
如何选用集合类?
1、要求线程安全,使用Vector、Hashtable
2、不要求线程安全,使用ArrayList,LinkedList,HashMap
3、要求key和value键值,则使用HashMap,Hashtable
4、数据量很大,又要线程安全,则使用Vector