java系统学习(十四) --------常用数据结构

来源:互联网 发布:手机ps软件 编辑:程序博客网 时间:2024/06/05 10:46

链表

什么是java中的链表

  如果把数组作为一种数据结构,可能更容易理解。数组这种结构有一个很大的缺点,数组中的所有元素都按序排列,如果要删除其中一个元素,后面的所有元素都需要依次
向前移动一个位置。如果这个数组中的元素很多,那么依次移动的次数就会明显增多,从而耗费大量的系统资源。
  为了解决这个问题,引入了链表。

  在Java语言中,链表中的元素存储在一条链的节点上,而不是像数组那样按序存储在一系列连续的空间中。

 

从图可以看出,如果在数组中删除一个元素,那么后面所有的元素都必须向前移动一位。如果元素比较多,那么移动的次数就会增加。从图中链表图中可以看出,删除一个元素时,只需将被删除元素的前一个元素的指针,指向被删除元素的后一个元素,使得被删除的元素脱离链表
就相当干删除了元素。链表不需要像数组那样移动元素,这样就节约了系统资源。


双向链表的结构如图


  双链表每个元素都拥有两个指针属性,一个是previous指针,一个是next指针。每个元素的next指针都会指向下一个元素本身,而下一个个元素的previous指针都会指向上一个元素本身。这样,
要删除元素就比较简单了,只需要让被删元素前面元素的previous指针.指向被删元素后面的元素本身,再将被删除元素后面元素的next指针,指向被删除元素的前面元素本身即可。


对链表的添加实例

当向链表添加元素素时,需要分析多种情况。
口插入到空表:如果链表是一个空表,只需使head指向被插入的节点即可。
口插入到头指针后面:若链表中的节点没有顺序,可将新节点插入到head之后,再让插入节点的next指针指向原head指针指向的节点即可。
口插入到链表最后:若链表中的节点没有顺序,也可将新节点插人到链表的最后。需将最后一个节点的next指针指向新节点,再将新节点的next指针设置为null即可。
口插入到链表的中间:这是比较复杂的一种情况.对干有序的链表,会用到这种情况。需要遍历链表,井对每个节点的关键字进行比较,找到合适的位置,再将新节点插人
对链表的删除实例。这种方式,需要修改插入位置前节点的next指针,使其指向新插入的节点,然后再将新插入节点的next指针设置为指向下一个节点。

