return 语句,但是在函数调用后,都能取到一个返回值。...它们的执行效果跟直接写 return 语句相比,是完全相同的: 这 4 个例子属于两种类型:一种没有写 return,但是都有隐藏的 return 返回值;一种写了 return,而且实际也有返回值。...不管有没有写 return,它们都会执行 return 的逻辑,而且默认的返回值就是 None。 那么,问题来了:Python 的函数为什么能默认返回 None 呢?它是如何实现的呢?...答案就在解释器中,当 CPython 解释器执行到函数的最后一个代码块时,若发现没有返回值,它就会主动地加上一个 Py_None 值返回(出自:compile.c): 也就是说,如果定义的函数没有返回值...那么,这就会引出新的问题:Python 为什么要求函数都要有返回值呢?为什么它不像某些语言那样,提供一个 void 关键字,支持定义无返回值的空函数呢?
如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。...return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 如果值在 -128 到 127 之间,它就会返回该缓存的实例...这就是为什么这段代码的结果为true了: System.out.println(c == d); 现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?
奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true? 在回答这个问题之前,我们先来看看int和Integer的对比,一步步揭开问题的答案。...Integer i = new Integer(100); int j = 100; System.out.print(i == j); //true 因为包装类Integer和基本数据类型int比较时,java会自动拆包装为...Java两种数据类型 3.1 Java两种数据类型分类 原始数据类型,分为boolean、byte、int、char、long 、short、double、float 引用数据类型 ,分为数组、类、接口...// 直接在堆中new一个对象 Integer k = new Integer(100); } } java在编译Integer x = yyy ;时,会翻译成为...而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127
对于一个空数组, every() 无论回调函数是什么都会返回 true ,因为那个回调函数从未被调用过。...但是,为什么在没有值来运行回调函数时,空数组会返回 true 给 every() 呢? 要理解为什么,我们需要仔细看看规范是如何描述这个方法的。...如果数组中没有任何项目,那么就没有机会执行回调函数,因此,该方法无法返回 false 。 现在的问题是:为什么 every() 会表现出这样的行为?...在数学和JavaScript中的“对所有”的量词 MDN页面 提供了为什么 every() 会对空数组返回 true 的答案: every 的行为就像数学中的“全称量词”。...特别是对于空数组,它返回真值。(空集中的所有元素都满足任何给定条件,这是显然的真理。)
在C语言中,使用gets函数输入字符串时,如果输入的字符串长度超过了字符数组的边界,程序可能会崩溃。...缓冲区溢出的原因数组越界:当输入的字符串长度超过字符数组的容量时,gets函数会继续将多余的字符写入数组之外的内存区域。...这些额外的字符可能会覆盖相邻的变量、函数返回地址或其他重要数据,导致程序行为异常或崩溃。栈溢出:如果字符数组是在栈上分配的,超出数组边界的写操作可能会覆盖栈上的其他数据,包括函数的返回地址。...这种情况下,当函数返回时,程序会尝试跳转到一个无效的地址,从而导致崩溃。...总结使用gets函数时,如果输入的字符串长度超过字符数组的容量,会导致缓冲区溢出,进而可能引起程序崩溃。为了确保程序的安全性和稳定性,建议使用fgets等更安全的函数来替代gets。
为什么会有hooks大家都知道hooks是在函数组件的产物。之前class组件为什么没有出现hooks这种东西呢?答案很简单,不需要。...答案是,记录在函数组件对应的fiber节点中。两套hooks在我们刚开始学习使用hooks时,可能会有疑惑, 为什么hooks要在函数组件的顶部声明,而不能在条件语句或内部函数中声明?...为什么setState的值相同时,函数组件不更新?...返回update后的[newState, dispatchAction].还有两个问题为什么setState后不能马上拿到最新的state的值?...当调用setState触发调度更新时,更新操作会放在finally中,返回去继续执行handlelick的逻辑。于是会出现上面的情况。
=Object[].class,那么会重新拷贝一份数据到新的数组中,并且elementData会指向新的数组。...Object数组,一个返回指定类似的数组 public Object[] toArray() { return Arrays.copyOf(elementData, size); }...答案:不通过迭代器删除元素时,由于数据会进行前移,可能(不是一定,要考虑元素的位置)会造成数组越界和数据遗漏(i+1的元素前移到i的位置,那么原来i+1的元素就会被遗漏掉),通过迭代器remove删除元素后...至于为什么移除元素必须调用next方法是因为迭代器remove的元素必须要遍历过,如果没有遍历过那么lastRet=-1,迭代器会抛出异常,而且删除后lastRet重新等于-1,所以每次删除都需要调用next...第四个问题:多线程的情况下,增加元素数据为什么出现null值 因为grow并非线程安全的操作,elementData会重新指向新的数组,如果size发生自增,那么会跨过一个索引下标赋值。
为什么会有hooks大家都知道hooks是在函数组件的产物。之前class组件为什么没有出现hooks这种东西呢?答案很简单,不需要。...为什么setState的值相同时,函数组件不更新?...总结总结下useState初始化和setState更新:useState会在第一次执行函数组件时进行初始化,返回[state, dispatchAction]。...返回update后的[newState, dispatchAction].还有两个问题为什么setState后不能马上拿到最新的state的值?...当调用setState触发调度更新时,更新操作会放在finally中,返回去继续执行handlelick的逻辑。于是会出现上面的情况。
// 疑问 2:为什么声明 transient(后文回答) // 疑问 3:为什么不声明为泛型类型 E // 底层数组 transient Object[] elementData...; // 数组的有效长度(不是 elementData.length) private int size; // size() 返回的是数组的有效长度(合理,底层数组我们不关心...例如:在这段代码中,ArrayList 接收一个由 String 数组转化的 List,最后在 ArrayList#toArray() 返回的 Object 数组中添加一个 Object 对象,就出现异常了...); } // 实际返回的数组可能是 Object[] 类型,也可能是 String[] 类型 @Override public Object[] toArray()...,而是指向全局空数组,这是懒初始化的策略; 3、在添加数据时会先检查数据容量,不足会先扩容。
通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上;如果这个位置上什么都没有,则返回null,如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals...,如果所有equals方法都返回false,则get方法返回null。...以先扩容为例,先比较是否是新增的数据,再比较是否需要增加数据后扩容,这样比较会浪费时间,而后扩容,就在中途直接通过return返回了,根本执行不到是否扩容,这样可以提高效率的。...因为长度扩大以后,Hash 的规则也随之改变; 两个线程同时触发 resize,中间过程有可能会造成元素指向死循环; hashmap为什么一开始不就使用红黑树 因为红黑树相对于链表维护成本大,红黑树在插入新数据之后...,可能会通过左旋、右旋、变色来保持平衡,造成维护成本过高,故链路较短时,不适合用红黑树; hashmap为什么一定要用红黑树,不用二叉树 二叉树在极端情况下会退化成链表,而红黑树是有balance不会退化成链表
这种变化会带来什么问题? 7.HashMap中put方法的过程? 8.数组扩容的过程? 9.拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...5.为什么要用异或运算符? 保证了对象的 hashCode 的 32 位值只要有一位发生改变,整个 hash() 返回值就会改变。尽可能的减少碰撞。...这种变化会带来什么问题?...之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。推荐:面试问红黑树,我脸都绿了。...查找该结点,匹配就返回; 以上都不符合的话,就往下遍历结点,匹配就返回,否则最后就返回 null。
注意:无论中有几层嵌套,这个方法仅仅脱去最外层的,之后剩下的内容就作为这个方法的返回值,所以其返回值类型是不确定的。...comparableClassFor(Object x)方法,当x的类型为X,且X直接实现了Comparable接口(比较类型必须为X类本身)时,返回x的运行时类型;否则返回null。...HashMap 数组长度是2^n ?==================上面解释了hashmap中hash函数为什么要^ 。...那么深度源码的小伙伴可能会问,为什么hashmap默认容量是16以及后期每次扩容的时候为什么是翻倍扩容。简而言之。为什么hashMap数组长度永远是2的倍数呢。...也即是说我们先按数组再按链表顺序。而不是按照你添加先后的顺序。而上面我们了解添加的node决定其位置的是key的hash值。所以这就解释了为什么hashmap遍历的时候和我们添加不一致的了。
返回特殊值: 向空队列取数据,会返回 null; 向容量满的队列加数据,会返回 false。...栈和队列既可以用数组实现,也可以用链表实现: 数组:用数组实现时叫作顺序栈和顺序队列; 链表:用链表实现时叫作链式栈和链式队列。 3.1 为什么 ArrayList 不适合实现队列?...对于这种大部分操作时间复杂度很低,只有个别情况下时间复杂度会退化,而且这些操作之间存在很强烈的顺序关系的情况,就很适合用 “均摊时间复杂度分析” 了: 假设我们的扩容策略是将数组扩大到旧数组的 2 倍,...♀️疑问 6:为什么 ArrayDeque 要求数组容量是 2 的整数幂?...总结 1、ArrayDeque 是基于动态数组的线性表,具备 Queue 和 Stack 的行为,但不具备 List 的行为; 2、ArrayDeque 的数组容量是 2 的整数幂,在扩容时容量会翻倍,
(追问:不传递参数会如何?) 找出Array中的最大元素,你能说出几种方法? ? 问题答案 如何判断一个变量是否为数组?...为什么不用typeof? Array继承与Object,所以typeof 会直接返回object,所以不可以用typeof方法来检测 为什么不用instanceof?...Object,直接赋值的话,只是将引用赋值给另一个变量,最终会导致被复制的变量也会随着原来的数组变化而变化。...(追问:不传递参数会如何?) 语法 sort方法接受一个“比较函数”作为参数。 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。...比较函数应该具有两个参数 a 和 b,其返回值如下: 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。 若 a 等于 b,则返回 0。
a 的实际类型是一个 String 类型的数组,那么往这个数组里面放一个 Integer 类型的对象那肯定是要报错的。等效代码如下图所示:为什么是个Bug ?...同时这里要注意一下,返回的这个数组要是一个 「安全」的数组,安全的意思就是「集合本身不能持有对返回的数组的引用」,即使集合的内部是用数组实现的,也不能直接把这个内部的数组直接返回。...这就是为什么上面两个 toArray() 方法的实现要么是把原有的数组复制了一份,要么是克隆了一份,本质上都是新建了一个数组。...ArrayList 的 size 时,如果 ArrayList 的 size 在数组创建完成后变大了,还是会走到重新新建数组的逻辑里面,仍然会导致调用方法传入的新建的数组没有被使用,而且这里因为调用方法时新建的数组和...ArrayList 之前的 size 相同,会造成比传入长度为 0 的数组浪费多得多的空间。
1 Leetcode53最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...小蓝一看,心想首先需要找到所有的子数组,然后对子数组求和,最后比较。不是很清楚?没关系,下面具体阐述下!...01 题目解析 因为我们涉及到数组和的比较,假设数组第一个元素为最终需要返回的值,定义为result。 ? 遍历Nums寻找大于0的数,保留当前sum值并累加。...如果当前数组元素num值小于0直接赋值给sum。 为什么寻找大于0?这是本题的关键。在此大家可以自行思考1分钟!文后解答,这样印象会更深刻哈。...为什么判断大于0? 如果遍历的数组元素全是负数(<0),我们就取最大的负数。(-1)+(-1)=-2,-2<-1.负数只会越加越小。
8、为什么要用异或运算符? 保证了对象的 hashCode 的 32 位值只要有一位发生改变,整个 hash() 返回值就会改变。尽可能的减少碰撞。...之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。...当多个线程对同一个集合的内容进行 操作时,就可能会产生 fail-fast 事件。...当链表中元素个数达到 8 的时候,链表的查询速度不如红黑树快,链表会转为红黑树,红 黑树查询速度快; HashMap 初始数组大小为 16(默认),当出现扩容的时候,以 0.75 * 数组大小的方式进行扩...)方法,查找该结点,匹配就返回; 以上都不符合的话,就往下遍历结点,匹配就返回,否则最后就返回 null。
领取专属 10元无门槛券
手把手带您无忧上云