1、java中常用的集合类主要有以下几种
List 结构的集合类:
ArrayList类,LinkedList类,Vector类,Stack类
Map结构的集合类:
HashMap类,Hashtable类
Set结构的集合类:
HashSet类,TreeSet类
Queue结构的集合类: //对列结构
Queue接口
2、集合类的简单理解就是能动态的为我们添加和修改,为我们提供很多的便利。
3、各个类的简单演示代码如下
(1)演示ArrayList类的简单用法:(ArrayList类的特点是能自动在末尾增加数组的长度)
/* * 功能:演示ArrayList的简单用法 * 作者:zyj0813 * 知识运用:JAVA中集合框架的运用 */ package com.Day02; import java.util.*; public class Demo1 { public static void main(String[] args) { //定义一个ArrayList对象 ArrayList al=new ArrayList(); //显示大小 System.out.println("al大小:"+al.size()); //向al中加入数据(类型是Object) //创建一个职员 Clerk clerk1=new Clerk("宋江",50,1000); Clerk clerk2=new Clerk("吴用",45,1200); Clerk clerk3=new Clerk("林冲",35,1300); //将clerk1加入到al中 al.add(clerk1); al.add(clerk2); al.add(clerk3); //如何访问al中的对象 for(int i=0;i<al.size();i++) { Clerk temp=(Clerk)al.get(i); System.out.println("第"+(i+1)+"个人的信息:"+temp.getName()+","+temp.getAge()+","+temp.getSal()); } //如何从al中删除一个对象 al.remove(1); System.out.println("======删除======="); //如何访问al中的对象 for(int i=0;i<al.size();i++) { Clerk temp=(Clerk)al.get(i); System.out.println("第"+(i+1)+"个人的信息:"+temp.getName()+","+temp.getAge()+","+temp.getSal()); } } } //定义一个员工类 class Clerk { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } private int age; private float sal; public Clerk(String name,int age,float sal) { this.name=name; this.age=age; this.sal=sal; } }
(2)、演示LinkedList的简单用法:(比ArrayList类多了几个特殊的方法,能从最前面增加数)
/* * 功能:演示LinkedList的简单用法 * 作者:zyj0813 */ package com.Day02; import java.util.*; public class Demo3 { public static void main(String[] args) { LinkedList ll=new LinkedList(); Emp emp1=new Emp("sa01","aa",1200); Emp emp2=new Emp("sa02","bb",1000); Emp emp3=new Emp("sa01","cc",1200); Emp emp4=new Emp("sa02","dd",1000); ll.add(emp1); //这个是往前面加,和栈的原理类似,这是ArrayList没有的 ll.addFirst(emp2); //打印结果 for(int i=0;i<ll.size();i++) { System.out.println(((Emp)ll.get(i)).getName()); } //这个是往后面加 ll.addLast(emp3); ll.addLast(emp4); //继续打印结果 for(int i=0;i<ll.size();i++) { System.out.println(((Emp)ll.get(i)).getName()); } } } //雇员类 class Emp { //定义员工号 private String empNo; private String name; private float sal; //构造函数 public Emp(String empNo,String name,float sal) { this.empNo=empNo; this.name=name; this.sal=sal; } public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } }
(3)、Vector的用法和上面两种差不多,简单看一眼:
/* * 功能:演示Vector的简单用法 * 作者:zyj0813 */ package com.Day02; import java.util.*; public class Demo3 { public static void main(String[] args) { Vector vv=new Vector(); Emp emp1=new Emp("01","aa",1.2f); vv.add(emp1); for(int i=0;i<vv.size();i++) { Emp emp=(Emp)vv.get(i); System.out.println(emp.getName()); } } } //雇员类 class Emp { //定义员工号 private String empNo; private String name; private float sal; //构造函数 public Emp(String empNo,String name,float sal) { this.empNo=empNo; this.name=name; this.sal=sal; } public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } }
(4)、Stack类的用法和上面大同小异,主要区别的add里Stack(栈) 类是往前面加的,这个用法就是和栈的功能是一样的。
(5)、HashMap类的使用:
/* * 功能:演示HashMap的简单用法 * 作者:zyj0813 */ package com.Day02; import java.util.*; public class Demo3 { public static void main(String[] args) { //创建一个HashMap对象 HashMap hm=new HashMap(); Emp emp1=new Emp("001","aaa",3.4f); Emp emp2=new Emp("002","bbb",5.6f); Emp emp3=new Emp("002","ccc",3.3f); //将emp放入到hm hm.put("001", emp1); hm.put("002", emp2); /*如果后面加的员工的key值和之前的员工的相同, 则此Key值对应的员工信息将被后面加进来的员工信息覆盖, 比如下面的emp3将覆盖emp2的信息 */ hm.put("002", emp3); //HashMap的查找,通过key值查找,很方便 //如果你要查找编号是 002的人 if(hm.containsKey("002")) { System.out.println("有这个员工"); //去处该员工,键 ----值 Emp emp=(Emp)hm.get("002"); System.out.println("名字:"+emp.getName()); }else{ System.out.println("没有这个员工"); } //遍历HashMap中所有的key和value //Iterator迭代.*注意:这个方法遍历出来是无序的。可能是按照某种规律排序的 Iterator it=hm.keySet().iterator(); //hasNext()作用是探测是不是到末尾了,返回布尔值 while(it.hasNext()) { //取出key=键("002") String key=it.next().toString();//因为it.next()返回来是Object(对象)类型, //用toString()转成字符串 //通过key取出value Emp emp=(Emp)hm.get(key); System.out.println("名字:"+emp.getName()); System.out.println("薪水:"+emp.getSal()); } } } //雇员类 class Emp { //定义员工号 private String empNo; private String name; private float sal; //构造函数 public Emp(String empNo,String name,float sal) { this.empNo=empNo; this.name=name; this.sal=sal; } public String getEmpNo() { return empNo; } public void setEmpNo(String empNo) { this.empNo = empNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getSal() { return sal; } public void setSal(float sal) { this.sal = sal; } }
(6)、Hashtable 的用法和HashMap的用法基本一致
它们的区别在于以下三点:
1、Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个实现。
2、<同步性> Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。 而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行 的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免 由于同步带来的不必要的性能开销,从而提高效率。
3、值:HashMap可以让你将空值作为一个表的条目的key或者value,但是Hashtable是不能放入空值 (null)的。
(7)、ArrayList和Vector的区别
1、同步性:
Vector是同步的,这个类中的一些方法保证了Vector中的对象是线程安全的,而ArrayList则是异步的,因此 ArrayList中的对象并不是线程安全的。
2、数据增长:
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当你向这两种类型中 增加元素的时候,如果元素的数目超过了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况 下自动增长原来一倍的数组长度,ArrayList是原来的50%。所以记住Vector增长的速度快。
(8 )、总结:
1、如果要求线程安全,使用Vector、Hashtable;
2、如果不要求线程安全,要求提高效率,使用ArrayList、LinkedList、HashMap;
3、如果要求 键值对,使用HashMap、Hashtable;
4、如果要求数据量大,又要考虑线程安全则使用Vector;