3.27总结

一、每日一题

350. 两个数组的交集 II - 力扣(LeetCode) (leetcode-cn.com)

思路:利用双指针,因为不考虑输出顺序,所以先将数组排序,然后用两个指针先指向两个数组的开始,然后两个指针所指的值不同时就把指到小的指针往后一位,如果相等就先记录下这个值,然后两个指针都往后移动,直到有个指针到了最后。

代码实现

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);//先进行排序
        Arrays.sort(nums2);
        int i=0,j=0,k=0;
        int [] arr1=new int[nums1.length];//创建一个新数组来存相同的数字
        while(i<nums1.length&&j<nums2.length)
        {
            if(nums1[i]<nums2[j])//哪个数组小就往后移
            {
                i++;
            }
            else if(nums1[i]>nums2[j])
            {
                j++;
            }
            else//相等就存下来
            {
                arr1[k]=nums1[i];
                k++;
                i++;
                j++;
            }
        }
        int [] arr2=new int[k];//因为相同的长度只会等于或小于,所以后面可能会有数组初始化的0
        for(i=0;i<k;i++)//把数组初始化的0全部去掉
        {
            arr2[i]=arr1[i];
        }
        return arr2;
    }
}

过题记录

 

二、Java学习

1.static

static是一个关键字,它真正的作用是用于区分成员变量、方法、内部类、初始化块这四种成员到底是属于类本身还是实例。在类中定义的成员,有static修饰的属于类本身,没有static修饰的属于实例。

2.构造器

构造器通常也叫构造方法、构造函数,构造器在每个项目中几乎无处不在。当你new一个对象时,就会调用构造器。构造器格式如下:

[修饰符,比如public] 类名 (参数列表,可以没有参数){
	//不能有return
}

默认构造器: 新建一个类,不提供任何构造器,编译器会默认提供一个无参构造器,这就是为什么没定义任何构造器,却可以new 某个对象()

public class People {
    
}

 我的实践

public class SxStu {
    //属性
    int id;
    String name;
    int age;
    //方法
    void study(){
        System.out.println("我正在奋斗!!!");
    }
    //构造器(方法名和类名相同)
    SxStu(int id,String name,int age){
        this.id=id;
        this.name=name;
        this.age=age;
    }
    public static void main(String[] args){
        SxStu s1=new SxStu(1019,"李现",31);
        System.out.println(s1.id);
        System.out.println(s1.name);
        System.out.println(s1.age);
        /*s1.id=1019;
        s1.name="李现";
        s1.age=31;*/
        System.out.println(s1.id);
        System.out.println(s1.name);
        System.out.println(s1.age);
        s1.study();
        System.out.println("=============");
        SxStu s2=new SxStu(1991,"陆珊",17);
        s2.id=1991;
        s2.name="陆珊";
        s2.age=17;
        System.out.println(s2.id);
        System.out.println(s2.name);
        System.out.println(s2.age);
        s2.study();
    }
}
class Point{//求两点之间的距离
    double x,y;
    public Point(double _x,double _y)
    {
        x=_x;
        y=_y;
    }
    public double getDistance(Point p)
    {
        return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
    }
}
public class TestConstructor {
    public static void main(String[] args){
        Point p=new Point(3.0,4.0);
        Point origin=new Point(0.0,0.0);
        System.out.println(p.getDistance(origin));
    }
}

3.类是一个引用数据类型,它被存放在栈里,指向实际的对象;而真正的对象存在堆内存里。实际上,Java里的引用就是C里面的指针,引用变量和指针一样,它们都是存储一个地址值,只是Java将这些指针封装起来,用着更加方便。

class Person{
    String name;
    int age;
    public void show(){
        System.out.println("姓名:"+name+",年龄:"+age);
    }
}
public class TestPerson {
    public static void main(String[] args){
        Person p1=new Person();
        p1.age=17;
        p1.name="陆珊";
        p1.show();
        Person p2=new Person();
        p2.age=31;
        p2.name="李现";
        p2.show();
    }
}

3.类里面的方法相互调用

public class Dog {
    //定义一个jump方法
    public void jump()
    {
        System.out.println("正在执行jump方法");
    }
    //定义一个run方法,run方法需要借助jump方法
    public void run()
    {
        Dog d=new Dog();//没有使用static修饰的成员变量和方法都必须使用对象调用
        d.jump();
        System.out.println("正在执行run方法");
    }
    public static void main(String[] args)
    {
        Dog dog=new Dog();
        //dog.jump();
        dog.run();
    }
}

  

4.this

通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题。

public class Student {
   //定义四个成员变量
   String name;
   int age;
   long phone;
   String address;
   //有参构造方法
   public Student(String name, int age, long phone, String address) {
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.address = address;
    }
   //成员变量的get/set方法
   public String getName(){
       //访问的是成员变量name
       return this.name;
   }
   
   public void setName(String name) {
        this.name = name;
    }
}

通过this关键字调用成员方法(与第三点里面的代码稍有不同)

public class Dog {
    //定义一个jump方法
    public void jump()
    {
        System.out.println("正在执行jump方法");
    }
    //定义一个run方法,run方法需要借助jump方法
    public void run()
    {
        this.jump();
        Dog d=new Dog();//没有使用static修饰的成员变量和方法都必须使用对象调用
        d.jump();
        System.out.println("正在执行run方法");
    }
    public static void main(String[] args)
    {
        Dog dog=new Dog();
        //dog.jump();
        dog.run();
    }
}

 Java允许对象的一个成员直接调用另一个成员,可以省略this前缀,上面的代码可以稍作修改。

