equals()方法左右变量的位置

本文探讨了在使用equals()方法进行比较时,将变量或常量放置在前后的优劣分析,指出将常量置于前可以避免空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天面试考了一张很是伤我自信的题目,唉!
多余的话不说了,我还是把考题慢慢发出来吧
题:一个变量,一个常量,用equals()方法比较,让咱们,看看到底是常量放前面好啊,还是变量放前面好
----------------------------------------------------------------------------------------------
其实说白了,如果是两个都是变量,那就放哪都行没啥区别;(有点废话了)
现在主要就是有一个是常量,大家应该知道吧,equals()方法是在Object类里定义的,也就是说任何对象都可以调用equals()方法,但是对象在调用方法的时候,如果对象为null那系统运行就会报空指针异常;出现异常这显然是我们不愿意看到的;
-------------------------------------------------------------------------------------------------
现在看这题,前面说了,如果把变量放在前面也就相当于是调用了这个变量的equals方法,那么如果此变量为空的时候就会报NullPointException了,所以肯定是把常量放前面会好些了啊;这样,我们就不用做空指针的异常处理了
--------------------------------------------------------------------------------------------------
这里再说一点,可能有的同学会想,为什么把变量放在括号里就不会出现空指针异常呢,呵呵,其实大家想想,equals()方法是不是可以比较一个变量是不是等于空啊,就是 s.equals(null);  是不是啊,括号里直接写null都可以了,还怕变量为null吗
### findAnagrams 函数工作原理 #### 变量初始化 为了检测字符串 s 中是否存在字符串 p 的字母异位词,程序首先进行了必要的变量初始化: ```java int[] need = new int[26]; for (char c : p.toCharArray()) { need[c - 'a']++; } ``` 这段代码创建了一个长度为 26 的数组 `need` 来记录目标子串 p 中各个字符的数量。通过遍历 p 字符串并增加对应位置的计数值来完成统计[^1]。 #### 滑动窗口设置 接着定义滑窗边界及辅助结构体用于实时追踪当前窗口内的字符分布情况: ```java int left = 0; int right = 0; int valid = 0; List<Integer> res = new ArrayList<>(); int[] window = new int[26]; ``` 这里设置了左右指针 `left`, `right` 控制窗口大小;`valid` 记录匹配成功的字符种类数目;列表 `res` 存储符合条件的结果下标集合;同样地构建了另一个长度为 26 的数组 `window` 表达当前窗口内各字符数量变化状况。 #### 扩张右端点 随着右侧边界的逐步推进,不断调整窗口内部状态直至满足条件为止: ```java while (right < s.length()){ char c = s.charAt(right); right++; if (need[c-'a']>0){ window[c-'a']++; if(window[c-'a']==need[c-'a']){ valid++; } } ``` 当遇到属于模式串 p 范围内的字符时,则更新其在 `window` 数组里的频次并向外扩展有效区间范围。每当某个特定字符达到预期频率后便使验证器加一表示该种字符已经完全吻合。 #### 收缩左端点 一旦发现现有窗口已覆盖全部所需字符类型,尝试收缩左侧边缘以寻找更短的有效序列或者定位下一个候选起点: ```java while(valid == need.length() && left<=right){ if((right-left)==p.length()){ res.add(left); } char d = s.charAt(left); left++; if(need[d-'a']>0){ if(window[d-'a']==need[d-'a']){ valid--; } window[d-'a']--; } } ``` 此部分逻辑确保只有当窗口宽度恰好等于模板串长度才将其起始坐标加入到结果集中。随后继续移动左边沿,并相应减少相关联字符计数直到不再符合要求为止。注意此处对于 Java 编程者来说,在判断两个哈希表是否相等时应采用 `.equals()` 方法而非简单赋值运算符 `==` 进行对比操作。 ```python def find_anagrams(s, p): from collections import Counter # 统计p中每个字符出现次数 target_count = Counter(p) # 初始化滑动窗口参数 current_window = {} start_index = [] l = r = matches = 0 while r < len(s): curr_char = s[r] # 更新窗口信息 if curr_char in target_count: current_window[curr_char] = current_window.get(curr_char, 0)+1 if current_window[curr_char]==target_count[curr_char]: matches+=1 r += 1 # 当窗口内所有字符都匹配上了 while matches == len(target_count): # 如果此时窗口大小正好是len(p),则保存这个起始index if r-l == len(p): start_index.append(l) prev_char = s[l] # 移除最左边那个字符的影响 if prev_char in target_count: if current_window[prev_char]==target_count[prev_char]: matches -= 1 current_window[prev_char]-=1 l += 1 return start_index ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值