黑马Java学习笔记之-----集合框架

---------------------- android培训java培训、期待与您交流! ----------------------

 

一.概述:

Java的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象(实际上是对象的引用),并可以实现常用的数据结构,如栈,队列等。除此之外,还可以用于保存具有映射关系的关联数组。Java的集合大致上可分为:SetListMap三种体系,其中,Set代表无序,不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。

Java的集合类主要由两个接口派生而出:CollectionMap。(HashSetArrayListHashMap是最常用的实现类)

 

 

(二)CollectionIterator接口:

1. Collection接口定义的操作集合元素的常用方法:

 

2. Iterator接口主要用于遍历(即迭代访问)Collection中的元素,Iterator对象也被称为   迭代器。Iterator接口定义了如下三个方法:

 

(三)Set接口:

Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为不同(Set不允许出现重复元素)。

Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,如果只要两个对象用equals方法比较返回trueSet就不会接受这两个对象。

1. HashSet类:

HashSetSet接口的典型实现。

HashSet具有以下特点:

a. 不能保证元素的排列顺序,顺序有可能发生变化。

b. HashSet不是同步的。

c. 集合元素值可以是null

    HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两   个对象的hashCode()方法返回值也相等。

注意:如果需要某个类的对象保存到HashSet集合中,重写这个类的equals()方法和

  hashCode()方法时,应该保证两个对象通过equals比较返回true时,他们的hashCode   方法返回值也相等。

重写hashCode()方法的基本原则:

1. 当两个对象通过equals方法比较返回true时,这两个对象的hashCode应该相等。

2. 对象中用作equals比较标准的属性,都应该用来计算hashCode值。

 

2. TreeSet类:

TreeSetSortedSet接口的唯一实现,TreeSet可以保证集合元素处于排序状态。

HashSet相比,TreeSet还提供了几个额外的方法:

 

注意:如果试图把一个对象添加进TreeSet时,则该对象的类必须实现Comparable接口,否   则程序可能跑出异常。

 

 

(四)List接口:

List集合代表一个有序集合,允许元素重复。List集合默认按元素的添加顺序设置元素的索引。

1. List接口和ListIterator接口

List集合常用方法:

 

ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下方法:

 

ListIterator增加了向前迭代的功能。

 

2. ArrayListVector实现类:

 

  ArrayListVector类都是基于数组实现的List类,所以ArrayListVector类封装了   一个动态再分配的Object[ ]数组。

 

  ArrayList是线程不安全的,程序必须手动保证该集合的同步性;Vector是线程安全的。

 

 各种容器的性能比较:

 

(五)Map

Map用于保存具有映射关系的数据。Mapkey不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false

Map接口定义的常用方法:

 

Map中包含一个内部类:Entry。该类封装了一个key--value对,Entry包含三个方法:

 

1. HashMapHashtable实现类:

HashtableHashMap的区别:

1. Hashtable是一个线程安全的实现,但HashMap是线程不安全的实现。

2. Hashtable不允许使用null作为keyvalue,如果试图把null值放进Hashtable  中,将会引发NullPointrException异常;但HashMap可以使用null作为keyvalue

 

 1 /*
 2 Map集合的两种取出方式:
 3     1.Set<k> keySet():将Map集合中的所有键存入Set中,疑问Set具备迭代器。
 4         所以可以根据迭代方式取出键,再根据get方法,获取每一个键对应的值。
 5     
 6     2.Set<Map.Entry<k,v>> entrySet():将Map集合中的映射关系存入到Set集合中,
 7         而这个映射关系的数据类型就是:Map.Entry。
 8 
 9 */
