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出现自动装箱和自动拆箱,让我们对集合的操作更加简单,尤其是可以任意把数字放入集合中