虽然说是复习关于集合的有关知识,但发现以前学的几乎都忘了。。。
java中的集合框架都实现了collection接口,因此set、list、map三大主要运用的集合都能实现向集合添加元素、移除元素、得到集合的大小、把集合转化为数组等方法。
1.List :List集合框架与数组最为接近,List里面的元素是有序的而且list可以存储相同的元素。元素是有序的也就是说我们可以根据元素的索引得值到元素,根据索引值对元素进行添加删除等操作。
常用来实现List接口的子类有:
java.util.ArrayList,
java.util.LinkedList
java.util.Vector
2.Set:Set集合框架里面的元素是无序的而且不能存储相同的元素。形象的说Set集合框架就是一个黑色的袋子,我们可以往里面放一个一个不同的东西,但却不知道放在了袋子的什么位置,因而Set集合框架的元素没有索引值,想要把里面的元素取出来就需要一个迭代器进行迭代。
常用来实现Set接口的子类有:
java.util.HashSet
java.util.TreeSet
java.util.Iterator
3.Map:Map集合框架存储的是键值对(key----value映射),如果我们把键值当做索引值,那么Map就可以看做一种数组。键值对的形象的解释就是现实中身份证与人的关系,也就是说key是唯一的,而value是可以重复的,这就好比一个数组,每个元素的索引值是唯一的一样。
常用来实现Map接口的子类有:
java.util.HashMap
java.util.Hashtable
简单的总结一下三种集合框架的特点:
List集合是有序有重复的,Set集合是无序唯一的,Map集合是一一对应的!
在用集合之前想想要保存的数据的特点,是否有序,是否有重复的等等然后再选择最好的来运用!
集合运用之除重排序:
package cn.tan.lesson8; import java.util.HashSet; import java.util.Iterator; import java.util.Random; /** * set集合完成除重排序 * * @author 谭万辉 * */ public class setTest { // 程序入口 public static void main(String[] args) { HashSet<Student> hs = createHashSet(); System.out.println("排序前的集合为:"); print(hs); System.out.println("排序前的集合的元素个数为:" + hs.size()); paixu(hs); } private static void paixu(HashSet<Student> hs) { // 得到数组 Object[] integer = hs.toArray(); for (int i = 0; i < integer.length; i++) { for (int j = i + 1; j < integer.length; j++) { Student stu1 = (Student) integer[i]; Student stu2 = (Student) integer[j]; if (stu1.getAge() == stu2.getAge() || stu1.getName() == stu2.getName()) { hs.remove(stu1); } } } integer = hs.toArray(); // 循环排序 for (int i = 0; i < integer.length; i++) { for (int j = i + 1; j < integer.length; j++) { Student stu1 = (Student) integer[i]; Student stu2 = (Student) integer[j]; if (stu1.getAge() > stu2.getAge()) { Student temp = (Student) integer[i]; integer[i] = integer[j]; integer[j] = temp; } } } // 打印数组 for (int i = 0; i < integer.length; i++) { Student stu = (Student) integer[i]; System.out.println("姓名:" + stu.getName() + " 年龄:" + stu.getAge()); } System.out.println("排序后的总数为:" + integer.length); } // 新建一个HashSet集合 private static HashSet<Student> createHashSet() { // 创建一个HashSet对象 HashSet<Student> hash = new HashSet<Student>(); // 使用循环往集合中添加数据 for (int i = 0; i < 10; i++) { java.util.Random rd = new java.util.Random(); java.util.Random rd1 = new java.util.Random(); int value = rd.nextInt(30); int value1 = rd1.nextInt(30); Student stu = new Student("学生" + value1, value); hash.add(stu); } return hash; } // 打印的方法 private static void print(HashSet<Student> hs) { // 得到Set集合的迭代器 Iterator<Student> iterator = hs.iterator(); while (iterator.hasNext()) { Student st = iterator.next(); System.out.println(st.getName() + " " + st.getAge()); } } }
输出结果为:排序前的集合为:
学生3 20
学生4 28
学生15 27
学生20 14
学生17 4
学生29 16
学生3 27
学生1 22
学生29 6
学生14 14
排序前的集合的元素个数为:10
姓名:学生17 年龄:4
姓名:学生29 年龄:6
姓名:学生14 年龄:14
姓名:学生29 年龄:16
姓名:学生3 年龄:20
姓名:学生1 年龄:22
姓名:学生3 年龄:27
姓名:学生4 年龄:28
排序后的总数为:8
4.==与equals的区别和联系(初探):
刚开始用的时候发现这两个东西似乎没有区别,其实它们的区别还是有的。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是两个对象的地址,而equals比较的是两个对象的内容。
显然,当equals为true时,==不一定为true:
package cn.tan.lesson9; /* * 测试==和equals的区别 */ public class StringTest { public static void main(String[] args) { String s1 = "Monday"; String s2 = new String("Monday"); // s2 = s2.intern(); if (s1 == s2) System.out.println("s1 == s2"); else System.out.println("s1 != s2"); if (s1.equals(s2)) System.out.println("s1 equals s2"); else System.out.println("s1 not equals s2"); } }
输出结果为:
s1 != s2
s1 equals s2
当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会
在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将 s2 引用 s1 所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:
"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创
建在内存中。他们的值相同,但是位置不同,因此==操作判断为false。