在进行队列实现基数排序的练习中发现之前对static关键字理解不清晰
下面为代码:
public class MyQueue {
static int[] elements;
public MyQueue() {
elements = new int[0];
}
// 入队
public void add(int value) {
// 创建一个新的数组
int[] newArray = new int[elements.length + 1];
// 将元素复制过去
for (int i = 0; i < elements.length; i++) {
newArray[i] = elements[i];
}
newArray[elements.length] = value;
elements = newArray;
}
// 出队
public int poll() {
if (elements.length == 0) {
throw new RuntimeException("queue is empty");
}
int element = elements[0];
// 创建一个新的数组
int[] newArr = new int[elements.length - 1];
for (int i = 0; i < newArr.length; i++) {
newArr[i] = elements[i + 1];
}
elements = newArr;
return element;
}
// 判断是否为空
public boolean isEmpty() {
return elements.length == 0;
}
}
import java.util.Arrays;
public class RadixQueueSort {
public static void main(String[] args) {
int[] arr = new int[] { 12, 234, 5, 89, 55, 3, 348, 198, 5, 653, 22, 77, 832 };
System.out.println(Arrays.toString(arr));
radixQueueSort(arr);
System.out.println(Arrays.toString(arr));
}
// 通过队列来实现
public static void radixQueueSort(int[] arr) {
// 取出数组中最大的数
int max = Integer.MIN_VALUE;
for (int num : arr) {
if (num > max) {
max = num;
}
}
// 通过最大的数的位数来判断需要进行几次循环
int maxn = (max + "").length();
// 建立10个队列数组
MyQueue[] myQueue = new MyQueue[10];
// 初始化每个队列
for (int t = 0; t < myQueue.length; t++) {
myQueue[t] = new MyQueue();
}
for (int i = 0, n = 1; i < maxn; i++, n *= 10) {
// 取出每个数的个、十、百、千位数...
for (int j = 0; j < arr.length; j++) {
// 计算余数
int ys = arr[j] / n % 10;
myQueue[ys].add(arr[j]);
}
// 将分好的数取出来放回去
int index = 0;
for (int k = 0; k < myQueue.length; k++) {
while (!myQueue[k].isEmpty()) {
arr[index] = myQueue[k].poll();
// System.out.println(myQueue[k].poll());
index++;
}
}
}
}
}
发现在MyQueue类中的int数组不小心加了static关键字static int[] elements;
导致RadixQueueSort类中的以下代码无效:
// 建立10个队列数组
MyQueue[] myQueue = new MyQueue[10];
从而导致排序算法失效,在此对static关键字进行总结:
- static关键字修饰的静态方法表示当前类的唯一实例,也就是说在整个java项目中这个方法是唯一的。
如果static修饰了数组如:static int[] elements;
- 不管这个类有多少个对象,这个数组都只有一个,即在整个内存中只有一份数据,可以改变,但有且只有一个,并且在main()程序开始之前就已经完成分配,并且可以访问,直到程序结束才释放