生活是晨起暮落,日子是柴米油盐,时光匆匆,我们终将释怀。
重写与重载的区别
重写(Override)
1.发生在父类与子类之间
2.方法名,参数列表,返回类型必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符,如果父类方法访问修饰符为private 则子类就不能重写该方法
(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申 明更加宽泛的检查型异常
从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子 类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名, 参数列表,返回类型都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的
public class Father {
public static void main(String[] args){
// TODO Auto-generated method stub
Son s = new Son();
s.sayHello();
}
public void sayHello() {
System.out.println("Hello");
}
}
class Son extends Father{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello by ");
}
}
重载(Overload)
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的返回值类型可以相同也可以不相同。无法以返回类型来作为重载函数的区分标准。
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不
同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,因此不能通过返回类型是否相同来判断重载。
public class Father{
public static void main(String[] args){
Father s = new Father();
s.sayHello();
s.satHello("hello Overload")
}
public void sayHello(){
System.out.println("Hello");
}
public void sayHello(String name){
System.out.println(name);
}
}
equals与==的区别
==:若为引用数据类型则比较的地址值是否相同,若为基本数据类型则比较的是值是否相同
比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,既是否是指向相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a = 10
与 long b = 10L
与 double c = 10.0
都是相同的(为true), 因为他们都指向地址为10的堆
equals:比较的是引用类型的地址值是否相同
equals用来比较的是两个对象的内容是否相同,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类的方法,而Object中的equals方法返回的却是==的判断
总结
所有比较是否相等时,都是用equals,并且在对常量进行比较时,把常量写在前面,从而避免空指针异常
在阿里的代码规范中只使用equals ,阿里插件默认会识别,并可以快速修改,推荐安装阿里插件来排查老代码使用“==”,替换成equals。
二分查找
题目:在排序数组中查找元素的第一个和最后一个位置
难度:🌟🌟🌟
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
输入:nums = [], target = 0
输出:[-1,-1]
请先思考!!!!
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
答答答答答答答答答答答
案案案案案案案案案案案
往往往往往往往往往往往
下下下下下下下下下下下
翻翻翻翻翻翻翻翻翻翻翻
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
class Solution {
public int[] searchRange(int[] nums, int target) {
// 先找第一个target的位置
int leftIndex = search(nums, target);
// 然后在找target+1的位置
int rightIndex = search(nums, target + 1);
if(leftIndex == nums.length || nums[leftIndex] != target){
return new int[]{-1, -1};
}else{
return new int[]{leftIndex, rightIndex - 1};
}
}
public int search(int[] nums, int target){
int l = 0;
int r = nums.length;
while(l < r){
int middle = (l + r) >> 1;
if(nums[middle] >= target){
r = middle;
}else {
l = middle + 1;
}
}
return l;
}
}
题解:
因为都是排好序的,那么我们要找的值必定是相邻的,那么我们就可以根据二分查找算法找出第一个值
然后将目标值+1进行第二次查找,查找结束后将查到的数值-1即为我们所要找到的数值