10 
11 import java.util.*;
12 
13 class Test1
14 {
15     public static void main(String[] args)
16     {
17         HashMap<String,String> hm = new HashMap<String,String>();
18         hm.put("null","null");
19         hm.put("java01","3344");
20         hm.put("java02","3444");
21         hm.put("java03","33244");
22 
23         Set<String> s = hm.keySet();
24         Iterator<String> it = s.iterator();
25         while (it.hasNext())
26         {
27             String key = it.next();
28             System.out.println(key+":"+hm.get(key));
29         }
30     }
31 }
32 
33 
34 class Test2
35 {
36     public static void main(String[] args)
37     {
38         HashMap<String,String> hm = new HashMap<String,String>();
39         hm.put("null","null");
40         hm.put("java01","3344");
41         hm.put("java02","3444");
42         hm.put("java03","33244");
43         //将Map集合中的映射关系取出,存入到Set集合中。
44         Set<Map.Entry<String,String>> s = hm.entrySet();
45         Iterator<Map.Entry<String,String>> it = s.iterator();
46         while (it.hasNext())
47         {
48             Map.Entry<String,String> me = it.next();
49             String key = me.getKey();
50             String value = me.getValue();
51             System.out.println(key+":"+value);
52         }
53     }
54 }

 

 1 /*
 2     练习:
 3     每一个学生都有对应的归属地,
 4     学生Student,地址String
 5     注意:姓名和年龄相同的视为同一学生
 6     保证学生的唯一性。
 7 
 8     1. 描述学生类,重写equals和hashCode方法。(有序则重写Comparable接口中的compareTo方法)
 9     2. 定义Map容器,将学生作为键,地址作为值,存入。
10     3. 获取Map集合中的元素,两种方式:keySet和entrySet。
11 
12 */
13 
14 
15 import java.util.*;
16 
17 class Student
18 {
19     private String name;
20     private int age;
21 
22     Student(String name, int age)
23     {
24         this.name = name;
25         this.age = age;
26     }
27     public String toString()   //重写toString方法
28     {
29         return name+":"+age;
30     }
31     public boolean equals(Object obj)  //重写equals方法
32     {
33         if (!(obj instanceof Student))
34         {
35             throw new ClassCastException("类型不匹配!");
36         }
37         Student s = (Student)obj;
38         return this.name.equals(s.name)&&this.age==s.age;  //名字和年龄都相等则返回true
39     }
40     public int hashCode()    //重写hashCode方法
41     {
42         return name.hashCode()+age*17;
43     }
44 
45 }
46 
47 public class Practice
48 {
49     public static void main(String[] args)
50     {
51         Map<Student,String> hm = new HashMap<Student,String>();
52         hm.put(new Student("xiaok",22),"Beijing");
53         hm.put(new Student("xiaok",22),"Nanjing");
54         hm.put(new Student("xiaoh",19),"Tianjing");
55         hm.put(new Student("xiaol",23),"Fuzhou");
56 
57         //获取Map元素第一种方式:keySet
58         Set<Student> s = hm.keySet();
59         Iterator<Student> it = s.iterator();
60         while (it.hasNext())
61         {
62             Student key = it.next();
63             System.out.println(key+":::"+hm.get(key));
64         }
65 
66         System.out.println("###########################");
67 
68         //获取Map元素第二种方式:entrySet
69 
70         Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
71         Iterator<Map.Entry<Student,String>> it2 = entrySet.iterator();
72         while (it2.hasNext())
73         {
74             Map.Entry<Student,String> me = it2.next();
75             Student ss = me.getKey();
76             String addr = me.getValue();
77             System.out.println(ss+"....."+addr);
78         }
79     }
80 }
 1 /*
 2     练习:
 3         获取字符串中字母出现的次数
 4         如:"adfadff"  打印:a(2)d(2)f(3)...
 5     
 6     思路:
 7         1. 将字符串转换成字符数组,因为要对每一个字母进行操作。
 8         2. 定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
 9         3. 遍历字符数组:
10              将每一个字母作为键去查Map集合,get(key)方法。
11              如果返回null,将该字母和1存入到Map集合
12              如果返回不是null,说明该字母在Map集合中存在并有对应次数。
13              那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到Map集合中,
14         4. 将Map集合中的数据编程指定的字符串形式返回。
15 
16 */
17 import java.util.*;
18 
19 public class Practice2
20 {
21     public static void main(String[] args)
22     {
23         charCount("adfadfads");
24     }
25 
26     public static void charCount(String str)
27     {
28         char[] chArr = str.toCharArray();  //将字符串转换成字符数组
29         TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  //定义一个Map集合
30         for (int i=0; i<chArr.length ; i++ )  //遍历字符数组
31         {
32             Integer value=tm.get(chArr[i]);
33             if (value==null)
34             {
35                 tm.put(chArr[i],1);
36             }
37             else
38             {
39                 value++;
40                 tm.put(chArr[i],value);
41             }
42         }
43         Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
44         Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
45         while (it.hasNext())
46         {
47             Map.Entry<Character,Integer> me = it.next();
48             Character key = me.getKey();
49             Integer value = me.getValue();
50             System.out.print(key+"("+value+")");
51         }
52         
53     }
54 }

 

 


 