Public class filel{      public void add(){              LinkedList List=new LinkedList();//创建一个链表类对象List              //添加元素到对象List里              List .add("王鹏");              List.add("王浩");              Lis七.add("王杰");              Lis七.add("张杰");              List.add("李杰");              List.add("孙文杰");              List.add("赵杰");              Iterator it=List.iterator();//创建一个迭代器对象it            system.out.println("现在添加了如下的同学的姓名");              //通过:迭代器对象it来遍历List对象中的元素             while(it.hasNext()){              System.out.Println(it.next());             }      system.out.println("删除某些同学的姓名后,还剩下哪些同学呢?");      it.remove();//移除元素      //创建另一个迭代器对象itl来重新遍历list对象中的元素        Iterator itl=List.iterator();        for(inti=0;i<List.size();i++){              System.out.Println(itl.next());          }      }   public static void main(string[} args){//主方法        filel  f=new filel();//创建对象f        f.add();//调用方法add()    }}


结果:

王鹏
王浩
王杰
张杰
李杰
孙文杰
赵杰
删除某些同学的姓名后还剩下哪些同学呢。
王鹏
王浩
王杰
张杰
李杰
孙文杰

因为第一个迭代器在遍历后,已经到了链表的末尾.所以必须再建立一个新的迭代器,重新让指针停留在链表第一个元素的前面。



对链表删除的实例

class student{  //创建一个学生类      //创建成员变量      String name;      int age;      String sexy;      String code;      String school;      String grade;      string major;      String address;      //创建两个student类型属性      studentx;      studenty;      student(String name){                this.name=name;      }//带参构造函数Public void set(int age,String sexy,string code,String scbool,              string grade,string major,string address){this .age=age;this .sexy=sexy;this .school=school;this .grade=grade;this.major=major;this.code=code;this.address=address;}//创建各种属性的访问器Public strinq getname(){          retUrn name;}Public string getcode(){          return name;}Public String getsexy(){          return sexy;}Public int getage(){          return age;}Public String getschool(){        return school;}public string getmajor(){        return major;}public Strinq getgrade(){return grade;}Public String getaddress(){return address'}//重写toString()方法是让对象以字符串的形式输出的方法Public String toString(){      string information="学生姓名:"+name+" "+"学号:"+code+" "+"性别:"                    +sexy+" "+"年龄:"+age+" "+"所在学校:"+school+" "                    +"所学专业:"+major+" "+"所在年级:"+grade+" "+"家庭地址:"                            +address;        return information;}}Public class file2{  //创建测试类file2      Publie static void main(string[] args){ //主方法            //创建10个学生对象            student stl=new student("王鹏");            student st2=new student("王浩");            student st3=new student("孙鹏");            student st4=new student("孙文君");            student st5=new student("谭妮");            student st6=new student("赵志强");            student st7=new student("王凯");            student st8=new student("苏瑞");            student st9=new student("张伟");            student st10=new student("张杰");              //设置学生信息st1.set(20,"男","10000","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st2.set(22,"男","10001","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st3.set(21,"男","10002","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st4.set(19,"女","10003","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st5.set(18,"女","10004","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st6.set(24,"男","10005","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st7.set(22,"男","10006","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st8.set(29,"女","10007","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st9.set(25,"女","10008","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");st10.set(28,"男","10009","重庆大学","大学三年级","计算机专业","重庆市沙坪坝区");try{LinkedList listl=new LinkedList(); //创建对象listl//添加10个学生对象到对象listl中listl.add(stl);listl.add(st2);listl.add(st3);listl.add(st4);listl.add(st5);listl.add(st6);listl.add(st7);listl.add(st8);listl.add(st9);listl.add(st10);//it是迭代器对象通过它来指向链表中的元素Iterator it=listl.iterator();System.out.println("以下就是所有的同学的信息:");while(it.hasNext()){//通过循环输出相应信息      system.out.println(it.next());}System.out.println("其中有几个同学已经转学了!");System.out.print1n("那么就从数据库中删除他:");//移除相应信息listl.relnove();listl.remove();listl.remove();listl.reynove();listl.remove();Iterator it1=List1.iterator();//获取迭代器对象itlwhile(itl.hasNext()){      System.out.Println(itl.next());}}catch(Exception e){}}}


数组列表类

什么是数组列表类

    数组的容量一旦被初始化就不可以再更改。这对于正在运行的程序来说,是一种缺陷。在程序设计过程中,经常会遇到一些不确定的因素,导致无法确定一个数组的容量。为了解决这个问题,java引进了数组列表。
    数组列表类就是数组的一个扩展类,它继承了数组的特点,并且具有自己的特性。
    数组列表就是一个可以动态变化容量的数组,其根据正在运行的程序的变化,随时改变数组的容量,以满足程序的需要。
    ArrayList类是Java API所提供的类,定义在Java.util包里,所以每次编写程序的时候都必
须引入这个包。数组列表中存放的是Object类型,因此在数组列表中存放的对象类型,以其原型的父类代替。如果要提取其中的元素,都要进行类型转换,将元素还原为它本身的类型。
    由于ArrayList是个可以自动伸缩的数组,所以可以无限制地向数组中添加新元素。另外,因为添加的是object类的子类类型,所以系统会自动地完成子类向父类的转换。
    如果能预计一个数组列表中需要存储多少元素,那么可以在填充之前,调用"ensureCapacity()"方法,使得系统分配一个包含固定容量的内部数组。


实例熟悉数组列表


数组列表(ArrayList)的构造函数和常用方法如下。
口ArrayList():这是一个默认构造函数,系统默认的初始化容量是10。
口ArrayList(Collection):构建一个数组列表的对象,这个数组列表中包含集合的所有元素。
口ArrayList(int initcapcity):构建一个指定初始化容量的数组列表对象。
口void add(int index,object element):在指定位置插入指定的元素。
口boolean add(object):在数组列表的末尾追加一个新元素。
口boolean contains(object element):测试指定的数组列表中是否包含有指定的元素element,如果包含该元素则返回true,反之返回false。
口int size():返回数组列表中包含元素的数量。
口void set(int index,object obj):设置数组列表指定位置元素的值,它会覆盖原来的内容。要强调的就是index必须在0到size()-1之间。
口object get(int index):得到指定位置存储的元素值。
口object remove(int index):删除指定位置的元素。



class teacher{//创建教师对象类      //创建成员变量    private string schoolname;//关于教师所在学校名称属性    private string classname;//关于教师所教班级名称属性    private string teachername;//关于教师姓名属性    private string teachercode://关于教师工号属性    private string teachersexy;//关于教师性别属性    private string teacherbirthday;//关于教师出生年月属性    private string familyaddress://关于教师家庭地址属性      //带参构造函数      public teacher(String teachernamee,String teachercode,String teachersexy,                    string teacherbirthday)(                this.teachername=teachername;              this.teachercode=teachercode;              this.teachersexy=teachersexy;              this.teacherbirthday=teacherbirthday;        }//关于各个属性的访问器public String getname(){          return teachername;}public String getcode(){        return teachercode;}public String getsexy(){        return teachersexy;}public String getbirthday(){        return teacherbirthday;}public void setschoolname(String schoolname){        this.schoolname=schoolname;}public void setclassname(String classname){        this.classname=classname;}public void setfamilyaddress(String familyaddress){this.familyaddress=familyaddress;}public String getschoalname(){return schoolname}public String getclassname(){ return classname;}public String getfamilyaddress(){        return familyaddress;}//重写toString()方法以使得对象能够以字符串形式输出的方法public String toString(){String infor="学校名称:"+schoolname+" "+"班级名称:"+classname+" "+"教师姓名:"+steachername+" "+"教师工号:"+teachercode+" "+"性别:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress; return infor;}}public class  testl{public static void main(String[] args){ArrayList al=new ArrayList();//创建7个教师对象teacher t=new teacher("孟凡良","34512","男","1954-09-23");teacher tl=new teacher("赵浩","1234001","男","1981-01-02");teacher t2=new teacher("黎平","1234002","男","1982-08-09");teacher t3=new teacher("王鹏","1234003","男","1982-11-22");teacher t4=new teacher("宋波","1234004","女","1982-11-02");teacher t5=new teacher("童伟","1234005","男","1980-01-12");teacher t6=new teacher("孙君","1234006","女","1981-09-22");//设置教师对象信息tl.setschoolname("重庆大学");tl.setclassname("计算机三班"’),tl.setfamilyaddress("重庆沙坪坝");t2.setschoolname("重庆大学"”);t2.setclassname("计算机三班");t2.setfamilyaddress("重庆沙坪坝");t3.setschoolname("重庆大学");t3.setclassname("计算机三班");t3.setfamilyaddress("重庆沙坪坝");t4.setschoolname("重庆大学");t4.setclassname("计算机三班");t4.setfamilyaddress("重庆沙坪坝");t5.setschoolname("重庆大学");t5.setclassname("计算机三班");t5.setfamilyaddress("重庆沙坪坝");t6.setschoolname("重庆大学");t6.setclassnarne("计算机三班");t6.setfamilyaddress("重庆沙坪坝");t.setschoolname("成都科技大学");t.setc1assname("机械系三班");t.setfamilyaddress("成都市区");//把每个对象添加到数组列表中去al.add(tl);al.add(t2);al.add(t3);al.add(t4);al.add(ts);al.add(t6);System.out.println("这个小组有"+al.size()+"个教师。");//输出数组列表中的元素个数for(int i=O;i<al .sizee();i++){        //输出数组列表中的元素以字符串形式        system.out.println((teacher)al.get(i));}System.out.println("对不起.系统出错了!有个教师信息错了,需要改正。");al.set(5,t);System.out.println("经过我们的审核后,教师信息如下:");for(int i=0;i<al.size();i++){        System.out.Println((teacher)al.get(i));}//删除数组列表中的元素al.remove(2);al.remove(4);System.out.println(”有两个教师辞职了,所以剩下教师信息为:");for(int i=O;i<al.size();i++){        //输出剩下的数组别表中的元素        System.out.Println((teacher)al.get(i));}}}





散列表

什么是散列表

   在链表和数组列表中,要想查找某个特定的元素,就必须从头开始遍历。如果一个链表或者一个数组列表拥有的元素数量很大,那么就需要耗费大量的系统资源,去遍历整个数据结构。如何克服这个弊病?此时,就引进了另一个数据结构:散列表。

   散列表通过“键一值对应”的形式存储元素。与链表和数组列表不同,它是一个无序的数据结构。


实例熟悉散列表

散列表(Hash table)的构造函数如下:
口Hashtable():构建一个空的散列表,初始容量为1l,负载因子为0.75。
口Hashtable(int initalCapacity,float loadFactor):指定初始化容量和负载因子,构造一个散列表。
口Hashtable(Map t):根据映像所包含的元素,构建一个散列表。


散列表(Hash table)的主要方法如下。
口object put( object key,object vaule):put方法是向一个散列表中添加元素。在散列表中根据所添加元素的键值来定位元素,这个键值是唯一的。针对这个方法,要记住这个键
  值一定是对象型数据。
口boolean containskey(object key)和boolean containvalue(object valt:e):这两个方法是测试散列表中是否包含指定的键值和值。
口Object remove(object key):根据指定的键值从散列表中删除对应键的元素。

口collection values():返回散列表中所包含元素的集合,是元素的集合,而不是key的集合。

class teacher{//创建教师对象类      //创建成员变量    private string schoolname;//关于教师所在学校名称属性    private string classname;//关于教师所教班级名称属性    private string teachername;//关于教师姓名属性    private string teachercode://关于教师工号属性    private string teachersexy;//关于教师性别属性    private string teacherbirthday;//关于教师出生年月属性    private string familyaddress://关于教师家庭地址属性      //带参构造函数      public teacher(String teachernamee,String teachercode,String teachersexy,                    string teacherbirthday)(                this.teachername=teachername;              this.teachercode=teachercode;              this.teachersexy=teachersexy;              this.teacherbirthday=teacherbirthday;        }//关于各个属性的访问器public String getname(){          return teachername;}public String getcode(){        return teachercode;}public String getsexy(){        return teachersexy;}public String getbirthday(){        return teacherbirthday;}public void setschoolname(String schoolname){        this.schoolname=schoolname;}public void setclassname(String classname){        this.classname=classname;}public void setfamilyaddress(String familyaddress){this.familyaddress=familyaddress;}public String getschoalname(){return schoolname}public String getclassname(){ return classname;}public String getfamilyaddress(){        return familyaddress;}//重写toString()方法以使得对象能够以字符串形式输出的方法public String toString(){String infor="学校名称:"+schoolname+" "+"班级名称:"+classname+" "+"教师姓名:"+steachername+" "+"教师工号:"+teachercode+" "+"性别:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress; return infor;}}public class  test2{public static void main(String[] args){Hashtable ht=new Hashtable();//创建7个教师对象teacher t=new teacher("孟凡良","34512","男","1954-09-23");teacher tl=new teacher("赵浩","1234001","男","1981-01-02");teacher t2=new teacher("黎平","1234002","男","1982-08-09");teacher t3=new teacher("王鹏","1234003","男","1982-11-22");teacher t4=new teacher("宋波","1234004","女","1982-11-02");teacher t5=new teacher("童伟","1234005","男","1980-01-12");teacher t6=new teacher("孙君","1234006","女","1981-09-22");tl.setschoolname("重庆大学");tl.setclassname("计算机三班"’),tl.setfamilyaddress("重庆沙坪坝");t2.setschoolname("重庆大学"”);t2.setclassname("计算机三班");t2.setfamilyaddress("重庆沙坪坝");t3.setschoolname("重庆大学");t3.setclassname("计算机三班");t3.setfamilyaddress("重庆沙坪坝");t4.setschoolname("重庆大学");t4.setclassname("计算机三班");t4.setfamilyaddress("重庆沙坪坝");t5.setschoolname("重庆大学");t5.setclassname("计算机三班");t5.setfamilyaddress("重庆沙坪坝");t6.setschoolname("重庆大学");t6.setclassnarne("计算机三班");t6.setfamilyaddress("重庆沙坪坝");t.setschoolname("成都科技大学");t.setc1assname("机械系三班");t.setfamilyaddress("成都市区");//在散列表中添加元素ht.put("zh",t1);ht.put("lp",t2);ht.put("wp",t3);ht.put("sb",t4);ht.put("zw",t5);ht.put("sj",t6);System.out.println("这个小组有"+ht.size()+"个教师。");System.out.println(ht.values());System.out.println("我需要查找一个教师的信息。");//输出散列表中的元素内容if (ht.containsKey("wh")){ System.out.println("找到了此教师的信息.如下:"); System.out.println((teacher)ht.get("ww"));}else{  System.out.println("没有找到此教师的信息!");}ht.remove("lp");//删除散列表中的元素ht .remove("sj");System.out.println("由于有些教师离开了学校,经过我们的审核后教师信息如下:");System.out,println(ht.values());//输出散列表中剩下的元素内容}}



散列集

什么是散列集

散列表和散列集这两种数据结构,功能基本相同,不过它们实现的接口不一样。散列表实现的是Map(映像)接口,而散列集实现了Set接口。另外,散列表是线性同步,而散列集是非线性同步。
    散列集( HashSet )既然实现了Set接口 ,也就实现了Collection接口,所以它是一个集合。仍然是add方法添加元素,接下来介绍散列集的构造函数和常用方法函数。
    散列集( HashSet)的构造函数如下:
    口HashSet():创建一个空的散列集对象。
    口HashSet(collection c):创建一个包含有collection集合中所有元素的散列集对象。
    口HashSet(int initialCapacity):创建一个初始容量为initialCapacity的散列集对象。
    口HashSet(int initialCapacity,float loadFactor):指定初始化容量和负载因子,构造一个散列表。它的初始容量是16,负载因子为0.75
    散列集(HashSet)的常用方法如下:
    口Boolean add(o):添加一个元素到散列集中。如果这个元素在散列集不存在,就直接添加它,否则就返回false
    口Boolean remove(o):删除一个元素,如果这个元素存在,就删除它,否则就返回false
    口Boolean isempty():判断集合是否为空。
    当然散列集的方法不止这些,此处只是列出其中常用的。在后面的程序中,还会遇到一些到时候再介绍。


实例熟悉散列集


class teacher{//创建教师对象类      //创建成员变量    private string schoolname;//关于教师所在学校名称属性    private string classname;//关于教师所教班级名称属性    private string teachername;//关于教师姓名属性    private string teachercode://关于教师工号属性    private string teachersexy;//关于教师性别属性    private string teacherbirthday;//关于教师出生年月属性    private string familyaddress://关于教师家庭地址属性      //带参构造函数      public teacher(String teachernamee,String teachercode,String teachersexy,                    string teacherbirthday)(                this.teachername=teachername;              this.teachercode=teachercode;              this.teachersexy=teachersexy;              this.teacherbirthday=teacherbirthday;        }//关于各个属性的访问器public String getname(){          return teachername;}public String getcode(){        return teachercode;}public String getsexy(){        return teachersexy;}public String getbirthday(){        return teacherbirthday;}public void setschoolname(String schoolname){        this.schoolname=schoolname;}public void setclassname(String classname){        this.classname=classname;}public void setfamilyaddress(String familyaddress){this.familyaddress=familyaddress;}public String getschoalname(){return schoolname}public String getclassname(){ return classname;}public String getfamilyaddress(){        return familyaddress;}//重写toString()方法以使得对象能够以字符串形式输出的方法public String toString(){String infor="学校名称:"+schoolname+" "+"班级名称:"+classname+" "+"教师姓名:"+steachername+" "+"教师工号:"+teachercode+" "+"性别:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress; return infor;}}public class  test3{public static void main(String[] args){HashSet hs=new HashSet();//创建7个教师对象teacher t=new teacher("孟凡良","34512","男","1954-09-23");teacher tl=new teacher("赵浩","1234001","男","1981-01-02");teacher t2=new teacher("黎平","1234002","男","1982-08-09");teacher t3=new teacher("王鹏","1234003","男","1982-11-22");teacher t4=new teacher("宋波","1234004","女","1982-11-02");teacher t5=new teacher("童伟","1234005","男","1980-01-12");teacher t6=new teacher("孙君","1234006","女","1981-09-22");tl.setschoolname("重庆大学");tl.setclassname("计算机三班"’),tl.setfamilyaddress("重庆沙坪坝");t2.setschoolname("重庆大学"”);t2.setclassname("计算机三班");t2.setfamilyaddress("重庆沙坪坝");t3.setschoolname("重庆大学");t3.setclassname("计算机三班");t3.setfamilyaddress("重庆沙坪坝");t4.setschoolname("重庆大学");t4.setclassname("计算机三班");t4.setfamilyaddress("重庆沙坪坝");t5.setschoolname("重庆大学");t5.setclassname("计算机三班");t5.setfamilyaddress("重庆沙坪坝");t6.setschoolname("重庆大学");t6.setclassnarne("计算机三班");t6.setfamilyaddress("重庆沙坪坝");t.setschoolname("成都科技大学");t.setc1assname("机械系三班");t.setfamilyaddress("成都市区");hs.add(t1);hs.add(t2);hs.add(t3);hs.add(t4);hs.add(t5);hs.add(t6);System.out.println("这个小组有"+hs.size()+"个教师。");//输出散列集的元素个数Iterator it=hs.iterator();while(it.hasNext()){        System.out.println(it.next());}hs.remove(t3);hs.remove(t4);System.out.println("由于有些教师离开了学校,经过我们的审核后,教师信息如下:");Iterator it1=hs.iterator();//新建一个迭代器对象while(it1.hasNext()){      System.out.println(itl.next());}System.out.println("这些教师今天都离职了,所有教师信息都可以删除了!");hs.remove(tl);//删除散列集中的元素hs.remove(t2);hs.remove(t5);hs.remove(t6);if (hs.isEmpty()){//当hs中的元素为空时      System.out.println("这里把教师信息都删除了");}else{System.out.println("系统报错了!!!");}}}



树集


什么是树集

树集有点像散列集,但与散列集不同,树集是一种有序的数据结构。可以使用各种次序往树集中添加元素。当遍历时,元素出现次序是有序的。不过这种次序由系统自动完成。
那么系统是如何对其进行自动排序的呢?系统每添加一个元素时,将按照字典顺序比较相应的字符串,按相应顺序来完成排序。


树集的构造函数和常用的方法函数。树集(TreeSet )的构造函数如下:
口TreeSet():创建一个空的树集对象。
口TreeSet(collection c):创建一个树集对象,并且用指定的比较器给它的元素排序。
口TreeSet(sortedSet element);创建一个树集,并把有序集element的所有元素插入树中,它使用与有序集element相同的元素比较器。


树集(TreeSet)的常用方法函数如下:
口Boolean add(object o):添加一个对象元素到树集中去。
口Boolean remove(object o):从树集中删除一个对象元素。



实例熟悉树集

class teacher implements Comparable{//设计实现Comparable接口的teacher      //创建成员变量    private string schoolname;//关于教师所在学校名称属性    private string classname;//关于教师所教班级名称属性    private string teachername;//关于教师姓名属性    private string teachercode://关于教师工号属性    private string teachersexy;//关于教师性别属性    private string teacherbirthday;//关于教师出生年月属性    private string familyaddress://关于教师家庭地址属性      //带参构造函数      public teacher(String teachernamee,String teachercode,String teachersexy,                    string teacherbirthday)(                this.teachername=teachername;              this.teachercode=teachercode;              this.teachersexy=teachersexy;              this.teacherbirthday=teacherbirthday;        }public int compareTo(Object o){ //实现方法compareToteacher t=(teacher) o;//转换成teacher对象return(t.teachercode - teachercode);}//关于各个属性的访问器public String getname(){          return teachername;}public String getcode(){        return teachercode;}public String getsexy(){        return teachersexy;}public String getbirthday(){        return teacherbirthday;}public void setschoolname(String schoolname){        this.schoolname=schoolname;}public void setclassname(String classname){        this.classname=classname;}public void setfamilyaddress(String familyaddress){this.familyaddress=familyaddress;}public String getschoalname(){return schoolname}public String getclassname(){ return classname;}public String getfamilyaddress(){        return familyaddress;}//重写toString()方法以使得对象能够以字符串形式输出的方法public String toString(){String infor="学校名称:"+schoolname+" "+"班级名称:"+classname+" "+"教师姓名:"+steachername+" "+"教师工号:"+teachercode+" "+"性别:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress; return infor;}}public class  test6{public static void main(String[] args){ThreeSet ts=new ThreeSet();//创建7个教师对象teacher t=new teacher("孟凡良","34512","男","1954-09-23");teacher tl=new teacher("赵浩","1234001","男","1981-01-02");teacher t2=new teacher("黎平","1234002","男","1982-08-09");teacher t3=new teacher("王鹏","1234003","男","1982-11-22");teacher t4=new teacher("宋波","1234004","女","1982-11-02");teacher t5=new teacher("童伟","1234005","男","1980-01-12");teacher t6=new teacher("孙君","1234006","女","1981-09-22");tl.setschoolname("重庆大学");tl.setclassname("计算机三班"’),tl.setfamilyaddress("重庆沙坪坝");t2.setschoolname("重庆大学"”);t2.setclassname("计算机三班");t2.setfamilyaddress("重庆沙坪坝");t3.setschoolname("重庆大学");t3.setclassname("计算机三班");t3.setfamilyaddress("重庆沙坪坝");t4.setschoolname("重庆大学");t4.setclassname("计算机三班");t4.setfamilyaddress("重庆沙坪坝");t5.setschoolname("重庆大学");t5.setclassname("计算机三班");t5.setfamilyaddress("重庆沙坪坝");t6.setschoolname("重庆大学");t6.setclassnarne("计算机三班");t6.setfamilyaddress("重庆沙坪坝");t.setschoolname("成都科技大学");t.setc1assname("机械系三班");t.setfamilyaddress("成都市区");ts.add(t1);ts.add(t2);ts.add(t3);ts.add(t4);ts.add(t5);ts.add(t6);System.out.println("这个小组有"+ts.size()+"个教师。");//输出树集的元素个数Iterator it=ts.iterator();while(it.hasNext()){        System.out.println(it.next());}hs.remove(t3);hs.remove(t4);System.out.println("由于有些教师离开了学校,经过我们的审核后,教师信息如下:");Iterator it1=ts.iterator();//新建一个迭代器对象while(it1.hasNext()){      System.out.println(itl.next());}System.out.println("这些教师今天都离职了,所有教师信息都可以删除了!");ts.remove(tl);//删除散列集中的元素ts.remove(t2);ts.remove(t5);ts.remove(t6);if (ts.isEmpty()){//当hs中的元素为空时      System.out.println("这里把教师信息都删除了");}else{System.out.println("系统报错了!!!");}}}  




映像

什么是映像


 集合是一种可以快速查找已存在元素的数据结构。但如果数据库中拥有大量的数据,一般不用集合,因为它会耗费系统大量的资源和时间,去遍历整个数据结构。
 前面讲过散列表,其实散列表就是一种映像。下面通过一个实例让读者对映像的概念有更深的认识。  

 映像是一种采用“键值一值”的对应方式存储数据的数据结构形式。在映像中,除了散列表,还有树映像和散列映像。由于映像不能使用迭代器,所以映像拥有get方法函数。无论是树映像,还是散列映像或散列表,它们的使用方法都差不多。


实例熟悉映像

下面通过实例了解树映像。

class teacher{      //创建成员变量    private string schoolname;//关于教师所在学校名称属性    private string classname;//关于教师所教班级名称属性    private string teachername;//关于教师姓名属性    private string teachercode://关于教师工号属性    private string teachersexy;//关于教师性别属性    private string teacherbirthday;//关于教师出生年月属性    private string familyaddress://关于教师家庭地址属性      //带参构造函数      public teacher(String teachernamee,String teachercode,String teachersexy,                    string teacherbirthday)(                this.teachername=teachername;              this.teachercode=teachercode;              this.teachersexy=teachersexy;              this.teacherbirthday=teacherbirthday;        }//关于各个属性的访问器public String getname(){          return teachername;}public String getcode(){        return teachercode;}public String getsexy(){        return teachersexy;}public String getbirthday(){        return teacherbirthday;}public void setschoolname(String schoolname){        this.schoolname=schoolname;}public void setclassname(String classname){        this.classname=classname;}public void setfamilyaddress(String familyaddress){this.familyaddress=familyaddress;}public String getschoalname(){return schoolname}public String getclassname(){ return classname;}public String getfamilyaddress(){        return familyaddress;}//重写toString()方法以使得对象能够以字符串形式输出的方法public String toString(){String infor="学校名称:"+schoolname+" "+"班级名称:"+classname+" "+"教师姓名:"+steachername+" "+"教师工号:"+teachercode+" "+"性别:"+teachersexy+" "+"出生年月:"+teacherbirthday+" "+"家庭地址:"+familyaddress; return infor;}}public class  test7{public static void main(String[] args){ThreeMap tm=new ThreeMap ();//创建6个教师对象teacher tl=new teacher("赵浩","1234001","男","1981-01-02");teacher t2=new teacher("黎平","1234002","男","1982-08-09");teacher t3=new teacher("王鹏","1234003","男","1982-11-22");teacher t4=new teacher("宋波","1234004","女","1982-11-02");teacher t5=new teacher("童伟","1234005","男","1980-01-12");teacher t6=new teacher("孙君","1234006","女","1981-09-22");tl.setschoolname("重庆大学");tl.setclassname("计算机三班"’),tl.setfamilyaddress("重庆沙坪坝");t2.setschoolname("重庆大学"”);t2.setclassname("计算机三班");t2.setfamilyaddress("重庆沙坪坝");t3.setschoolname("重庆大学");t3.setclassname("计算机三班");t3.setfamilyaddress("重庆沙坪坝");t4.setschoolname("重庆大学");t4.setclassname("计算机三班");t4.setfamilyaddress("重庆沙坪坝");t5.setschoolname("重庆大学");t5.setclassname("计算机三班");t5.setfamilyaddress("重庆沙坪坝");t6.setschoolname("重庆大学");t6.setclassnarne("计算机三班");t6.setfamilyaddress("重庆沙坪坝");//通过设置器赋值给对象tm.put("ab", t1);//添加对象到树映像tm.put("1p",t2);tm.put("wp",t3);tm.put("sb",t4);tm.put("zw",t5);tm.put("sj",t6);System.out.println("这个小组有"+tm.siae()+"个教师。");System.out.println(tm.values());tm.remove("lp");//删除树映像中的元素tm.remove("sb");System.out.println("帮我查找一下有没有孙君这个教师");if(tm.containsKey("sj")){        System.out.println("这个教师是存在的,他的信息如下:");          System.out.println((teacher)tm.get("sj"));} else{        System.out.println("这里没有这个教师。");}System.out.println("由于有些教师离开了学校,经过我们的审核后,教师信息如下:");System.out.println(tm.values());System.out.println("这些教师今天都离开了,所有教师信息都可以删除了!");tm.remove("zh");tm.remove("sj");tm.remove("zw");tm.remove("wp");if(tm.isEmpty()){        System.out.println("这里把教师信息都删除了");}else{          System.out.println("系统报错了!");}}  


常见问题

哪些是线程安全的数据结构

下面是线程安全的同步的类。
口Vector:比ArrayList多了个同步化机制(线程安全)。
口Statck:堆栈类,先进后出。
口Hashtable:比HashMap多了个线程安全。
口Enumeration:枚举,相当于迭代器。
除了这些之外,其他的都是非线程安全的类和接口。线程安全类的方法是同步的,每次只能一个访问,是重量级对象,效率较低。对干1卜线程安个的类和接口,在多线程中需要程序员
自己处理线程安全问题。


Vector是什么样的数据结构



答:没有讲述它的原因,是因为目前使用它的频率不高。一般用数组列表代替它,因为它们的使用方法几乎一样,唯独不同的就在线程安全方面。数组列表是非线程安全类,在实现线程编程时,要自己处理安全问题,而Vector则是线程安全类,会自动处理安全问题。

Vector类提供实现可增长数组的功能,随着更多元素加人其中,数组变得更大。在删除一些元素之后,数组变小。Vector有3个构造函数:
public  Vector(int initialCapacity,int capacityIncrement)
public  Vector(int initialCapacity)
public  Vector()
Vector运行时创建一个初始的存储容量initialCapacity.存储容量是以capacityIncrement变量定义的增量增长。初始的存储容量和capacityIncrement可以在Vector的构造函数中定义,第2个构造函数只创建初始存储容量。第3个构造函数既不指定初始的存储容量,也不指定capacityIncrement。 Vector类提供的访问方法,支持类似数组的运算,也支持与Vector大小相关的运算。类似数组的运算允许向量中增加、删除和插入元素。


0 0
原创粉丝点击