美文网首页
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面试题(二)

    Java 容器模块 1、Java 容器都有哪些?Java 容器分为 Collection 和 Map 两大类,其下...

  • 数据结构--容器汇总(java & Android)

    数据结构与算法容器概览(java)容器类框架分析(1)(java)ArrayList源码分析容器类框架分析(2)(...

  • java容器(1)

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

  • Java容器解析——ArrayList

    Java容器解析——ArrayList Java容器解析——LinkedList Java容器解析——Hashta...

  • Java容器解析——Hashtable

    Java容器解析——ArrayList Java容器解析——LinkedList Java容器解析——Hashta...

  • Java容器解析——LinkedList

    Java容器解析——ArrayList Java容器解析——LinkedList Java容器解析——Hashta...

  • Java面试题

    Java基础 容器 1.Java容器都有哪些 总体分为Collection 、Map,细分为List、Set、Ma...

  • Java 3 对象容器

    Ref:什么是泛型Java 容器 & 泛型(1):认识容器 3.1 顺序容器 我们首先学习的是顺序容器,即放进容器...

  • Java容器部分上(重要)

    1.java容器都有哪些?(容器指的是集合类) 基本概念 Java容器类类库的用途是“持有对象”,并将其划分为两个...

  • spring原理机制

    1,关于spring容器: Spring的核心是spring容器,该容器负责管理spring中的java组件。 A...

网友评论

      本文标题:java容器(1)

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