---------------------- android培训java培训、期待与您交流! ----------------------

 

 

转载于:https://www.cnblogs.com/MercyK/archive/2013/04/29/3014737.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(JAVA)基本数据类型 对象包装类

package com.book.lite;/*** author zhangyu* date 2021年08月15日 4:51 下午* 基本数据类型 对象包装类* 对八个基本数据类型&#xff0c;提供8个类&#xff0c;&#xff0c;将基本数据类型&#xff0c;封装成8个对象* byte Byte* short Short* int I…

作业自动提示功能设计思路

1、利用现在FLEX项目中的心跳包机制&#xff0c;使用SOCKET心跳包技术获取最新的作业情况。 2、在现在FLEX项目中有一个&#xff1a; 核心代码&#xff1a; 这样我们可以利用这个通道&#xff0c;获取相应的信息。 具体修改步骤如下&#xff1a; 1、准备工作 创建一张表&#x…

libev源码分析--常用的watcher

在上一篇文章里&#xff0c;我们分析了libev整体设计思想和主循环的工作原理&#xff0c;也提到了watcher是衔接开发者代码的主要入口。watcher与开发者最接近&#xff0c;也与具体事件处理逻辑最接近。所以&#xff0c;watcher的具体实现&#xff0c;与性能的关系也相当密切。…

(Java)Character类

package com.book.lite;import sun.lwawt.macosx.CSystemTray;import java.util.Scanner;/*** author zhangyu* date 2021年08月16日 10:50 下午* Character类的方法* 1.判断是否小写&#xff1a;isLowerCase()* 2.判断是否大写&#xff1a;isUpperCase()* 3.判断是不是数字&am…

棋盘切割 DP POJ 1191

把方差公式先变形为 σ2 (1/n)∑xi2-xa2 xa为平均值。 由于要求标准差最小&#xff0c;只需方差最小&#xff0c;平均值都是一样的&#xff0c;n也是一样的&#xff0c;这样原问题就变为求这n快小棋盘总分的平方和最小 考虑左上角为&#xff08;x1,y1&#xff09;,右上角为&am…

lucene,lucene.net学习教程

lucene学习教程 1.1 什么是lucene Lucene是一个全文搜索框架&#xff0c;而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用&#xff0c;它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式 lucene提供的服务实际包含两部分&#xf…

python 使用 pip 安装第三方库 导入不成功

本文是什么意思呢&#xff1f; 就是你需要使用一些库安装老师或者网上说的 通过pip 安装下载了第三方库&#xff0c;但是使用 import xxx from xxx import xx &#xff0c;pycharm ide 导入的下面还有红色波浪线&#xff0c;导入不成功。 这是什么原因&#xff1f; 这是pyc…

SIFT算法

介绍这个算法的网上的博客很多&#xff0c;这个百度一下就有很多篇&#xff0c;我写一下我的认识。 前面考虑的一个图像的特征点是角点&#xff0c;这边提出了&#xff0c;图像的特征点可以是一个斑点&#xff0c;就像 明显的就是部分向日葵的原型就是一个特征&#xff0c;而这…

PHP中过滤数组中的元素

演示使用自定义函数删除数组中的偶数元素。 <?php function myfunc(&$arr){//自定义一个过滤函数$jcount($arr);for($i0;$i<$j;$i){if($arr[$i]%20)unset($arr[$i]);} }$arrarray(23,14,37,263,244,379,100,153,150);//定义一个数组 echo 数组进行过滤之前的信息&am…

Schema evolution in Avro, Protocol Buffers and Thrift

http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html 当想要数据, 比如对象或其他类型的, 存到文件或是通过网络传输, 需要面对的问题是序列化问题 对于序列化, 当然各个语言都提供相应的包, 比如, Java serialization, Ruby’s ma…