String源码(1)
String是最常用的类没有之一,现在开始看一些String的源码。 先看String的hashCode实现。 /** * Returns a hash code for this string. The hash code for a * {@code
String是最常用的类没有之一,现在开始看一些String的源码。 先看String的hashCode实现。 /** * Returns a hash code for this string. The hash code for a * {@code
jdk8新方法forEach更好的遍历map数组进行操作了。 现在先看看以前的遍历写法: 以前总结的: String key = null; String value = null; for(Map.Entry<String,String> entry:map.entrySet()){ key = entry.getKey(); value = entry.getValue(); System.out.println("key;"+ key+",value:"+value); } for(String key:
hashmap里面的这个merge方法,融合的意思,将新的value和旧的value进行融合。 @Override public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { if (value == null) throw
这个和之前的两个方法相同。 @Override public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); int hash = hash(key); Node<K,V>[] tab; Node<K,V> first; int n, i; int binCount = 0; TreeNode<K,V> t = null; Node<K,V> old = null; if (size > threshold || (tab = table) == null ||
这个方法和computeIfAbsent这个都是Java8的新的内容,都是可以在添加map的时候添加一个方法来对key进行操作存储value
这个是Java8里面新增的功能 代码: public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { if (mappingFunction == null) throw new NullPointerException(); int hash = hash(key); Node<K,V>[] tab; Node<K,V> first; int n, i; int binCount = 0; TreeNode<K,V> t = null; Node<K,V> old = null; if (size > threshold || (tab = table) == null
HashMap#put() /** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key, the old * value is replaced. * * @param key key with which the specified value is to be associated * @param value value to be associated with the specified key * @return the previous value associated with <tt>key</tt>, or * <tt>null</tt> if there was
HashMap#resize() 在HashMap源码(2)最后有相关源码: 源码的注释翻译为: 初始化或者翻倍表大小。如果表为null,则根据存放在threshold变量中的
HashMap#hash() 为什么要有HashMap的hash()方法,难道不能直接使用KV中K原有的hash值吗?在HashMap的put、get操作时为什么不能直
HashMap初始化 初始化的几种情况: /** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and load factor. * * @param initialCapacity the initial capacity * @param loadFactor the load factor * @throws IllegalArgumentException if the initial capacity is negative * or the load factor is nonpositive */ public HashMap(int initialCapacity, float loadFactor) {
常量定义 1.默认容量 /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 默认初始化的容量是16,必须是2的幂。 2.最大容量 /** * The maximum capacity, used if a higher value
现在聊LinkedList的peek操作,这个操作都是进行输出参数,不会删除相关Node的。 /** * Retrieves, but does not remove, the first element of this list, * or returns {@code null} if this list is empty. *
在使用List的 时候经常是ArrayList和LinkedList他们两个各有千秋,根据自己的业务使用情况来使用,现在咱们看看LinkedL
现在接着说ArrayList的另外一个常用方法remove(). remove同样也是存在两个方法 1. public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if
volatile是共享变量“可见性”关键字,当该变量在一处更改后,在其他线程里读到的是这个修改后的值。它是轻量级的synchronized,
ArrayList继承了AbstractList并实现了List接口。 三种初始化的方法: 第一种:规定List长度的参数 public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new
Java中的final关键字非常重要,它可以应用于类、方法以及变量。将变量,方法和类声明为final代表了什么?使用final的好处是什么?
transient的作用和使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为
前两篇写了add和remove相关的源码,现在剩下的是零散的一些和Itr、SubList、ListItr几个相关的代码,这些应用次数也多但是
静态导包就是Java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。 一般我们导入一个类都用 import co
如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象。static 成员的最常见的例子是main( ) 。
static{}静态块会在类被加载的时候执行一次,一般用来初始化静态变量和调用静态方法。 1、static{}语句块执行的时机,类被加载的准确
HashMap和HashTable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主
HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类