• JAVA入门到精通-第24讲-容器、集合类


    HashMap速度快的多;
    HashMap这类的都是集合类,集合类能装好多东西;
     
     
     containsKey是hashMap的方法
     get("s002")
     键值对,一个键对应一个值;
     
     ArrayList如果 放了两个相同的不会覆盖;
     但是,HashMap会进行覆盖;
     hashMap会自动覆盖掉,不允许K重复,改为“李逵”;
     迭代器通过封装运算符,模拟指针的效果;保证各种容器的统一;
     hashMap的遍历:(迭代器的概念)
     Iterator
     hashNext 
     it.next()  取出Key,返回的是一个对象;
     .toString转为字符串;
    把key放进去,因为返回的是object,将其转为Emp
     
     Hashtable
     Map结构的集合类
     Hashtable和HashMap用法上完全一致;
     集合用来存放JAVA对象的;
     Hashtable线程同步;
     HashMap是异步的;效率高;
     
     
    4个线程同时去操作这个Hashtable;
    1号进行,2号进行,可能造成数据被破坏;“脏数据”;
    “火车售票,的刷新抢票” 
      为了解决这个问题,用锁解决这个问题;
    1在操作的 时候,2需要等待;
     
    Hashtable有锁的机制;1在没放弃操作的时候,2-3需要等待;
    同步有检测的机制,检测等待,造成效率的损失;

    HashMap没有这个同步机制;
    单机版的不涉及到服务器一般没有同步机制;
    Hashtable不允许空值;空值异常;

     HashMap允许空值;
     
     Vector是同步的,有同步机制,更为安全;

     Vector 一倍增长,2-4-8;
     ArryList  50%增长;
     如果存放大量数据,Vector;避免资源开销;


     

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

    List结构的集合类

    ArrayList类,LinkedList类,Vector类,Stack

    集合框架List结构集合类--ArrayList类的使用(无同步性,线程不安全)[Demo139.java]

    //java集合类用法--List结构--ArrayList

    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<al.size();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<al.size();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()+" 工资:"+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

     










  • 相关阅读:
    Win7下使用TortoiseGit设置保存密码
    MacOS软件清单
    ubuntu安装python
    Mac使用SSH连接远程服务器
    CentOS常用命令
    Docker追加容器端口映射
    Docker安装CentOS7
    Windows操作路由表
    Docker部署MySQL8并实现远程连接
    Qt——容器类(译)
  • 原文地址:https://www.cnblogs.com/xuxaut-558/p/10044301.html
Copyright © 2020-2023  润新知