5.8 Java系统属性和环境变量的区别是什么? (二合一)| Java Debug 笔记

136 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Java系统属性和环境变量的区别是什么?

JVM中的系统属性System.getProperties()和环境变量System.getenv()有什么区别?

回答1:

我认为两者之间的区别归结为访问。环境变量可以由任何进程访问,而Java系统属性只能由添加到它们的进程访问。env变量是在OS中设置的(但是可以通过Java设置),而系统属性则作为命令行选项传递或通过setProperty()设置。

提问:我无法在Java中创建通用数组类型的原因是什么?

Java不允许我们这样做的原因是什么

private T[] elements = new T[initialCapacity];

我可以理解.NET不允许我们这样做,因为.NET中的值类型在运行时可以具有不同的大小,但是在Java中,各种T都是对象引用,因此具有相同的大小(如我错了请纠正我)。

回答1:

问题是由于Java数组(不是静态的而是动态检查的)与泛型(它们是静态的而不是动态检查的)的交互作用所致。这是利用漏洞的方法:

class Box<T> {
    final T x;
    Box(T x) {
        this.x = x;
    }
}

class Loophole {
    public static void main(String[] args) {
        Box<String>[] bsa = new Box<String>[3];
        Object[] oa = bsa;
        oa[0] = new Box<Integer>(3); // error not caught by array store check
        String s = bsa[0].x; // BOOM!
    }
}

我们建议使用静态安全阵列(也称为Variance)来解决此问题。