Java 集合
集合是工具类,用来存储任意数量的具有共同属性对象的容器;
数组与集合的区别?
数组适用于存储固定容量的数据,
集合的数据是可以动态改变的,存储一对一的关系的数据,对数据进行频繁的增删等操作,数据重复的问题
常用集合接口:List Set Map;
集合框架的体系结构:
List(列表):是一个接口,是元素有序并且可以重复的集合,称为序列,可以精确的控制每个元素的插入位置和删除
主要的实现类:ArrayList和LinkedList
ArrayList:底层是由数组实现的,动态增长
适合于查找和更新数据
ArrayList中得元素可以为NULL
Set:元素无序并且不能重复,
HashSet是Set接口的一个重要实现类,称为哈希集:
Hashset中的元素是无序且不可以重复的,只允许存在一个NULL 元素
具有良好的存取和查找功能
Map:是以键值对<key,value>的形式存储数据
<key,value>以Entry类型的对象实例存在的
可以通过key快速的查找value
一个value不能对应重复的key
一个key最多只能映射到一个value
HashMap:是Map的重要实现类:基于哈希表
允许存在null值和null键;
key值不允许重复
hashmap中得Entry对象时无序排列的
Iterator:迭代器接口:以统一的方式对集合元素进行遍历:
hasNext()方法:检测集合是否存在下一个元素
next()方法:返回集合中得下一个元素
ArrayList案例:
/** * 员工类 */ public class Employee { private int id;//员工id private String name;//员工姓名 private double salary;//员工薪资 public Employee(int id, String name, double salary) { super(); this.setId(id); this.setSalary(salary); this.setName(name); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
/** * 员工测试类 */ import java.util.ArrayList; public class EmployeeTest { public static void main(String[] args) { Employee staff1 = new Employee(0001, "张三", 5000.0); Employee staff2 = new Employee(0002, "李四", 5500.0); Employee staff3 = new Employee(0003, "赵六", 4000.0); ArrayList<Object> list = new ArrayList<>(); list.add(staff1); list.add(staff2); list.add(staff3); System.out.print("员工姓名"+ " 员工薪资 "); for(int i = 0; i < list.size();i++) { System.out.println(((Employee)(list.get(i))).getName()+" "+((Employee)(list.get(i))).getSalary()); } } }
HashSet案例:
/** * 学生类 */ public class Student { private int stuid;//学号 private String name;//姓名 private float score;//成绩 public Student(int stuid, String name, float score) { this.setStuid(stuid); this.setName(name); this.setScore(score); } public int getStuid() { return stuid; } public void setStuid(int stuid) { this.stuid = stuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + Float.floatToIntBits(score); result = prime * result + stuid; return result; } @Override public boolean equals(Object obj) { if(this.getStuid() == stuid && this.getName().equals(name)) { return true; }else return false; } @Override public String toString() { return "[学号:" + stuid + ", 姓名:" + name + ", 成绩:" + score + "]"; } }
import java.util.HashSet; /** * 学生成绩测试类 */ public class StudentTest { public static void main(String[] args) { Student stu1 = new Student(3, "william", 65.0f); Student stu2 = new Student(1, "Tom", 87.0f); Student stu3 = new Student(2, "Lucy", 95.0f); Student stu4 = new Student(2, "Lucy", 95.0f); HashSet<Student> set = new HashSet<>(); set.add(stu1); set.add(stu2); set.add(stu3); set.add(stu4); for(Student stu:set) { System.out.println(stu); } } }
HashMap案例:
import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class Test { public static void main(String[] args) { HashMap<Integer,String> hm = new HashMap<Integer, String>(); hm.put(2014, "德国"); hm.put(2010, "西班牙"); hm.put(2006, "意大利"); hm.put(2002, "巴西"); hm.put(1998, "法国"); System.out.println("使用迭代器方式进行输出:"); Iterator<String> it = hm.values().iterator(); while(it.hasNext()) { System.out.print(it.next() + " "); } System.out.println(" 使用EntrySet进行输出:"); Set<Entry<Integer, String>> entry = hm.entrySet(); for(Entry<Integer,String> x:entry) { System.out.print(x.getKey()+"-"); System.out.println(x.getValue()); } } }