ARTS第二周
Posted jxl00125
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARTS第二周相关的知识,希望对你有一定的参考价值。
第二周。
1.Algorithm:每周至少做一个 leetcode 的算法题
2.Review:阅读并点评至少一篇英文技术文章
3.Tip:学习至少一个技术技巧
4.Share:分享一篇有观点和思考的技术文章
以下是各项的情况:
Algorithm
上周的有点问题 :
假如数组【3,2,4】给的数据是 6 ,按我之前的思路 直接从遍历去找当前遍历的数和所给数据和的差值,但如果从第一个数3走,那给出的答案就会是【0,0】而非期望的【1,2】。所以需要修改:
class Solution public int[] twoSum(int[] nums, int target) HashMap<Integer,Integer> map= new HashMap<Integer,Integer>(); int[] result = new int[2]; for(int i=0;i<nums.length;i++) if(map.containsKey(target-nums[i])) result[1]=i; result[0] = map.get(target-nums[i]); break; else map.put(nums[i],i); return result;
思路 是 干脆就来两个指针 来指向和存 就不会出现指向同一个位置的了。
这周的链接 :[LeetCode-07]-Reverse Integer
Java:
class Solution public int reverse(int x) if(x == 0) return x; else int r = 0; while(x != 0) if(r > 2147483647/10 || r < -2147483647/10) return 0; r = r*10 + x%10; x = x/10; return r;
Review
回顾
1. 内部存储器
JAVA 中 HashMap 类 是 Map <K,V> 接口的实现 。该接口的主要方法是:
- V put(K key, V value)
- V get(Object key)
- V remove(Object key)
- Boolean containsKey(Object key)
HashMaps用一个内部类来存储数据:Entry <K,V>。此 Entry 是一个带有两个额外数据的简单键值对:
-
- 对另一个 Entry 的引用,以便 HashMap 可以存储单个链接列表等条目
- 一个哈希值用来存 key 值。这个哈希值是用来存储该散列值,以避免每次使用 HashMap 需要重新计算散列。
以下是JAVA 7中Entry实现的一部分:
static class Entry<K,V> implements Map.Entry<K,V> final K key; V value; Entry<K,V> next; int hash; …
HashMap将数据存储到多个单链接的条目列表(也称为桶,buckets 或 目录 ,bins)中。所有列表都在 Entry(Entry <K,V> [] 数组)数组中注册,并且此内部数组的默认容量为16。
图显示了具有可为空条目数组的 HashMap 实例的内部存储。每个条目都可以链接到另一个条目以形成链接列表。
具有相同散列值的所有键都放在同一个链表(bucket)中。具有不同散列值的键可能最终出现在同一个 bucket 中。
当用户调用 put(K key,V value)或 get(Object key)方法时,该函数计算条目所在桶 (bucket)的索引。然后,函数遍历列表,寻找具有相同 key 的条目(使用 key 的 equals() 函数)。
对于 get()语句,函数返回与条目 Entry 关联的值(如果条目 Entry 存在)。
在put(K key,V value)语句中,如果条目 Entry 存在,则函数将用新值来替换原值,否则它将在单链接列表的头部创建新条目(来自参数中的键和值)。
bucket 的这个索引(链表)是由 Map 以3个步骤生成:
- 它首先获取 key 的哈希码 hashcode。
- 它重新散列 rehash 哈希码 , 以防止键的散列函数出错,因为键会将所有数据放在内部数组的相同索引(bucket)中
- 它接受重新散列的哈希码,并用数组的长度(- 1)对其进行位掩码操作。此操作确保索引不能大于数组的大小。您可以将其视为用来计算优化的模数函数
2. 自动调整大小
创建HashMap时,可以使用以下构造函数指定初始大小和loadFactor:
public HashMap(int initialCapacity, float loadFactor)
如果未指定参数,则默认initialCapacity为16,默认loadFactor为0.75。initialCapacity表示链接列表的内部数组的大小。
每次使用 put(…) 在 Map 中添加新键/值时,函数都会检查是否需要增加内部数组的容量。为了做到这一点,map存储了2个数据:
-
- Map 的大小:它表示HashMap中的条目数。此值在每次添加或删除条目时更新。
- 阈值:它等于(内部数组的容量)* loadFactor,每次调整内部数组的大小后都会刷新它
在添加新条目之前,put(…)检查大小是否为>阈值,如果是,则重新创建一个大小为双倍的新数组。由于新数组的大小发生了变化,索引函数(它返回按位操作“hash(key)和(sizeOfArray-1)”)发生了变化。因此,调整数组大小会创建两个以上的bucket(即链表),并将所有现有的条目重新分配到bucket中(旧的和新创建的)。
该图显示了调整内部数组大小前后的表示形式。在增加之前,为了得到条目E,map 必须遍历一个包含所有5个元素的列表。调整大小之后,相同的 get() 只遍历一个包含2个元素的链表,调整大小之后get()的速度是原来的2倍!
注意:HashMap只增加了内部数组的大小,而没有提供减小的方法。
未完待续 , 抽空补完 ...
3. 线程安全
4. 关键不变性
5. Java8的改动
6. 内存开销
Tip
曾遇到一个问题:
一个 springMVC 项目中 报异常信息 : cvc-complex-type.2.3: Element ‘beans‘ cannot have character [children], because the type‘s content type is element-only.
且 .xml 最底部的 </bean> 标红,且有 Error 提示。 如图示 :
异常分析过程 :
猜想可能是没法确认控制器包的位置,那么就需要从项目的src级别开始给出完整的地址,但是我排查了很久 没发现配置文件和代码有什么错 怎么回事?
异常解决方案 :
Google 后在https://stackoverflow.com/questions/26725306/springs-element-beans-cannot-have-character-children-because-the-types-con# 获得解决 .感谢Stack OverFlow 。
我有同样的问题。我看了几个小时。我找不到任何问题。然后我决定,如果你使用不同的编辑器,有时会看到不同的东西。我关闭了Netbeans并在emacs中打开了该文件。我立即看到,有一些不间断的空格字符,或制表符,或某些类型的空白不是空格。我不知道它是哪个角色但它在emacs中以红色显示,但在Netban中是空白
我看了这个答案后 , 发现果然是空格的问题 。 同时也证明了, 99%的代码问题源于愚蠢的琐碎问题。
Share
Code Tells You How,Comments Tell You Why。 Brilliant!这周继续推荐
耗子哥的文章 高效学习:如何学习和阅读代码
以上是关于ARTS第二周的主要内容,如果未能解决你的问题,请参考以下文章