java集合的简要体系结构
2016-07-06 19:08
567 查看
Iterator --ListIterator ListIterator列表迭代器的由来: 当我想在迭代器迭代时添加元素,如果使用集合类对象的add方法就会出现并发修改异常 ConcurrentModificationException 而继承Iterator的ListIterator就有增删改查的功能 Collection --List ----ArraryList 数组列表(查询快,修改慢) ----LinkedList链接列表(查询慢,修改快) ----Vector 底层是数组被ArrayList替代了 --Set --HashSet --LinkedHashSet --SortedSet --TreeSet Map --HashMap哈希映射 --TreeMap树映射 工具类 Collections 是操作Collection类和子类的工具类,提供了很多封装好的函数 Arrays Array类及子类的工具类 比较类 Comparable 使类的不同实例之间具有可比性 Comparator 比较器,定义类比较的规则
List是列表,有索引,所以list集合中的元素是可以重复的,而且顺序存储,也就是说迭代的顺序和元素插入集合的顺序是一致的。
Set类似于数学中的集合,具有互异性,确定性,无序性。如果你想要集合中的元素具有唯一性,那么Set是不二选择。那么Set如何保证元素的唯一性的呢?
当集合中保存的是自定义类型时,调用对象的hashCode()方法得出对象的hash码,如果两个对象的hash码相同,就会调用对象的equals()方法
如果再相同就不会把对象插入集合容器。
那么问题来了
如果两个对象的内容是相同的,那么hash码肯定是相同的,这时就会调用equals()方法,然而Object对象的equals()是比较引用,也就是说类的实例只和自身相等。equals()肯定会返回false,这时内容相同的两个对象就会插入集合容器
解决方案
重写equals()方法
package cn.com.oracle; public class Student { private String name ; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } 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; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } /** * 可以看到hash码值和对象的内容有关,内容相同的对象,hash值肯定相同 */ @Override public int hashCode() { System.out.println("调用了hashCode()"); final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { System.out.println("调用了equals()"); if (this == obj)//如果内存地址相等,肯定相等 return true; if (obj == null)//null不与任何对象相等 return false; if (getClass() != obj.getClass())//如果类型不同,肯定不同 return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
package cn.com.oracle; import java.util.HashSet; import java.util.Set; /** * * @author 格拉.香农 * */ public class SetTest { public static void main(String[] args) { Set<Student> set=new HashSet<Student>(); set.add(new Student("wangwu",20)); set.add(new Student("lisi",19)); set.add(new Student("zhangsan",23)); set.add(new Student("zhangsan",23)); for(Student stu:set)//使用for each代替迭代器,代码更简洁 { System.out.println(stu);//打印一个对象,会调用这个对象的toString()方法 } } }
TreeSet类会强制对容器中的对象排序但需要对象所属的类实现Compareable接口,重写compareTo方法给出排序的方式,往容器中存储对象时编译器会自动调用compareTo方法。比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
( a)元素具备比较性 b)定义比较器,传给Set的构造函数)
Comparator比较器
Map集合
遍历key
遍历value
遍历k/v
package cn.com.oracle; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class MapTest { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("哇哈哈", 3); map.put("健力宝", 4); map.put("东方树叶", 5); // 遍历key Set<String> keySet = map.keySet(); for (String str : keySet) System.out.println(str); // 遍历value Collection<Integer> values = map.values(); for (Integer str : values) System.out.println(str); // 遍历key/value Set<Entry<String, Integer>> entrySet = map.entrySet(); for (Entry<String, Integer> str : entrySet) System.out.println(str); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树