三、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<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进制

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 一、集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map;两者的区别: 1、Col...
    程序员欧阳阅读 11,556评论 2 61
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,936评论 0 13
  • Java集合框架 Java中封装了许多常用的数据结构,称为集合框架,可以有效组织数据,提高程序性能。最初Java只...
    Steven1997阅读 929评论 0 2
  • 不知不觉又到十点了,还有好多事没做完,但实在太累了…… 每天孩子睡了自己躺床上拿起手机,才觉得时间是...
    八月微央阅读 139评论 0 0
  • 本文参加【世界华语悬疑文学大赛】征稿活动,本人承诺,文章内容为原创。 楔子 你害怕黑夜吗? 那种孤独一人的感觉,内...
    信仰滚动阅读 693评论 1 11