博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA入门到精通-第24讲-容器、集合类
阅读量:6708 次
发布时间:2019-06-25

本文共 11597 字,大约阅读时间需要 38 分钟。

HashMap速度快的多;
HashMap这类的都是集合类,集合类能装好多东西;
1167156-20181130151016648-1817555980.png
 
1167156-20181130151017063-231290154.png
 
1167156-20181130151017373-711798409.png
 containsKey是hashMap的方法
1167156-20181130151017825-1619752455.png
 get("s002")
 键值对,一个键对应一个值;
 
1167156-20181130151018226-1051645582.png
 ArrayList如果 放了两个相同的不会覆盖;
 但是,HashMap会进行覆盖;
1167156-20181130151018575-1635016068.png
 hashMap会自动覆盖掉,不允许K重复,改为“李逵”;
 迭代器通过封装运算符,模拟指针的效果;保证各种容器的统一;
 hashMap的遍历:(迭代器的概念)
 Iterator
 hashNext 
 it.next()  取出Key,返回的是一个对象;
 .toString转为字符串;
把key放进去,因为返回的是object,将其转为Emp
1167156-20181130151018873-764804626.png
 
 Hashtable
 Map结构的集合类
1167156-20181130151019201-1189902637.png
 Hashtable和HashMap用法上完全一致;
1167156-20181130151019733-1078695179.png
 集合用来存放JAVA对象的;
 Hashtable线程同步;
 HashMap是异步的;效率高;
 
 
4个线程同时去操作这个Hashtable;
1号进行,2号进行,可能造成数据被破坏;“脏数据”;
“火车售票,的刷新抢票” 
  为了解决这个问题,用锁解决这个问题;
1在操作的 时候,2需要等待;
 
Hashtable有锁的机制;1在没放弃操作的时候,2-3需要等待;
同步有检测的机制,检测等待,造成效率的损失;
HashMap没有这个同步机制;
单机版的不涉及到服务器一般没有同步机制;
Hashtable不允许空值;空值异常;
1167156-20181130151021712-1778970514.png
 HashMap允许空值;
 
1167156-20181130151022709-647533795.png
 Vector是同步的,有同步机制,更为安全;
1167156-20181130151023714-1746430475.png
 Vector 一倍增长,2-4-8;
 ArryList  50%增长;
 如果存放大量数据,Vector;避免资源开销;
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; } }
70
 
1
import java.util.*;//集合类基本上在util包中
2
public class Demo139 {
3
   public static void main(String[] args) {
4
       //定义ArrayList对象
5
       ArrayList al=new ArrayList();
6
       //显示大小
7
       System.out.println("al大小:"+al.size());
8
       //向all中加入数据(类型是Object)
9
       //创建一个职员
10
       Clerk clerk1=new Clerk("宋江",50,1000);
11
       Clerk clerk2=new Clerk("吴用",45,1200);
12
       Clerk clerk3=new Clerk("林冲",35,1300);
13
       //将clerk1加入到al中
14
       al.add(clerk1);
15
       al.add(clerk2);
16
       al.add(clerk3);
17
       //可不可以放入同样的对象?
18
       al.add(clerk1);
19
       //显示大小
20
       System.out.println("al大小:"+al.size());
21
       //如何访问al中的对象(数据)
22
       //访问第一个对象
23
       //Clerk temp=(Clerk)al.get(0);
24
     
25
       //System.out.println("第一个人的名字是:"+temp.getName());
26
     
27
       //遍历al所有的对象(数据)
28
       for(int i=0;i
29
           Clerk temp=(Clerk)al.get(i);
30
           System.out.println("名字:"+temp.getName());
31
       }
32
       //如何从al中删除一个对象
33
       al.remove(1);
34
       System.out.println("===删除吴用===");
35
       //遍历al所有的对象(数据)
36
       for(int i=0;i
37
           Clerk temp=(Clerk)al.get(i);
38
           System.out.println("名字:"+temp.getName());
39
       }
40
   }
41
}
42
//定义一个员工类
43
class Clerk{
44
   private String name;
45
   private int age;
46
   private float sal;
47
   public Clerk(String name,int age,float sal){
48
       this.name=name;
49
       this.age=age;
50
       this.sal=sal;
51
   }
52
   public String getName() {
53
       return name;
54
   }
55
   public void setName(String name) {
56
       this.name = name;
57
   }
58
   public int getAge() {
59
       return age;
60
   }
61
   public void setAge(int age) {
62
       this.age = age;
63
   }
64
   public float getSal() {
65
       return sal;
66
   }
67
   public void setSal(float sal) {
68
       this.sal = sal;
69
   }
70
}

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集合类中的addFistaddLast方法");

        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;

    }

    //使用setget方法进行数据传递

    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;

    }

    //使用setget方法进行数据传递

    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;

    }

    //使用setget方法进行数据传递

    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;

    }

}

-------------------------------------------------------------------------------

集合框架--深入讨论

ArrayListVector的区别

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

1、同步性

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

2、数据增长

    从内部实现机制来讲ArrayListVector都是使用数组(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中所有的keyvalue

        //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;

    }

    //使用setget方法进行数据传递

    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();//HashtableHsahMap在用法上一致

        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;

    }

    //使用setget方法进行数据传递

    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;

    }

}

-------------------------------------------------------------------------------

HashMapHashtable集合类的区别

HashMapHashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别。

1、历史原因

Hashtable是基于陈旧的Dictionary类的,HashMapjava 1.2引进的Map接口的一个实现。

2、同步性

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

3、值

HashMap可以让你将空值作为一个表的条目的keyvalue但是Hashtable是不能放入空值的(null)

 

集合框架--深入讨论

进一步理解集合框架

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

 如何选用集合类?

1、要求线程安全,使用VectorHashtable

2、不要求线程安全,使用ArrayList,LinkedList,HashMap

3、要求keyvalue键值,则使用HashMap,Hashtable

4、数据量很大,又要线程安全,则使用Vector

 

转载于:https://www.cnblogs.com/xuxaut-558/p/10044301.html

你可能感兴趣的文章
BATJ互掐,哪家AI公司首先达到万亿美元市值? | 新智元AI技术峰会论坛
查看>>
hdu 1232 畅通工程 (并查集)
查看>>
MySql的用户权限
查看>>
java中finally和return的执行顺序
查看>>
Hibernate5-一对多双向关联-左外连接-HQL
查看>>
H3C防火墙出厂空配置管理口无法WEB登录
查看>>
使用NetWeaver创建数据库连接
查看>>
Spring事物、面向切面编程、依赖注入简介
查看>>
Java 中带参带返回值方法的使用
查看>>
开发中的各种时间格式转换(一)
查看>>
iSCSI安全之密码认证
查看>>
MySQL运维命令大全
查看>>
MySQL分区表(优化)
查看>>
linux定时任务crond那些事!
查看>>
mysql慢日志分析工具之mysqlsla学习笔记
查看>>
nginx基本配置与参数说明
查看>>
修改防火墙
查看>>
thinkphp中取部分字段用法
查看>>
Linux系统虚拟机管理及redhat7.2的安装
查看>>
handsontable 和 echarts都定义了require方法,初始化时冲突了,怎么办?
查看>>