虽然说是复习关于集合的有关知识,但发现以前学的几乎都忘了。。。
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。