美文网首页
java容器(1)

java容器(1)

作者: 心跳小鹿_3a43 | 来源:发表于2020-03-22 16:00 被阅读0次

    1. ArrayList:底层实现时数组,线程不安全,效率高。所以,查询快。修改、插入、删除慢。

    2.LinkedList:底层实现的链表,线程不安全,效率高。所以,查询慢。修改、插入、删除快。

    3. Vector:线程安全,效率低。

    一.数组容器方法实现

    4.  package cn.yulei.opp.collectior;

    public class Test02 {

        private Object[]elementDate;

      private int size;

    public int size(){

      return size;

    }

       public Test02(){

       this(10);

     }

      public Test02(int initialCapacity){

      if(initialCapacity<0){

               try {

                 throw new Exception();

              }catch (Exception e) {

                e.printStackTrace();

           }

           }

            elementDate=new Object[initialCapacity];

        }

       public void mm(Object obj){   //将数组元素赋值给数组容器

               ensureCapacity();

                  elementDate[size++]=obj;

               }

       //数组扩容   封装方法

    private void ensureCapacity(){

         if(size==elementDate.length){

                Object[]newArray=new Object[size*2+1];

              System.arraycopy(elementDate,0, newArray,0,elementDate.length);

             elementDate=newArray;

           }

      }

    //获取数组的索引

        public Object get(int index){

            if(index<0||index>=size){

             try {

                throw new Exception();

               }catch (Exception e) {

               e.printStackTrace();

              }

          }

          return elementDate[index];

        }

      //指定位置删除

       public void remove(int index){

         rangeCheck(index);

            int newnum=size-index-1;

           if(newnum>0){

           System.arraycopy(elementDate, index+1, elementDate, index, newnum);

            }

          elementDate[--size]=null;

      }

      public void remove(Object obj){

         for(int i=0;i<size;i++){

               if(get(i).equals(obj)){   //底层调用的equals方法而不是==。

                remove(i);

           }

            }

      }

      public Object set(int index,Object obj){  //修改数组元素

           rangeCheck(index);

          Objectoldvalue=elementDate[index];

           elementDate[index]=obj;

      return oldvalue;

      }

       public void add(int index,Object obj){//数组扩容

       rangeCheck(index);

      ensureCapacity();

       System.arraycopy(elementDate,index,elementDate,index+1,size-index);

          size++;

        }    //数组元素的复制

    //index的范围检测    封装方法

    private void rangeCheck(int index){    

        if(index<0||index>=size){

          try {

                  throw new Exception();

              }catch (Exception e) {

               e.printStackTrace();

              }

          }

      }

       public static void main(String[] args) {

           Test02tt=new Test02(3);

           tt.mm("235");

            tt.mm("8897");

          tt.mm("7897");

         tt.mm("656");

           tt.mm("684");

            tt.remove(3);

           System.out.println(tt.size());

            System.out.println(tt.get(2));

      }

    }


    二.链表的实现

    1.    package cn.yulei.opp.collectior;

    public class SxtLinkedList {

        private Node first;

        private Node last;

        private int size;

        //容器添加链表

        public void add(Object obj){

            Node  n=new Node();

            if(first==null){

                n.setPrevious(null);

                n.setObj(obj);

                n.setNext(null);

                first=n;

                last=n;

            }else{

                n.setPrevious(last);

                n.setObj(obj);

                n.setNext(null);

                last.setNext(n);

                last=n;

            }

            size++;

        }

        public  int size(){

            return size;

        }

        //检测索引的封装方法

        private void rangecheck(int index){

            if(index<0||index>=size){

                try {

                    throw new Exception();

                }catch (Exception e) {

                    e.getStackTrace();

                }

            }

        }

        //获取链表中某索引处的节点

        public Node node(int index){

            Nodetemp=null;

            if(first!=null){

                temp=first;

                for(int i=0;i<index;i++){

                    temp=temp.next;

                }  

            }

            return temp;

        }

        //获取链表中某索引处的节点的值

        public  Object get(int index){

            rangecheck(index);

            Nodetemp=node(index);

            if(temp!=null){

                return temp.obj;

            }

            return null;

        }

        //删除链表中的某索引处的节点

        public  void remove(int index){

            rangecheck(index);

            Nodetemp=node(index);

            if(temp!=null){

                Nodeup=temp.previous;

                Nodedown=temp.next;

                up.next=down;

                down.previous=up;

                size--;

            }  

        }

        //在链表中某索引处添加节点

        public void increase(int index,Object obj){

            rangecheck(index);

            Nodetemp =node(index);

            Nodenewnode=new Node();

            newnode.obj=obj;

            if(temp!=null){

                Nodeup=temp.previous;

                up.next=newnode;

                newnode.previous=up;

                newnode.next=temp;

                temp.previous=newnode;

            }

        }

        public static void main(String[] args) {

            SxtLinkedList  List=new SxtLinkedList();

            List.add("456");

            List.add("aaa");

            List.add("mmm");

    //      List.remove(1);  //调用删除的方法

            List.increase(1,"BBB");  //添加方法

            System.out.println(List.size());

            System.out.println(List.get(1));

        }

    }


    2. package cn.yulei.opp.collectior;

    public class Node {

        Nodeprevious;

        Object obj;

        Nodenext;

        public Node(){

        }

        public Node(Node previous, Object obj, Node next) {

            super();

            this.previous = previous;

            this.obj = obj;

            this.next = next;

        }

        public Node getPrevious() {

            return previous;

        }

        public void setPrevious(Node previous) {

            this.previous = previous;

        }

        public Object getObj() {

            return obj;

        }

        public void setObj(Object obj) {

            this.obj = obj;

        }

        public Node getNext() {

            return next;

        }

        public void setNext(Node next) {

            this.next = next;

        }  

    }


    4.Map类

           实现map接口的类用来储存键(key)-值(value)对;

           Map存放键值对,根据键对象找对应的值对象,键不能重复。

           Map接口是实现类有HashMap和TreeMap等

           Map类中储存的键-值对通过键来标识,所以键值不能重复;

    HashMap:

    voidclear()从此映射中移除所有映射关系。

    booleancontainsKey(Objectkey)

    如果此映射包含对于指定键的映射关系,则返回 true

    remove(Objectkey)

    从此映射中移除指定键的映射关系(如果存在)。(只是移除了容器中的地址,但是还可以调用)

     intsize()返回此映射中的键-值映射关系数。

    Set<K>keySet()

    返回此映射中所包含的键的Set视图。

    Vget(Objectkey)

    返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。

    Vput(Kkey,Vvalue)

    在此映射中关联指定值与指定键。


    5.Set:无序   不可重复

    List:有序   可重复

    List 可以用For遍历    但set不能(他没有顺序)

    Set用迭代器遍历     迭代器两者都能遍历

    看w3c中Hashset类


    6.数据的存储

    看collection包


    7.迭代器:Iterator的对象称作迭代器  它本身是一个接口,用以方便的实现对容器内元素的遍历操作。

    Iterator接口定义方法如下

         Boolean hasNext()   判断是否有元素没有被遍历

         Object next()       返回游标当前位置的元素并将游标移到下一位

    Void remove()       删除游标左边的元素,在执行next之后再执行   只执行一次

    importjava.util.Iterator;

    importjava.util.List;

    importjava.util.Set;

    public class Test1 {

        public static void main(String[] args) {

            Listlist =newArrayList();

            list.add("aaa");

            list.add("bbb");

            list.add("ccc");

            //迭代器的使用 也可以用for中不需要++ 因为next()方法中已经加了

            for(Iteratoriter=list.iterator();iter.hasNext();){

                Stringstr=(String)iter.next();

                System.out.println(str);

            }

            Setset =newHashSet();

            set.add("111");

            set.add("222");

            set.add("333");

            for(Iteratoriter2=set.iterator(); iter2.hasNext();){

                Stringr=(String) iter2.next();

                System.out.println(r);

            }

        }

    }


    8.泛型

       (1)概念:泛型就是参数化类型,使用广泛的类型

       (2)起因:数据类型不明确:

            ——装入数据类型都被当做Object数据类型对待,从而“丢失”自己的实际类型。

            ——获取数据时往往需要转型,效率低容易产生错误。

      作用

            ——安全:在编译的时候检查类型安全。

            ——省心:所有的强制转换都是自动和隐式的,提高代码的重用率。

      (3)声明时使用泛型

      字母:T   Type表示类型

          K V分别代表键值中的key value

          E代表Element

      (4)使用时确定类型

                1.泛型只能使用引用类型,不能基本类型

                2.泛型声明时字母不能使用静态属性   静态方法上。

                注意:接口中泛型字母只能使用在方法中,不能使用在全局常量中。(接口中全局常量就是静态)

                  泛型方法: <>返回类型前面

                  只能访问对象的信息,不能修改信息。

    (5)自定义泛型:

                子类继承父类:

                      父类为泛型类:属性方法

                         要么同时擦除,要么子类大于等于父类的类型。

                         不能子类擦除,父类泛型

                    1属性类型:父类中随父类而定。子类中随子类而定。

                    2.方法重写:随父类而定。

                    如果不指定类型的话就object类型

                    父类泛型擦除使用object替换.

                如下有几种

                (1)子类声明时父类指定具体类属性类型为具体类  方法同理

                (2)子类为泛型类,类型在使用时确定。

                (3)子类为泛型,父类不指定类型,泛型的擦除,使用object替换。

                (4)子类和父类同时擦除.

                   Java一个文件中只能有个public类在类外的类的不能定义public   父类为public类  子类不能定义为public类

                接口泛型:与继承同理

    (6)Object类型

    编译器警告消除  使用Object泛型  

    没有泛型的类其类型不完全等于Object,编译时不会类型检查。


    9.Hashmap经典存储

                                 For(Stringtemp:StrArray){}

                                   其中StrArray是一个数组

                              每次遍历此数组,用新建的对象temp保存

     Map 的containsKey() 方法来检测数据(value)是否存在, 如果key存在, 则表明已经获取过一次数据, 那么直接返回该 key 在 Map 中的值. 不管是否为 null 都直接返回; 如果 key 不存在, 则去生成或者获取数据, 并放入到 Map 中, 并返回该数据.

    package cn.yulei.zidingyi;

    import java.util.HashMap;

    import java.util.Map;

    import java.util.Set;

    /**

    * 将字符串存储到Map中

    * Key:String

    * value:自定义类型

    *

    * “快递分拣”思路

    * 1.为所有的key创建容器

    *  之后容器中存放对应的value

    *  2.第一次创建容器  ,并存放值value

    *  第二次之后,直接使用容器存放值

    */

    public class Deme01 {

    public static void main(String[] args) {

    //2.第一次创建容器  ,并存放值value

                    //  第二次之后,直接使用容器存放值

            String str="this is a cat and that is a mice and where is the food";

    //分割字符串

            String[]    strArrray=str.split("");

    //存储到Map中

            Map letters =new HashMap();

    Letter cols=null;

    for (String temp:strArrray){

    if (null==(letters.get(temp))){

    cols=new Letter();

    cols.setCount(1);

    letters.put(temp,cols);

    }else {

    cols.setCount(cols.getCount() +1);

    }

    }

    Set keys=letters.keySet();

    for (String key:keys){

    Letter col=letters.get(key);

    System.out.println("字母"+key+"字母的次数"+col.getCount());

    }

    }

    public static  void test01(){

    String str="this is a cat and that is a mice and where is the food";

    //分割字符串

            String[]    strArrray=str.split("");

    //存储到Map中

            Map letters =new HashMap();

    for (String temp:strArrray){

    /**

                * 1.为所有的key创建容器

                */

                if (!letters.containsKey(temp)){

    letters.put(temp,new Letter());

    }

    //之后容器中存放对应的value值

                Letter col=letters.get(temp);///直接使用容器

                col.setCount(col.getCount()+1);

    }

    //输出map的值

            Set keys=letters.keySet();

    for (String key:keys){

    Letter col=letters.get(key);

    System.out.println("字母"+key+"字母的次数"+col.getCount());

    }

    }

    }


    (2)//map面向对象存储

    Demo类:

    package cn.yulei.zidingyi;

    import java.util.*;

    /**

    * 定义一个student类,属性name 姓名, id 班号,score成绩

    *定义一个班级类ClassRoom类  ,属性   id  班号,stus 学生列表  ,total  学生总分

    * 现在将若干个student对象放入list,请统计出每个班级的总分和平均分,分别打印出来

    */

    public class Demo02 {

    public static void main(String[] args) {

    List list =new ArrayList();

    exam(list);

    Map rooms=new HashMap();

    count(list,rooms);

    printscore(rooms);

    }

    //统计总分

        public  static  void  count(List list,Map rooms){

    for (Student stu:list){

    String id=stu.getId();

    Double score=stu.getScore();

    //根据班级的编号查看map是否存在该班级  分拣思路

                ClassRoom room=rooms.get(id);

    if (null==room){//第一次

                    room=new ClassRoom(id);

    rooms.put(id,room);

    }

    //存储  总分

                room.setTotal(room.getTotal()+score);

    room.getStus().add(stu);//加入学生

            }

    }

    //打印总分与平均分

        public static  void printscore(Map rooms){

    Set>  entrySet=rooms.entrySet();

    for (Iterator> it=entrySet.iterator();it.hasNext();){

    Map.Entry entry=it.next();

    ClassRoom room=entry.getValue();

    double aug=room.getTotal()/room.getStus().size();

    System.out.println("班级名为"+room.getId()+"总分"+room.getTotal()+"平均分"+aug);

    }

    }

    //现在将若干个student对象放入list

        public  static  void  exam(List list){

    list.add(new Student("小明","01",90));

    list.add(new Student("小张","02",60));

    list.add(new Student("小红","01",90));

    list.add(new Student("小三","03",100));

    list.add(new Student("小五","02",80));

    }

    }

    Student  学生类

    package cn.yulei.zidingyi;

    public class Student {

    private  Stringname;

    private  Stringid;

    private  double score;

    public  Student(){

    }

    public Student(String name, String id,double score) {

    this.name = name;

    this.id = id;

    this.score = score;

    }

    @Override

        public String toString() {

    return "Student{" +

    "name='" +name +'\'' +

    ", id='" +id +'\'' +

    ", score=" +score +

    '}';

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public String getId() {

    return id;

    }

    public void setId(String id) {

    this.id = id;

    }

    public double getScore() {

    return score;

    }

    public void setScore(double score) {

    this.score = score;

    }

    }

    ClassRoom班级类:

    package cn.yulei.zidingyi;

    import java.util.ArrayList;

    import java.util.List;

    public class ClassRoom {

    private Stringid;

    private Liststus;//学生列表

        private  double  total;//班级总分

        public  ClassRoom(){

    stus=new ArrayList();//初始化一下stus,方便后面直接添加

        }

    public ClassRoom(String id) {

    this();

    this.id = id;

    }

    public String getId() {

    return id;

    }

    public void setId(String id) {

    this.id = id;

    }

    public List getStus() {

    return stus;

    }

    public void setStus(List stus) {

    this.stus = stus;

    }

    public double getTotal() {

    return total;

    }

    public void setTotal(double total) {

    this.total = total;

    }

    }

    相关文章

      网友评论

          本文标题:java容器(1)

          本文链接:https://www.haomeiwen.com/subject/axrvyhtx.html