关于java语言中的hashmap与hashset的浅层使用

leetcode第三题,hashset与hashmap

关于寻找最长的不重复的子字符串的一个简单的问题可以很好的使用到hashset与hashmap两个类。首先对hashset与hashmap两个类进行一个简单的解释与说明。

Set与HashSet

Set:hashset是set接口的实现类,关于接口set,以下文字是Java API中关于set接口的描述

public interface Set
extends Collection
不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。 正如其名称所暗示的那样,这个接口模拟了数学集抽象。
Set接口除了继承自Collection接口的所有构造函数的合同以及add,equals和hashCode方法的合同外 , 还 增加了其他规定。 其他继承方法的声明也包括在这里以方便。 (伴随这些声明的规范已经量身定做Set接口,但它们不包含任何附加的规定。)
构造函数的额外规定并不奇怪,所有构造函数都必须创建一个不包含重复元素的集合(如上所定义)。

java8中文版为原文链接)
下面我们就来看一下HashSet的常用的几个方法以及它的构造函数:

public HashSet()构造一个新的空集合
public HashSet(Collection<? extends E> c)构造一个包含指定集合中的元素的新集合。
public boolean add(E e)将指定的元素添加到此集合(如果尚未存在)
public boolean isEmpty()如果此集合不包含元素,则返回 true
public void clear()从此集合中删除所有元素
public boolean contains(Object o)如果此集合包含指定的元素,则返回 true
public boolean remove(Object o)如果存在,则从该集合中删除指定的元素
public int size()返回此集合中的元素数
public class Solution
 {
    public int lengthOfLongestSubstring(String s) 
    {        
        int n = s.length();        
        Set<Character> set = new HashSet<>();       
        int ans = 0, i = 0, j = 0;        
        while (i < n && j < n) 
        {            // try to extend the range [i, j]            
           if (!set.contains(s.charAt(j)))
           {                
              set.add(s.charAt(j++));               
              ans = Math.max(ans, j - i);           
           }            
           else 
           {                
              set.remove(s.charAt(i++));          
           }       
        }      
        return ans;  
     }
 }

Map与HashMap

类似地,HashMap类实现的是Map接口,首先是对Map接口的描述:

public interface Map<K,V>
将键映射到值的对象。 地图不能包含重复的键; 每个键可以映射到最多一个值。

用通俗的话来解释说就是:在Map中键就相当于是标识符,用于区别值,绝对不能重复,但值是可以重复的,这种关系类似于y(值)与x(键)的函数关系,一个y可以对应多个x,但一个x只能对应一个y;
下面我们来看看HashMap的构造函数与常用方法:
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
基于哈希表的实现的Map接口。 此实现提供了所有可选的地图操作,并允许null的值和null键。 ( HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null)。这个类不能保证地图的顺序; 特别是,它不能保证订单在一段时间内保持不变

|

public HashMap()构造一个空的 HashMap
public int size()返回此地图中键值映射的数量
public boolean isEmpty()如果此地图不包含键值映射,则返回 true 。
public V get(Object key)返回到指定键所映射的值,或null如果此映射包含该键的映射
public boolean containsKey(Object key)如果此映射包含指定键的映射,则返回 true 。
public V put(K key,V value)将指定的值与此映射中的指定键相关联。 如果地图先前包含了该键的映射,则替换旧值。
public void putAll(Map<? extends K,? extends V> m)将指定地图的所有映射复制到此地图。 这些映射将替换此映射对当前在指定映射中的任何键的任何映射
public V remove(Object key)从该地图中删除指定键的映射(如果存在)

此外,更详细的方法请参考上文链接

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>(); // current index of character
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                i = Math.max(map.get(s.charAt(j)), i);
            }
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值