public class Dog {
    //定义一个jump方法
    public void jump()
    {
        System.out.println("正在执行jump方法");
    }
    //定义一个run方法,run方法需要借助jump方法
    public void run()
    {
        //this.jump();
        jump();
        Dog d=new Dog();//没有使用static修饰的成员变量和方法都必须使用对象调用
        d.jump();
        System.out.println("正在执行run方法");
    }
    public static void main(String[] args)
    {
        Dog dog=new Dog();
        //dog.jump();
        dog.run();
    }
}

注意:对于static修饰的方法可以直接通过类来调用,,如果在static修饰的方法使用this关键字,则这个关键字就无法指向正确的对象,所以static修饰的方法不能用this引用。由于static修饰的方法不能用this引用,所以static不能不能访问不用static修饰的成员,因此有如下规定:静态成员变量不能直接访问非静态成员变量。

Java中调用static修饰的成员变量、方法应该使用类,而不是对象。

5.基本类型的参数传递

下面的例子中,main方法里的参数没有变,变化的是swap方法里面的参数

首先,程序从main方法开始执行,给main方法里面的参数传递值。

然后通过main方法给swap方法里面传形参

 

 最后在swap栈区进行交换

public class PrimitiveTransferTest {
    public static void swap(int a,int b)
    {
        int t=a;
        a=b;
        b=t;
        System.out.println("swap方法里,a的值是:"+a+";b的值是"+b);
    }
    public static void main(String[] args)
    {
        int a=1019;
        int b=1991;
        swap(a,b);
        System.out.println("交换后的,变量a的值是"+a+";变量b的值是"+b);//main方法栈区的a和b没有变
    }
}

 6.引用类型的参数传递

程序从main()方法开始,main()方法里面创建了一个DataWrap对象,然后定义了一个dw引用变量来指向DataWrap对象,这里与基本类型的参数传递有区别。创建对象时,堆内存保存了对象本身,栈内存保存了引用该对象的引用变量。接下来就是给DataWrap赋值,再调用swap方法,通过参数传递,给swap方法里的变量赋值。其实main方法和swap方法都只是保存了Datawrap的地址值,所以swap方法操作的就是DataWrap对象,两者都是保存DataWrap的地址,引用的是同一个对象,所以swap方法将值交换后,main方法里面的值也发生了交换。

class DataWrap
{
    int a;
    int b;
}
public class ReferenceTransferTest {
    public static void swap(DataWrap dw)
    {
        int t=dw.a;
        dw.a=dw.b;
        dw.b=t;
        System.out.println("swap方法里,a成员变量的值是"+dw.a+";b成员变量的值是"+dw.b);
        dw=null;
    }
    public static void main(String[] args)
    {
        DataWrap dw=new DataWrap();
        dw.a=6;
        dw.b=9;
        swap(dw);
        System.out.println("交换结束后,a的值为:"+dw.a+";b的值为:"+dw.b);
    }
}

 7.方法重载

同一个类中方法的名称相等,形参列表不同,其他随便。

public class Overload {
    public void test()
    {
        System.out.println("我是第一个test方法,无参数");
    }
    public void test(String msg)
    {
        System.out.println("我是第二个test方法,"+msg);
    }
    public static void main(String[] args)
    {
        Overload ol=new Overload();
        ol.test();
        ol.test("hello");
    }
}

8.变量:成员变量和局部变量

class Personn
{
    public String name;
    public static int eyeNum;
}
public class PersonTest {
    public static void main(String[] args)
    {
        System.out.println("Person的eyeNum类的变量值:"+Personn.eyeNum);
        Personn p=new Personn();
        System.out.println("p变量的name变量值是:"+p.name+"p对象的eyeNum变量值是::"+p.eyeNum);
        p.name="孙悟空";
        p.eyeNum=2;
        System.out.println("p变量的name变量值:"+p.name+"p对象的eyeNum变量值为:"+p.eyeNum);
        System.out.println("Person的eyeNum类变量值:"+Personn.eyeNum);
        Personn p2=new Personn();
        System.out.println("p2对象的eyeNum类变量值:"+p2.eyeNum);
        System.out.println("p2对象的eyeNum类变量值:"+Personn.eyeNum);
    }
}

9. 变量命名规则

一个类里面不能定义两个同名的成员变量,即使一个是类变量,一个是实例变量也不行。

一个方法里面不能定义两个同名的方法局部变量,方法局部变量也不能与形参名相同。

同一个方法里面不同的代码块内的代码块局部变量可以相同。

如果先定义代码块局部变量,后定义方法局部变量,则前面的代码块变量可以和后面的方法局部变量相同。

局部变量可以和成员变量相同,局部变量会覆盖成员变量,如果要引用该成员变量,则要通过添加前缀this(对于实例变量)或者类名(对于类变量)。

10,局部变量保存的是值或者是地址值

如果局部变量是基本数据类型,则直接保存基本数据类型的值。如果局部变量是引用数据类型,则保存的是地址值,通过地址值引用到该变量实际引用的数组或对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值