Java-集合框架(ArrayList,HashSet,HashMap)

1、为什么需要使用集合框架?
数组有什么缺点?第1,数组保存的数据数量是有限,而且必须提前确定好;第2,数组只能保存同一个类型的数据
sun公司才编写集合框架,用来在某些情况下来替代数组的使用
2、集合框架:就有一些工具类,组成的具有一定功能的体系(框架),集合框架就是用来保存数据
ArrayList
企业开发中最为常用的一个集合类
用来保存多个相同或不同类型的对象,跟数组相似,保存元素有序,也有下标,不同,可以不同类型的数据,而且不需要定义保存数据的个数
格式:ArrayList 对象名字=new ArrayList();

import java.util.ArrayList;
public class Test1 {
    public static void main(String[] args) {
        Emp emp1=new Emp("liu");
        Emp emp2=new Emp("guan");
        Teacher t1=new Teacher("刘老师",99999);
        ArrayList list=new ArrayList();
        //add(obj):往集合中添加元素
        //get(index):index就是ArrayList中的下标,通过下标取得对应的元素,下标值从0开始
        //get方法返回的元素,必须要强制类型转化
        list.add(emp1);//index:0
        list.add(emp2);//index:1
        list.add(t1);//index:2
        Emp emp11=(Emp)list.get(0);
        System.out.println(emp11.name);//结果:liu
        //size():获得集合中元素的个数
        System.out.println(list.size());//结果:3
        //remove(index):根据下标,删除对应的元素
        list.remove(0);
        System.out.println(list.size());//结果:2
        //集合中的元素,最好能重写toString,当直接输出集合名字,可以直接把元素对象信息输出
        System.out.println(list.toString());//结果:[guan, test.Teacher@7852e922]
    }
}
class Emp{
    String name;
    Emp(String name){
        this.name=name;
    }
    @Override
    public String toString() {
        return name;
    }
}
class Teacher{
    String name;
    double salary;
    Teacher(String name,double salary){
        this.name=name;
        this.salary=salary;
    }
}

HashSet
也是一种集合,该集合保存元素的顺序不确定,随机,HashSet无序,元素不要重复,功能跟ArrayList很相似,企业开发中使用很少

import java.util.HashSet;
public class Test1 {
    public static void main(String[] args) {
        HashSet set=new HashSet();
        set.add("快点下课!");
        set.add("快点下课!");
        System.out.println(set);//只输出一个元素的值,不重复。结果:[快点下课!]
        set.add("明天见");
        set.add(new Emp("关之琳"));
        set.add(new Emp("黄飞鸿"));
        set.add(new Teacher("刘",666));
        System.out.println(set);//无序。结果:[关之琳, test.Teacher@70dea4e, 黄飞鸿, 明天见, 快点下课!]
        //使用remove在set中删除元素,该元素类型必须要重写equals和hashcode()
        set.remove("明天见");
        System.out.println(set);//结果:[关之琳, test.Teacher@70dea4e, 黄飞鸿, 快点下课!]
    }
}
class Emp{
    String name;
    Emp(String name){
        this.name=name;
    }
    @Override
    public String toString() {
        return name;
    }
}
class Teacher{
    String name;
    double salary;
    Teacher(String name,double salary){
        this.name=name;
        this.salary=salary;
    }
}

HashMap
结构特点:一对一对保存数据,key和value要一一对应,一个key对应一个value,而且可以根据key值找到对应value
1、结构:一一对应(key---value)
2、特点:每次保存数据,都是一对对保存,把key和value同时一起保存,查询可以根据key找到对应value
3、HashMap 名字=new HashMap()

import java.util.HashMap;
public class Test1 {
    public static void main(String[] args) {
        HashMap map=new HashMap();
        //put(key,value)保存数据
        map.put("k1", new Person("刘"));
        map.put("k2", new Person("张"));
        map.put("k3", "今天阳光好");
        //直接输出map的名字,就map中所有key和value,显示出来
        //map内部就直接调用每个元素toString()方法
        System.out.println("map中所有元素"+map);//结果:map中所有元素{k1=person类的对象的名字是:刘, k2=person类的对象的名字是:张, k3=今天阳光好}
        //get(key):根据key取得对应的value值,取出value是Object类型,需要强制类型转化
        Person p1=(Person)map.get("k2");
        System.out.println(p1);//结果:person类的对象的名字是:张
    }
}
class Person{
    String name;
    Person(String name){
        this.name=name;
    }
    @Override
    public String toString() {
        return "person类的对象的名字是:"+name;
    }
}

总结:集合中只能用来保存对象,单独的数据没办法直接保存。java引入包装类的概念
包装类
java是完全面向对象的,针对8种基本数据类型,单独创建与之对应的8种对象类型(引用类型),基本数据跟引用直接就可以任意的转化,这样的类型我们称为包装类
1)    包装类提供基本的数据类型跟包装类之间的转化
2)    包装类分类:
基本数据类型    包装类
boolean          Boolean
char             Character
byte             Byte
int               Integer
short             Short
long              Long
float              Float
double            Double

public class Test1 {
    public static void main(String[] args) {
        Integer integer1=new Integer(12);
        System.out.println(integer1.toString());//结果:12
        int num1=integer1.intValue();//intValue():把Integer包装类的对象的值取出
        System.out.println("num1="+num1);//结果:num1=12
        //其他包装类的功能跟Integer极其相似
        Double double1=new Double(12.23);
        System.out.println(double1);//结果:12.23
        double num2=double1.doubleValue();
        System.out.println("num2="+num2);//结果:num2=12.23
    }
}

自动装箱和自动拆箱
jdk可以自动把基本数据类型和包装类之间转化
1)自动装箱:基本类型数据-->包装类对象
自动拆箱:包装类对象-->基本类型数据

public class Test1 {
    public static void main(String[] args) {
        int num1=new Integer(12);
//          基本类型数据<--包装类的对象
//                                   自动拆箱
        Integer num2=12;
//            包装类对象<--基本数据类型
//                                  自动装箱
    }
}

2)当把基本类型数据放入集合中的过程,基本数据类型会自动装箱(基本数据类型会自动转化包装类的对象)

import java.util.HashMap;
public class Test1 {
    public static void main(String[] args) {
        //把基本类型数据放入集合中,内部把基本类型数据转化包装类的对象,放入集合中
        //好处:可以把基本类型数据放入集合
        //集合中只能放入对象
        HashMap map=new HashMap();
        map.put("k1", new Integer(12));
        map.put("k2", new Double(23.1));
        map.put("k3", 12);//把12放入map集合中,先把12自动装箱new Integer(12),然后把new Integer(12)作为对象放入map集合中
        map.put("k4", 23.1);
        int v1=(Integer)map.get("k1");
        System.out.println("v1="+v1);//结果:v1=12
        int v3=(Integer)map.get("k3");
        System.out.println("v3="+v3);//结果:v3=12
    }
}

3)jdk 1.5出现自动装箱和自动拆箱,让我们对集合的操作更加简单,尤其是可以任意把数字放入集合中

猜你喜欢

转载自www.cnblogs.com/peiya/p/12693964.html