精华内容
下载资源
问答
  • 经过测试之后发现Set集合在添加元素时add()和addAll()方法就对元素进行了"审查", 对比查看是否为尚未存在的元素然后选择是否添加进去. 关于这两种方法底层是如何实现的, 就是我在这里想要说明的. 我们知道Set...

    最近在学习Collection时发现Set集合的一个显著特点: 不包含重复元素. 经过测试之后发现Set集合在向其添加元素时add()和addAll()方法就对元素进行了"审查", 对比查看是否为尚未存在的元素然后选择是否添加进去. 关于这两种方法底层是如何实现的, 就是我在这里想要说明的.

    我们知道Set集合是建立在Map的基础之上, 其绝大多数方法构造时都是直接引用了Map中的方法.

    这里我们先以HashSet列举一个事例:

      HashSet<String> hs = new HashSet<String>();
      System.out.println(hs.add(null));
      System.out.println(hs.add(null));
      System.out.println(hs.add("Shawyeok"));
      System.out.println(hs.add("Java"));
      System.out.println(hs.add("Shawyeok"));


    这里hs在调用add()向内添加元素的时候, 首先会判断元素是否为null(Set的这种不重复元素特性注定会出现一个现象----一个Set集合中最多只能包含一个null元素)若为null则会查找集合中是否有null元素, 若没有则添加成功, 返回true; 反之则添加失败, 返回false.

    若元素非null, 则首先调用元素的hashCode()方法得到其哈希值与集合中的各个元素的哈希值一一比较, 如果不相同说明这是两个不同的元素, 可以添加;  如果相同则再调用equals方法对两个元素进行比较, 若equals方法返回true则说明两个元素是同一元素, 不能添加; 反之, 说明两元素非同一元素, 可以添加.

    下面是运行结果:

    true
    false
    true
    true
    false

    如何向Set集合中添加我们自己定义的类的对象呢?

    上面已经说明了Set集合是如何保证不添加重复元素的, 我们可以想到重写继承自Object类中hashCode()以及equals()方法来保证不添加重复元素. 同样的, 写一个事例:

    import java.util.*;
    
    class Test {
    	public static void main(String[] args) {
    		HashSet<Person> hs = new HashSet<Person>();
    		Person Tim = new Person("Tim", Person.MAN, 176);
    		Person Jine = new Person("Jine", Person.WOMAN, 173);
    		System.out.println(hs.add(Tim));
    		System.out.println(hs.add(Jine));
    		System.out.println(hs.add(new Person("Tim", Person.MAN, 176)));
    	}
    }
    class Person {
    	private String name;
    	private boolean gender;		//true:man ; false:woman
    	private int height;
    	
    	public static final boolean MAN = true;
    	public static final boolean WOMAN = false;
    	
    	public Person(String name, boolean gender, int height) {
    		this.name = name;
    		this.gender = gender;
    		this.height = height;
    	}
    	
    	public int hashCode() {
    		int sum = name.hashCode() + height*2;		//这里height乘以2是为了尽量保证不同元素哈希值的唯一性
    		if(gender) {
    			sum++;
    		} else {
    			sum--;
    		}
    		return sum;
    	}
    	
    	public boolean equals(Object obj) {
    		if(!(obj instanceof Person)) {
    			return false;
    		}
    		
    		Person p = (Person)obj;
    		if(this.name != p.name) {
    			return false;
    		}
    		if(this.gender != p.gender) {
    			return false;
    		}
    		if(this.height != p.height) {
    			return false;
    		}
    		return true;
    	}
    }
     

    下面是程序打印结果:

    true
    true
    false

    从结果可以看出以上的分析是正确的.

    注: 以上分析可能会有讲述不妥以及语义欠缺的情况, 敬请谅解.关于Set集合更多特性的详细信息请参考阅读Java源代码.


     

     

     

     

    展开全文
  • 基于你的collection的大小,也许HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。 说一下 HashMap 的实现原理? HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的...

    回答方式:

    对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。

    然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。

    基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。

    说一下 HashMap 的实现原理?

    HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

    HashMap的数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

    当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

    需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)。

    如何选择合适的Map?

    1. HashMap可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。
    2. LinkedHashMap保留了HashMap的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好。
    3. TreeMap能便捷的实现对其内部元素的各种排序,但其一般性能比前两种map差。

    LinkedHashMap映射减少了HashMap排序中的混乱,且不会导致TreeMap的性能损失。

    展开全文
  • 添加元素 返回值 构造器 方法作用 Boolean add(E e) 列表尾部添加一个元素 void add(int index , E element) 指定位置插入一个元素 注意事项: 1.list在迭代过程不能修改列表长度(迭代器指针只能...

    list接口

    常用方法

    添加元素

    返回值 构造器 方法作用
    Boolean add(E e) 向列表尾部添加一个元素
    void add(int index , E element) 向指定位置插入一个元素

    注意事项
    1.list在迭代过程中不能修改列表长度(迭代器指针只能向前移动)→迭代器的并发修改异常
    2.如何避免迭代器的并发修改异常:使用ListIterator迭代器
    删除元素

    返回值 构造器 方法作用
    E remove(int index) 移除列表指定位置元素
    Boolean remove(object o) 移除列表中第一次出现的元素o

    修改元素

    返回值 构造器 方法作用
    E set(int index, E element) 替换指定位置的元素

    查询元素

    返回值 构造器 方法作用
    E get(int index) 返回列表指定位置的元素

    ArrayList集合

    ArrayList使用的是数组的存储结构,因此ArrayList集合增删慢查找快

    LinkedList集合

    LinkedList使用的是链表的存储结构,因此LinkedList集合增删快查找慢

    Set接口

    HashSet集合

    注意事项
    1.set集合为无序集合不能存放重复元素
    2.set集合通过hashcode和equals方法保证数据元素的唯一性
    3.引用数据类型必须重写equalshashcode方法
    4.HashSet使用的是哈希表的存储结构(单向链表)

    LinkedHashSet

    LikedHashSet使用的是哈希表的存储结构(双重链表),LinkedHashSet是有序集合

    Map接口

    注意事项
    1.map集合中没有迭代器,遍历map集合要使用keyset方法将key转化为set集合,再利用set集合对value进行遍历
    2.map集合也可以利用键值对对象(Entry)进行遍历

    展开全文
  • map 对key 或 value排序

    2016-09-06 09:49:38
    我们借助map提供的参数接口,为它指定相应Compare类,就可以实现对map按Key排序,是在创建map并不断的其中添加元素的过程就会完成排序。 该如何实现Map的按Value排序呢?   第一反应是利用stl提供的sort...

    按KEY排序:

    我们借助map提供的参数接口,为它指定相应Compare类,就可以实现对map按Key排序,是在创建map并不断的向其中添加元素的过程中就会完成排序。


    该如何实现Map的按Value排序呢? 

            第一反应是利用stl中提供的sort算法实现,这个想法是好的,不幸的是,sort算法有个限制,利用sort算法只能对序列容器进行排序,就是线性的(如vector,list,deque)。map也是一个集合容器,它里面存储的元素是pair,但是它不是线性存储的(前面提过,像红黑树),所以利用sort不能直接和map结合进行排序。

    虽然不能直接用sort对map进行排序,那么我们可不可以迂回一下,把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序

    #include <string>
    #include <vector>
    #include <map>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef pair<string, int> PAIR;
    int main() {
    	map<string, int> name_score_map;
    
    	name_score_map["LiMin"] = 90;
    
    	name_score_map["ZiLinMi"] = 79;
    
    	name_score_map["BoB"] = 92;
    	name_score_map.insert(make_pair("Bing", 99));
    
    	name_score_map.insert(make_pair("Albert", 86));
    
    	//把map中元素转存到vector中    
    	vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());
    
    	sort(name_score_vec.begin(), name_score_vec.end(), [](PAIR L1, PAIR L2) {return L1.second < L2.second; });
    
    	// sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value);   
    
    	for (int i = 0; i != name_score_vec.size(); ++i) {
    
    		cout << name_score_vec[i].first << name_score_vec[i].second<< endl;
    
    
    	}
    	return 0;
    }


    展开全文
  • 说明:该集合添加元素,不管元素添加顺序如何,都会按照一定顺序去排列 TreeSet排序规则 1、自然排序 要求必须实现Comparable接口的Comparato()方法 以自定义的Teacher类为实例 说明:当age相同时,再对name...
  • maps

    2018-12-24 09:21:00
    给map添加元素 获取map中的元素 删除map中的元素 获取map的长度 Map是引用类型 Map的相等性 下面开始学习 1.什么是map? map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。 ...
  • 2、如何创建,使用,编辑以及管理存储在GEODATABASE数据模型空间数据和属性数据 主讲人:GIS硕士、南京路川公司专业技术开发工程师 3、以ARCCIS9的功能结构主线,学习利用ARCCIS进行数据输入,数据编辑,地图配标...
  • Java 9 版本以前,假如要创建一个包含 6 个元素的 Set 集合,程序需要先创建 Set 集合,然后调用 6 次 add() 方法 Set 集合中添加元素。Java 9 对此进行了简化,程序直接调用 Set、List、Map 的 of() 方法即可创建...
  • 如果有一个长度为15的数组,存储着5个数据,我们现在要数组中添加一个新的元素,要求数组中所有元素的值不能重复,该如何有效解决? 这个问题相对简单,我们可以对数组,数组进行遍历,判断数组中每个元素的值与...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • java集合大家族之总结

    2016-08-15 14:03:45
    Collection和Map都可以在你其中添加更多的元素时,自动调整其尺寸。 容器不能持有基本类型,当你尝试容器加入一个基本类型时会自动包装。 如果要进行大量的随机访问,就是有ArrayList。如果要经常从表中间插入...
  • jQuery详细教程

    2013-04-25 14:16:42
    当我们在教程演示 jQuery 时,会将函数直接添加到 <head> 部分。不过,把它们放到一个单独的文件会更好,就像这样(通过 src 属性来引用文件): 实例 <script type="text/javascript" src="jquery.js"></...
  • 按钮添加了EventListener方法。 按钮保存:将内容保存在本地存储。 按钮加载:从本地存储加载内容。 我在项目使用的工具: 吉特 node.js和npm gulp入门套件 具有自动刷新的本地服务器 SCSS和Sourcemap...
  • 2.2.4 int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据第一个元素为0的下标。 2.2.5 写一个程序, 要求...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    数据结构,如何遍历List元素? 如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

如何向map中添加元素