- 浏览: 54576 次
- 性别:
- 来自: 长沙
最新评论
-
huyuancai1010:
Eclipse中配置Struts2并实现HelloWorld -
zl544434558:
领教了。很久没用struts了,记得不是很清楚了
Eclipse中配置Struts2并实现HelloWorld -
Wuaner:
楼主 你这里的 reHash, 是个什么概念? HashMap ...
挂链式Hash表的实现 -
jadethao:
作者辛苦了。
关于P2P的简单总结 -
剑&箫:
oolala 写道也买了一本,可是看了二章坚持不下去了。
本人 ...
《TCP/IP详解,卷1:协议》读书笔记之概述总结
Java中集合类定义主要是在java.util.*包下面,常用的集合在系统中定义了三大接口,这三类的区别是:
java.util.Set接口及其子类,set提供的是一个无序集;
java.util.List接口及其子类,List提供的是一个有序集;
java.util.Map接口及其子类,Map提供了一个映射关系的集合数据结构;
每种集合都可以理解为用来在内存中存放一组对象的某种“容器”。
java.util.List接口的实现类的特点和用法:
List接口提供了多个实现的子类,常用的实现类是java.util.Vector和java.util.ArrayList,现在以java.util.ArrayList为例来说明List的特点及用法,具体代码示例如下:
public class ArrayListTest {
//主函数
public static void main(String args[]){
//创建队列对象
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
//向队列中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
list.add(str);
}
//遍历1
for (int i=0;i<list.size();i++){
//根据下标取出队列的元素
String str = list.get(i);
System.out.print(str+"\t");
}
System.out.println();
//遍历2
//得到队列的迭代器对象
java.util.Iterator<String> itr = list.iterator();
//判断是否有数据可以迭代
while(itr.hasNext()){
//取出一个元素
String str = itr.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历3
for (String str:list){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
以上程序是先创建一个队列对象list,然后以有序的元素添加到该队列中,接下来是通过三种不同的方式遍历该队列的,第一种是通过下标值来遍历队列的,打印出来的队列也是有序的,但是仅凭这一种方式不能说明队列是有序的,所以再通过第二种遍历方式,打印出该队列,第二种遍历是先得到队列的迭代器对象,在判断是否有数据可以迭代,最后取出队列的元素。通过第二种遍历方式就可以说明队列是有序的,这两种遍历方式也都说明了队列是线性的。第三种遍历方式是在java中特有的遍历方式。
下面再把上面的代码做稍微的修改,如下所示:
public class ArrayListTest {
//主函数
public static void main(String args[]){
//创建队列对象
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
//向队列中添加元素
for (int i=0;i<15;i++){
String str = "学生"+i;
list.add(str);
}
list.add("新同学");
list.add("新同学");
list.add("新来的");
//遍历1
for (int i=0;i<list.size();i++){
//根据下标取出队列的元素
String str = list.get(i);
System.out.print(str+"\t");
}
System.out.println();
//遍历2
//得到队列的迭代器对象
java.util.Iterator<String> itr = list.iterator();
//判断是否有数据可以迭代
while(itr.hasNext()){
//取出一个元素
String str = itr.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历3
for (String str:list){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
以上程序添加是在队列中添加了新的元素,并且有添加相同的元素,从运行结果可知,队列是长度可变的,可以有相同重复的元素。
根据以上两段代码的运行结果可知,队列的特点是线性的,有序的,长度可变的,有下标值的,元素可重复的。
Java.util.Set接口的实现类的特点及用法:
Set是一个接口定义,所以只能使用它的实现子类,Set接口常用的子类有java.util.HashSet、java.util.TreeSet;这里以java.util.HashSet为例说明它的特点及用法,请看下面代码示例:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生9 学生7 学生8 学生5 学生6 学生3 学生4 学生1 学生2
学生0 学生9 学生7 学生8 学生5 学生6 学生3 学生4 学生1 学生2
以上程序是将有序的元素放入的集合中,通过第一种遍历方式打印出来的元素是无序的,说明集合的特点是无序的。下面再在上面的代码的基础上添加新的元素,代码如下:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
set.add("新同学");
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
从运行结果中可知集合和队列一样,长度也是可以变的。
下面在修改以上代码,向集合中添加相同的元素,如下所示:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
set.add("新同学");
set.add("新同学");
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
运行结果是和上面一样的,说明重复的元素只能够添加一个,到底添加了哪一个呢?可以通过打印来看添加的是哪一个,代码如下:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
boolean st1 = set.add("新同学");
boolean st2 = set.add("新同学");
System.out.println(st1+"<>"+st2);
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
true<>false
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
从运行结果来看,添加的是第一个相同的元素。从以上的代码运行的结果中可知道,集合的特点是长度可变的,无序的,元素是不重复的。
Java.util.Map接口的特点及用法:
Java提供了专门的集合类用来存放映射对象的,即Java.util.Map接口,Map是一个接口,有多种具体的实现类,常用的有HashMap和Hashtable类实现。Map中存入的对象是一对一对的,即每个对象和它的一个键关联在一起。从API文档中可知,Map中存放的是两种对象,一种称为key(键),一种称为value(值),他们在Map中是一一对应关系。Map中的键是不能重复的,但值是可以重复的。下面以java.util.HashMap为例说明它的特点及用法,请看下面的示例代码:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<10;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
1000 学生1
2000 学生2
3000 学生3
4000 学生4
5000 学生5
6000 学生6
7000 学生7
8000 学生8
9000 学生9
上面的程序是向映射中添加入有序的元素,打印出的也是有序的元素,从运行的结果看,认为映射是有序的,但是稍微改一下程序,元素顺序结果就不一样了,代码如下:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<15;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
11000 学生11
13000 学生13
2000 学生2
4000 学生4
6000 学生6
8000 学生8
10000 学生10
1000 学生1
12000 学生12
3000 学生3
14000 学生14
5000 学生5
7000 学生7
9000 学生9
从上面的运行结果可知,映射也是种无序的集合。
像上面的集合一样向映射中添加重复相同的元素,代码如下:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<10;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
map.put(1234,"新同学");
map.put(1234,"新来的");
map.put(4321,"新来的");
map.put(4321,"新同学");
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
1000 学生1
2000 学生2
3000 学生3
4000 学生4
1234 新来的
5000 学生5
6000 学生6
7000 学生7
8000 学生8
9000 学生9
4321 新同学
从运行结果来看,映射的元素也是不可重复的如果加入相同的键值对时,则会替换掉原来的键值对。总结来说,映射的特点是:一个K对应一个V,K是一个set集合,是不可重复的,无序的,如果加入相同K的键值对时,则会替换原来的键值对。
以上三种集合框架的应用是很广的,比如对一个整型数组进行去重复排序,就可以用Set对数组去重复,然后在用其他排序方法对去重复的数组进行排序。要统计一个数组中的相同元素的个数,就可以用Map对数组进行操作,返回数组元素及其出现的次数。具体代码如下:
public class Test {
public static void main(String args[]){
//初始化一个数组
int[] array = {2,3,5,3,7,4,9,3,2,1,8,6,3,8,7,3,2,1,9,};
//创建Test类对象
Test ft = new Test();
int[] ar = ft.reSet(array);
for (int i=0;i<ar.length;i++){
System.out.print(ar[i]+"\t");
}
java.util.HashMap<Integer,Integer> map = ft.reput(array);
ft.print(map);
}
/*
* 去掉数组中重复的元素并排序的方法
*/
public int[] reSet(int[] arr) {
// 创建HashSet的对象
java.util.HashSet<Integer> set = new java.util.HashSet<Integer>();
// 遍历数组,将数组中的元素加到HashSet中
for (int i = 0; i < arr.length; i++) {
// 将数组的元素添加到集合中
set.add(arr[i]);
}
// 再将集合中的元素保存回数组中
// 实例化一个数组
int[] temps = new int[set.size()];
// 得到迭代器对象
java.util.Iterator<Integer> ter = set.iterator();
int k=0;
while (ter.hasNext()) {
temps[k] = ter.next();
k++;
}
// 冒泡排序
for (int i = 0; i < temps.length; i++) {
for (int j = i + 1; j < temps.length; j++) {
if (temps[i] > temps[j]) {
int temp = temps[i];
temps[i] = temps[j];
temps[j] = temp;
}
}
}
return temps;
}
/*
* 返回数组中相同元素的个数的方法
*/
public java.util.HashMap<Integer,Integer> reput(int[] arr){
//创建映射对象
java.util.HashMap<Integer,Integer> map = new java.util.HashMap<Integer,Integer>();
int[] key = reSet(arr);
//实例化一个数组
int[] value = new int[key.length];
for (int i=0;i<key.length;i++){
for (int j=0;j<arr.length;j++){
if (key[i]==arr[j]){
value[i]++;
}
}
}
for (int i=0;i<key.length;i++){
map.put(key[i], value[i]);
}
return map;
}
//打印映射的方法
public void print(java.util.HashMap<Integer,Integer> map){
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
int str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
1 2 3 4 5 6 7 8
9
1 2
2 3
3 5
4 1
5 1
6 1
7 2
8 2
9 2
java.util.Set接口及其子类,set提供的是一个无序集;
java.util.List接口及其子类,List提供的是一个有序集;
java.util.Map接口及其子类,Map提供了一个映射关系的集合数据结构;
每种集合都可以理解为用来在内存中存放一组对象的某种“容器”。
java.util.List接口的实现类的特点和用法:
List接口提供了多个实现的子类,常用的实现类是java.util.Vector和java.util.ArrayList,现在以java.util.ArrayList为例来说明List的特点及用法,具体代码示例如下:
public class ArrayListTest {
//主函数
public static void main(String args[]){
//创建队列对象
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
//向队列中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
list.add(str);
}
//遍历1
for (int i=0;i<list.size();i++){
//根据下标取出队列的元素
String str = list.get(i);
System.out.print(str+"\t");
}
System.out.println();
//遍历2
//得到队列的迭代器对象
java.util.Iterator<String> itr = list.iterator();
//判断是否有数据可以迭代
while(itr.hasNext()){
//取出一个元素
String str = itr.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历3
for (String str:list){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9
以上程序是先创建一个队列对象list,然后以有序的元素添加到该队列中,接下来是通过三种不同的方式遍历该队列的,第一种是通过下标值来遍历队列的,打印出来的队列也是有序的,但是仅凭这一种方式不能说明队列是有序的,所以再通过第二种遍历方式,打印出该队列,第二种遍历是先得到队列的迭代器对象,在判断是否有数据可以迭代,最后取出队列的元素。通过第二种遍历方式就可以说明队列是有序的,这两种遍历方式也都说明了队列是线性的。第三种遍历方式是在java中特有的遍历方式。
下面再把上面的代码做稍微的修改,如下所示:
public class ArrayListTest {
//主函数
public static void main(String args[]){
//创建队列对象
java.util.ArrayList<String> list = new java.util.ArrayList<String>();
//向队列中添加元素
for (int i=0;i<15;i++){
String str = "学生"+i;
list.add(str);
}
list.add("新同学");
list.add("新同学");
list.add("新来的");
//遍历1
for (int i=0;i<list.size();i++){
//根据下标取出队列的元素
String str = list.get(i);
System.out.print(str+"\t");
}
System.out.println();
//遍历2
//得到队列的迭代器对象
java.util.Iterator<String> itr = list.iterator();
//判断是否有数据可以迭代
while(itr.hasNext()){
//取出一个元素
String str = itr.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历3
for (String str:list){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
学生0 学生1 学生2 学生3 学生4 学生5 学生6 学生7 学生8 学生9 学生10 学生11 学生12 学生13 学生14 新同学 新同学 新来的
以上程序添加是在队列中添加了新的元素,并且有添加相同的元素,从运行结果可知,队列是长度可变的,可以有相同重复的元素。
根据以上两段代码的运行结果可知,队列的特点是线性的,有序的,长度可变的,有下标值的,元素可重复的。
Java.util.Set接口的实现类的特点及用法:
Set是一个接口定义,所以只能使用它的实现子类,Set接口常用的子类有java.util.HashSet、java.util.TreeSet;这里以java.util.HashSet为例说明它的特点及用法,请看下面代码示例:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 学生9 学生7 学生8 学生5 学生6 学生3 学生4 学生1 学生2
学生0 学生9 学生7 学生8 学生5 学生6 学生3 学生4 学生1 学生2
以上程序是将有序的元素放入的集合中,通过第一种遍历方式打印出来的元素是无序的,说明集合的特点是无序的。下面再在上面的代码的基础上添加新的元素,代码如下:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
set.add("新同学");
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
从运行结果中可知集合和队列一样,长度也是可以变的。
下面在修改以上代码,向集合中添加相同的元素,如下所示:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
set.add("新同学");
set.add("新同学");
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
运行结果是和上面一样的,说明重复的元素只能够添加一个,到底添加了哪一个呢?可以通过打印来看添加的是哪一个,代码如下:
public class HashSetTest {
//主函数
public static void main(String args[]){
//创建集合对象
java.util.HashSet<String> set = new java.util.HashSet<String>();
//向集合中添加元素
for (int i=0;i<10;i++){
String str = "学生"+i;
set.add(str);
}
set.add("新来的");
boolean st1 = set.add("新同学");
boolean st2 = set.add("新同学");
System.out.println(st1+"<>"+st2);
//遍历1
//得到迭代器的对象
java.util.Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.print(str+"\t");
}
System.out.println();
//遍历2
for (String str:set){
System.out.print(str+"\t");
}
}
}
运行结果:
true<>false
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
学生0 新同学 学生9 学生7 学生8 新来的 学生5 学生6 学生3 学生4 学生1 学生2
从运行结果来看,添加的是第一个相同的元素。从以上的代码运行的结果中可知道,集合的特点是长度可变的,无序的,元素是不重复的。
Java.util.Map接口的特点及用法:
Java提供了专门的集合类用来存放映射对象的,即Java.util.Map接口,Map是一个接口,有多种具体的实现类,常用的有HashMap和Hashtable类实现。Map中存入的对象是一对一对的,即每个对象和它的一个键关联在一起。从API文档中可知,Map中存放的是两种对象,一种称为key(键),一种称为value(值),他们在Map中是一一对应关系。Map中的键是不能重复的,但值是可以重复的。下面以java.util.HashMap为例说明它的特点及用法,请看下面的示例代码:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<10;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
1000 学生1
2000 学生2
3000 学生3
4000 学生4
5000 学生5
6000 学生6
7000 学生7
8000 学生8
9000 学生9
上面的程序是向映射中添加入有序的元素,打印出的也是有序的元素,从运行的结果看,认为映射是有序的,但是稍微改一下程序,元素顺序结果就不一样了,代码如下:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<15;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
11000 学生11
13000 学生13
2000 学生2
4000 学生4
6000 学生6
8000 学生8
10000 学生10
1000 学生1
12000 学生12
3000 学生3
14000 学生14
5000 学生5
7000 学生7
9000 学生9
从上面的运行结果可知,映射也是种无序的集合。
像上面的集合一样向映射中添加重复相同的元素,代码如下:
public class HashMapTest {
//主函数
public static void main(String args[]){
//创建一个映射对象
java.util.HashMap<Integer,String> map = new java.util.HashMap<Integer,String>();
//装入键值对
for (int i=0;i<10;i++){
int key = i*1000;
String value = "学生"+i;
map.put(key, value);
}
map.put(1234,"新同学");
map.put(1234,"新来的");
map.put(4321,"新来的");
map.put(4321,"新同学");
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
String str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
0 学生0
1000 学生1
2000 学生2
3000 学生3
4000 学生4
1234 新来的
5000 学生5
6000 学生6
7000 学生7
8000 学生8
9000 学生9
4321 新同学
从运行结果来看,映射的元素也是不可重复的如果加入相同的键值对时,则会替换掉原来的键值对。总结来说,映射的特点是:一个K对应一个V,K是一个set集合,是不可重复的,无序的,如果加入相同K的键值对时,则会替换原来的键值对。
以上三种集合框架的应用是很广的,比如对一个整型数组进行去重复排序,就可以用Set对数组去重复,然后在用其他排序方法对去重复的数组进行排序。要统计一个数组中的相同元素的个数,就可以用Map对数组进行操作,返回数组元素及其出现的次数。具体代码如下:
public class Test {
public static void main(String args[]){
//初始化一个数组
int[] array = {2,3,5,3,7,4,9,3,2,1,8,6,3,8,7,3,2,1,9,};
//创建Test类对象
Test ft = new Test();
int[] ar = ft.reSet(array);
for (int i=0;i<ar.length;i++){
System.out.print(ar[i]+"\t");
}
java.util.HashMap<Integer,Integer> map = ft.reput(array);
ft.print(map);
}
/*
* 去掉数组中重复的元素并排序的方法
*/
public int[] reSet(int[] arr) {
// 创建HashSet的对象
java.util.HashSet<Integer> set = new java.util.HashSet<Integer>();
// 遍历数组,将数组中的元素加到HashSet中
for (int i = 0; i < arr.length; i++) {
// 将数组的元素添加到集合中
set.add(arr[i]);
}
// 再将集合中的元素保存回数组中
// 实例化一个数组
int[] temps = new int[set.size()];
// 得到迭代器对象
java.util.Iterator<Integer> ter = set.iterator();
int k=0;
while (ter.hasNext()) {
temps[k] = ter.next();
k++;
}
// 冒泡排序
for (int i = 0; i < temps.length; i++) {
for (int j = i + 1; j < temps.length; j++) {
if (temps[i] > temps[j]) {
int temp = temps[i];
temps[i] = temps[j];
temps[j] = temp;
}
}
}
return temps;
}
/*
* 返回数组中相同元素的个数的方法
*/
public java.util.HashMap<Integer,Integer> reput(int[] arr){
//创建映射对象
java.util.HashMap<Integer,Integer> map = new java.util.HashMap<Integer,Integer>();
int[] key = reSet(arr);
//实例化一个数组
int[] value = new int[key.length];
for (int i=0;i<key.length;i++){
for (int j=0;j<arr.length;j++){
if (key[i]==arr[j]){
value[i]++;
}
}
}
for (int i=0;i<key.length;i++){
map.put(key[i], value[i]);
}
return map;
}
//打印映射的方法
public void print(java.util.HashMap<Integer,Integer> map){
//遍历
//得到K的set集合
java.util.Set<Integer> set = map.keySet();
//遍历K的集合,得到K的迭代器对象
java.util.Iterator<Integer> iter = set.iterator();
while(iter.hasNext()){
int num = iter.next();
int str = map.get(num);
System.out.println(num+"\t"+str);
}
}
}
运行结果:
1 2 3 4 5 6 7 8
9
1 2
2 3
3 5
4 1
5 1
6 1
7 2
8 2
9 2
发表评论
-
Java动态加载小结
2012-03-04 01:15 3034上一节课老师讲了java类的动态装载与反射,上课时听的 ... -
挂链式Hash表的实现
2011-11-23 22:10 2000最基本的 ... -
String类常用方法总结
2011-08-30 14:34 1549自己对字符串的各种方法不太熟悉,今天把主要的方法都试了一遍,简 ... -
哈夫曼树小结
2011-08-12 00:44 3148所谓哈夫曼树,又称为最优二叉树,要了解哈夫曼树,首先先来了解几 ... -
线索二叉树小结
2011-08-11 23:52 1517在前面总结的链表是一种一对一的关系,而有一种一对多的关系就是树 ... -
Java中自定义链表总结
2011-08-10 01:15 1900在C/C++中可知链表是一种物理存储单元上非顺序的线性存储结构 ... -
以打砖块游戏来理解多线程
2011-08-08 01:51 1568前几天学习了多线程,现在总结自己做的一个打砖块的游戏,以此来加 ... -
多线程总结
2011-08-03 01:26 14511.进程,程序的区别 在上一篇总结中总结了进程与线程的区别, ... -
多线程入门总结
2011-08-02 01:35 1211什么是线程 提到线程,首先要了解进程。每个程序都有一个入口,在 ... -
画图板数据的存取
2011-07-31 13:40 1224前段时间作了个简单的画图板,能够画直线,矩形,椭圆,三角形四种 ... -
异常机制小结
2011-07-31 13:31 904什么是异常 异常是指程序运行时,可能由于外部系统的条件的变更而 ... -
输入输出流的总结
2011-07-30 15:40 1521我们都知道在电脑上对数据的存储有三种方式,一种是外存,一种是内 ... -
Java中文件的操作
2011-07-30 12:21 2119文件可分为目录文件、 ... -
java中常用关键字总结
2011-07-24 01:15 1400关键字的定义 所谓关键 ... -
Java基础之登陆界面开发入门
2011-06-21 00:40 2155在前面学了继承,就可 ... -
Java基础知识总结
2011-06-15 21:56 576这学期在学校初步接触了Java,感觉对Java挺有兴趣的。于是 ...
相关推荐
JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解JAVA常用集合框架讲解
java常用集合框架.pdf
- **迭代器遍历**:Java中的迭代器(Iterator)设计模式用于遍历集合,它能确保元素的正确遍历,即使在遍历过程中修改集合,只要不违反并发修改原则,也能正常工作。 - **增强型for循环(foreach)遍历**:Java 5...
本篇将详细阐述Java常用的集合框架,包括Map、Set和List接口,以及它们的主要实现类,如HashMap、HashSet、ArrayList、LinkedList和Vector。 1. **Map接口**: Map接口是Java集合框架中用于存储键值对的接口,不...
在Java中,集合框架始于`java.util`包,包含了多种接口和实现类,用于存储和操作对象。 1.1.1 **容器简介** 容器是用来存储一组对象的结构,可以是数组、链表或者其他复杂的数据结构。Java集合框架中的容器主要...
Java 集合框架中常用的接口有: * Collection:顶层接口,定义了集合的抽象数据类型。 * List:继承自 Collection 接口,定义了一个有序的集合。 * Set:继承自 Collection 接口,定义了一个无序的集合。 * Map:...
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储和操作提供了丰富的类库。泛型是Java 5引入的一项创新特性,极大地增强了集合框架的安全性和效率。本讲解将深入探讨这两个主题,以及与之相关的...
能学到什么:在学习Java的朋友,可以从本文教程中学习到Java中最常用的集合框架,HashMap,ArrayList,HashSet等,同时又基于代码有一定层次的原理解释,让大家知其然,知其所以然,而又不会有太高的学习门槛。...
Java集合框架是Java编程语言中的一个核心部分,它为数据结构和对象的存储、管理和操作提供了统一的接口和实现。这个框架包括了多种类型的集合,如List、Set、Queue和Map,以及它们的各种实现类,如ArrayList、...
Java集合框架是Java编程语言中一个非常重要的...总的来说,Java集合框架通过其丰富的接口和实现,使得在Java中处理和管理对象变得更加灵活和高效。理解并熟练使用这些集合类和接口,对于编写高质量的Java代码至关重要。
根据提供的文档内容,文件是关于Java集合框架的面试题知识点总结。以下是Java集合框架的知识点详述: Java集合框架主要包括Collection接口和Map接口两大分支。Collection接口主要包括List、Set以及Queue三个子接口...
在Java中,集合框架主要由两个顶级接口构成:`Collection`和`Map`。`Collection`接口是所有单值容器的父接口,包括了`List`、`Set`和`Queue`等子接口。`Map`接口则代表键值对的容器,如`HashMap`、`TreeMap`等。 1....
在Java中,集合框架是实现这一概念的标准化结构,它包括接口、接口的实现和算法。接口定义了集合的行为,比如添加、删除和查询元素;实现则是接口的具体类,它们提供了实际的数据结构,如链表、数组或树;算法是一...
Java集合框架是Java编程语言中的一个核心组件,它为存储、管理和操作对象提供了一套统一的接口和类。集合框架使得开发者可以更加高效地处理数据,而无需关注底层的实现细节。本文将深入探讨Java集合框架的主要组成...
### Java 2 集合框架详解 #### 一、Java 2 集合框架概览 Java 2 集合框架是Java标准库的一部分,它为开发者提供了多种多样的容器,使得管理和操作对象变得更为高效和简单。整个框架主要由三部分构成:集合接口、...
在压缩包中的"chapter12.html"文件,很可能是书中第十二章的内容,这一章可能详细讲解了某种特定的数据结构或Java集合框架的高级话题,如树的遍历方法(前序、中序、后序),堆(优先队列)的概念及其在Java中的实现...
在Java编程中,集合框架是一个非常重要的概念,它提供了标准的方式来存储和操作数据集合。Java集合框架的设计原则是将数据结构抽象成一组接口,再通过不同的实现类来具体实现这些接口。这使得Java开发者能够专注于...