必须掌握的重写,重载,equals,==

生活是晨起暮落,日子是柴米油盐,时光匆匆,我们终将释怀。
在这里插入图片描述

重写与重载的区别

重写(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 = 10long b = 10Ldouble 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即为我们所要找到的数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值