java static类型的变量在类加载的时候初始化和函数中初始化有什么区别?
public class Solution {
private static int count;
public int InversePairs(int [] array) {
**count=0;**
if (array.length!=0)
mergeSort(array,0,array.length-1);
return count;
}
public void mergeSort(int[] array,int start,int end){
if(start<end){
int mid=(start+end)>>1;
mergeSort(array,start,mid);
mergeSort(array,mid+1,end);
merge(array,start,mid,end);
}
}
public void merge(int[] array,int start,int mid,int end){
int i=start;
int k=0;
int j=mid+1;
int[] temp=new int[end-start+1];
while(i<=mid&&j<=end){
if(array[i]<=array[j]){
temp[k++]=array[i++];
}
else{
temp[k++]=array[j++];
count+=(mid-i+1);
count%=1000000007;
}
}
while(i<=mid){
temp[k++]=array[i++];
}
while(j<=end){
temp[k++]=array[j++];
}
for(k=0;k<temp.length;k++){
array[start+k]=temp[k];//将临时数组添加到原来的数组后边
}
}
}
差不多的代码如果是下面的这种写法就无法AC,好奇怪
public class Solution {
private static int count=0;
public int InversePairs(int [] array) {
if (array.length!=0)
mergeSort(array,0,array.length-1);
return count;
}
public void mergeSort(int[] array,int start,int end){
if(start<end){
int mid=(start+end)>>1;
mergeSort(array,start,mid);
mergeSort(array,mid+1,end);
merge(array,start,mid,end);
}
}
public void merge(int[] array,int start,int mid,int end){
int i=start;
int k=0;
int j=mid+1;
int[] temp=new int[end-start+1];
while(i<=mid&&j<=end){
if(array[i]<=array[j]){
temp[k++]=array[i++];
}
else{
temp[k++]=array[j++];
count+=(mid-i+1);
count%=1000000007;
}
}
while(i<=mid){
temp[k++]=array[i++];
}
while(j<=end){
temp[k++]=array[j++];
}
for(k=0;k<temp.length;k++){
array[start+k]=temp[k];//将临时数组添加到原来的数组后边
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
优先于函数,且无需调用
静态变量直接在声明处赋值相当于在static { ... } 块里赋值。
static {...}块在java字节码里会被编译成一个叫<clinit>的特殊静态方法,会在类加载时自动调用。