初学java--集合

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值