JAVA (static) 简述

文章探讨了在Java编程中,使用static修饰全局变量与不使用时,在力扣(LeetCode)平台提交代码的不同结果。主要问题在于static变量在不同对象实例间共享,导致数据叠加,影响测试结果。解决方案是每次调用函数时手动初始化static变量。文章还提到了static变量的作用,包括内存管理和实例间的共享数据。
摘要由CSDN通过智能技术生成

前言:

在力扣上提交代码,发现用static定义变量,和不用static修饰变量,虽然每次运行的结果都一样,但是提交的结果却有通过与不通过两种情况。

测试题目:组合(力扣)dfs + 回溯 + 剪枝 JAVA

static修饰全局变量:

代码:

class Solution  {
	public static List<List<Integer>> nums = new ArrayList<>();
	public static List<Integer> num = new ArrayList<>();
	public static List<List<Integer>> combine(int n, int k) {
           dfs(1, n, k);
           return nums;
	}
	public static void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}

在这里插入图片描述

不用static修饰:

代码:

class Solution {
    List<List<Integer>> nums = new ArrayList<>();
    List<Integer> num = new ArrayList<>();
	public  List<List<Integer>> combine(int n, int k) {
           dfs(1, n, k);
           return nums;
	}
	public  void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}

在这里插入图片描述

值得注意的是,上述两个代码算法完全一样,不同点出在,全局变量是否用static修饰


抱着些许疑惑我写了一个程序分别测试了两个代码:

代码:

import java.util.*;    
public class Main {         
    public static void main(String args[]) {        
    int i[] = {4, 1};
    int k[] = {2, 1};
   
    for(int x = 0; x < 2; x ++) { 
    	Solution s = new Solution();
    	Solution_promax ss = new Solution_promax();
    	System.out.println(s.combine(i[x], k[x]));
    	System.out.println("\033[36m");
    	System.out.println(ss.combine(i[x], k[x]));
    	System.out.println("\033[0m");
    	 
    }
//    Solution_promax ss = new Solution_promax();
//    System.out.println(ss.combine(4, 2));
//    
//    Solution_promax ss1 = new Solution_promax();
//    System.out.println(ss1.combine(4, 2));
//    
//    System.out.println(ss.combine(4, 2));
    
    }
}
class Solution {
    List<List<Integer>> nums = new ArrayList<>();
    List<Integer> num = new ArrayList<>();
	public  List<List<Integer>> combine(int n, int k) {
           dfs(1, n, k);
           return nums;
	}
	public  void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}
class Solution_promax {
	public static List<List<Integer>> nums = new ArrayList<>();
	public static List<Integer> num = new ArrayList<>();
	public static List<List<Integer>> combine(int n, int k) {
           dfs(1, n, k);
           return nums;
	}
	public static void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}

输出:

在这里插入图片描述
1.惊奇的发现用static修饰的变量,不会因为创建新的对象,而恢复初始化

2.不用static修饰的全局变量创建的新对象,内容会恢复初始化

而力扣测试一组代码,就是不断创建新对象,带入数据比对结果,而static修饰全局变量会导致数据叠加。这就是为什么我用static修饰全局变量无法通过的原因。


那么static修饰得全局变量,只需要每次调用函数人为初始化即可:

代码:

class Solution  {
	public static List<List<Integer>> nums = new ArrayList<>();
	public static List<Integer> num = new ArrayList<>();
	public static List<List<Integer>> combine(int n, int k) {
           nums = new ArrayList<>();
           num = new ArrayList<>();//初始化
           dfs(1, n, k);
           return nums;
	}
	public static void dfs(int i, int n, int k) {
		if(num.size() + n - i + 1 < k) return;//剪枝
		if(num.size() == k) {
		  nums.add(new ArrayList<Integer>(num));
		  return;
		}//重要的事情最先做
		
		num.add(i);//装
		dfs(i + 1, n, k);
		num.remove(num.size() - 1);//回溯(不装)
		dfs(i + 1, n, k);
	}
}

在这里插入图片描述


得出简略结论:

1、static目的:java中的static关键字主要用于内存管理。

2.静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。

3.如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值