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

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 al=new ArrayList();
        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 al){
        for(int i=0;ial){
        Iterator it=al.iterator(); //遍历器相当于指针,用iterator去接收al的遍历,存放在it中
        while(it.hasNext()){  //使用while遍历得到每个元素
            System.out.println(it.next());
            
        }
    }
}
三、Java中级--5、集合框架_第1张图片
执行结果

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 hs=new HashSet();
        hs.add("北京");
        hs.add("上海");
        hs.add("天津");
        hs.add("重庆");
        Iterator 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 hs=new HashSet();
        hs.add("北京1");
        hs.add("上海2");
        hs.add("天津3");
        hs.add("重庆4");
//      Iterator a=hs.iterator();
//      while(a.hasNext()){
//          System.out.println(a.next());
//      }
        for(Iterator 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 ts=new TreeSet();
        ts.add("Beijing");
        ts.add("Shanghai");
        ts.add("Tianjin");
        ts.add("Chongqing");
        for(Iterator 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 ts=new TreeSet();
        ts.add(new Person("jack", 20));
        ts.add(new Person("Jerry", 25));
        ts.add(new Person("Mark", 30));
        Iterator it=ts.iterator();//首先创建一个遍历器
        while(it.hasNext()) {
            Person p=it.next();
            p.print(); //由于是姓名和年龄两个元素,因此存在不能排序比较的问题
        }
    }
}
class Person implements Comparable{  //实现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
执行结果

方法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 ts=new TreeSet(new MyCom());
        ts.add(new Dog("Hash", 3));
        ts.add(new Dog("lucy", 5));
        ts.add(new Dog("nick", 2));
        Iterator 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 { //定义一个比较器
        public int compare(Dog o1, Dog o2) {
        // TODO Auto-generated method stub
        return o1.name.compareTo(o2.name);
    }
}

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

你可能感兴趣的:(三、Java中级--5、集合框架)