美文网首页
三、Java中级--5、集合框架

三、Java中级--5、集合框架

作者: cybeyond | 来源:发表于2018-05-02 17:55 被阅读0次

    1、什么是集合、框架

    集合:用来存放很多元素的一种类型,可称为集合容器,集合中存储的是对象的引用,其对象实质上存在堆(heap,内存分配的空间)里
    框架:结构体系,很多类组成
    Java Collection Framework:Java集合框架,又称为JCF

    2、数组和集合的关系

    数组的缺点是定长的,且只能存同一种类型

    3、结构

    Java1.8即为Java8,Java1.7即为Java7

    • collection是最顶层,是一个接口,在java API文档的java.util包中
      • List子接口:ArrayList、LinkedList、Vector
      • Set子接口:
        • HashSet(无序):底层存储是哈希表
        • TreeSet(有序):底层存储是二叉树
    • set和list接口的区别:list是有索引的,set是无索引,不能放重复的元素
    • ArrayList和LinkedList,使用方法完全一样,区别:
      • 数据存储方式不一样,称为不同的数据结构
      • ArrayList基于数组实现,位置是连续的,查找速度较快,但增加、删除元素较慢
      • LinkedList基于链表实现,物理上没有在一起,查找速度较慢、但增加、删除元素较快
    • Vector:向量,基于数组实现,但已经过时,目前常用的为ArrayList

    4、List的实现类

    ArrayList:动态数组,表示数组长度可变

    结构

    5、List实现类示例:

    示例1:

    package javastudy;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
    
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            
            ArrayList<String> al=new ArrayList<String>();
            al.add("北京");
            al.add("上海");
            al.add("天津");
            al.add(0,"重庆");//将重庆放在第1个位置
            System.out.println("=====结果1正常输出=======");
            print1(al);
            System.out.println("=====结果2set英文输出=====");
            al.set(1, "BeiJing");//将数字[1]中的改为英文BeiJing
            print1(al);
            System.out.println("====结果3遍历输出=====");
            print2(al);
            System.out.println("====结果4删除某一元素遍历输出====");
            al.remove(2);
            print2(al);
        }
        static void print1(ArrayList<String> al){
            for(int i=0;i<al.size();i++){  //字符串、数组使用length();集合使用size()
                System.out.println(al.get(i));
            }
        }
        static void print2(ArrayList<String>al){
            Iterator<String> it=al.iterator(); //遍历器相当于指针,用iterator去接收al的遍历,存放在it中
            while(it.hasNext()){  //使用while遍历得到每个元素
                System.out.println(it.next());
                
            }
        }
    }
    
    执行结果

    6、Set的实现类

    HashSet实现示例1:

    package javastudy;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class Test2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HashSet<String> hs=new HashSet<String>();
            hs.add("北京");
            hs.add("上海");
            hs.add("天津");
            hs.add("重庆");
            Iterator<String> a=hs.iterator();
            while(a.hasNext()){
                System.out.println(a.next());
            }
        }
    }
    
    执行结果

    HashSet示例2:使用for循环

    package javastudy;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class Test2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HashSet<String> hs=new HashSet<String>();
            hs.add("北京1");
            hs.add("上海2");
            hs.add("天津3");
            hs.add("重庆4");
    //      Iterator<String> a=hs.iterator();
    //      while(a.hasNext()){
    //          System.out.println(a.next());
    //      }
            for(Iterator<String> it=hs.iterator();it.hasNext();){
                System.out.println(it.next());
            }
        }
    }
    
    执行结果

    TreeSet示例:

    package javastudy;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.TreeSet;
    
    public class Test2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            TreeSet<String> ts=new TreeSet<String>();
            ts.add("Beijing");
            ts.add("Shanghai");
            ts.add("Tianjin");
            ts.add("Chongqing");
            for(Iterator<String> it=ts.iterator();it.hasNext();){
                System.out.println(it.next());
            }
        }
    }
    
    执行结果

    7、TreeSet自定义对象添加

    TreeSet是有序的,在存自定义对象时(比如存入两类不同类型数据,以哪个排序为准)排序问题解决方法:
    方法1:传入的对象所属的类,必须实现Comparable
    示例:

    package javastudy;
    
    import java.util.Iterator;
    import java.util.TreeSet;
    
    public class Testit1 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            TreeSet<Person> ts=new TreeSet<Person>();
            ts.add(new Person("jack", 20));
            ts.add(new Person("Jerry", 25));
            ts.add(new Person("Mark", 30));
            Iterator<Person> it=ts.iterator();//首先创建一个遍历器
            while(it.hasNext()) {
                Person p=it.next();
                p.print(); //由于是姓名和年龄两个元素,因此存在不能排序比较的问题
            }
        }
    }
    class Person implements Comparable<Person>{  //实现Comparable方法,将两个Person进行比较;Compareable属于java.lang包,不用导入即可使用
        String name;
        int age;
        Person(String name,int age){
            this.name=name;
            this.age=age;
        }
        void print(){
            System.out.println(String.format("姓名=%s,年龄=%d", name,age));
        }
        @Override
        public int compareTo(Person o) {  //要比较的与o进行比较
            // TODO Auto-generated method stub
            if(this.age>o.age) {//执行后按照年龄排序输出
                return 1;
            }else if(this.age<o.age){
                return -1;
            }else {
                return 0;
            }
        }
    }
    
    执行结果

    方法2:初始化TreeSet时,传入一个比较器(比较器是一个实现了Comparator的类的对象)作为一个构造函数
    示例

    package javastudy;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.TreeSet;
    
    
    
    public class Test3 {
    
        public static void main(String[] args) {    
            TreeSet<Dog> ts=new TreeSet<Dog>(new MyCom());
            ts.add(new Dog("Hash", 3));
            ts.add(new Dog("lucy", 5));
            ts.add(new Dog("nick", 2));
            Iterator<Dog> it=ts.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
    }
    }   
    class Dog {
        String name;
        int weight;
        Dog(String name,int weight){
            this.name=name;
            this.weight=weight;
        }
        @Override  //此处为重写,否则会调用object中的toString(),得到的结果是一堆字符,即引用的地址值
         public String toString(){
             return "名字=" +name+ ",体重=" +weight;
                }
             }
    class MyCom implements Comparator<Dog> { //定义一个比较器
            public int compare(Dog o1, Dog o2) {
            // TODO Auto-generated method stub
            return o1.name.compareTo(o2.name);
        }
    }
    

    当你的一个类中没有重写.toString()方法的时候就会执行根类Object的这个.toString()方法。返回形式:对象的类名+@+哈希值的16进制

    相关文章

      网友评论

          本文标题:三、Java中级--5、集合框架

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