京东做代码的网站吗,有没有做相册的网站,cookies因预料之外的输出被阻止 wordpress,程序员创业做网站做公众号总览 Java是一种极简主义的语言#xff0c;具有比其他语言故意更少的功能#xff0c;尽管如此#xff0c;Java仍然具有产生奇怪效果的边缘情况#xff0c;甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举。 如果您习惯于阅读另一种语言#xff0c;则可以轻松地以错… 总览 Java是一种极简主义的语言具有比其他语言故意更少的功能尽管如此Java仍然具有产生奇怪效果的边缘情况甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举。 如果您习惯于阅读另一种语言则可以轻松地以错误的方式阅读Java而不会感到困惑。 变量仅是引用或原语 没错变量不是对象。 这意味着当您看到以下内容时s 不是一个对象 它不是String它是对String的引用 String s Hello; 这回答了许多混乱的领域例如 问如果String是不可变的如何更改它。 例如 s “” 答在普通的Java中您只能更改对String的引用。 比较引用而不是它们的内容。 更令人困惑的是有时使用是可行的。 如果您有两个相同的不可变值那么JVM也可以尝试使引用相同。 例如 String s1 Hi, s2 Hi;Integer a 12, b 12; 在这两种情况下都使用对象池因此引用最终是相同的。 s1 s2和a b都成立因为JVM引用了同一对象。 但是稍微改变一下代码以便JVM不会合并对象并且返回false这可能是意外的。 在这种情况下您需要使用equals。 String s3 new String(s1);Integer c -222, d -222;s1 s2 // is trues1 s3 // is falses1.equals(s3) // is truea b // is truec d // is false (different objects were created)c.equals(d) // is true 对于Integer对象池从-128开始至少为127可能更高 Java按值传递引用 所有变量都按值传递甚至引用也是如此。 这意味着当您有一个变量作为对对象的引用时将复制此引用但不复制该对象。 例如 public static void addAWord(StringBuilder sb) {sb.append( word);sb null;
}StringBuilder sb new StringBuilder(first );
addWord(sb);
addWord(sb);
System.out.println(sb); // prints first word word 引用的对象可以更改但是对复制的引用的更改对调用者无效。 在大多数JVM中Object.hashCode与内存位置无关 hashCode必须保持不变。 没有这个事实像HashSet或ConcurrentHashMap这样的哈希集合将无法工作。 但是对象可以位于内存中的任何位置并且可以更改位置而无需您的程序知道发生了这种情况。 使用该位置的hashCode无效除非您有一个不移动对象的JVM 对于OpenJDK和HotSpot JVMhashCode是按需生成的并存储在对象的标头中。 使用Unsafe您可以查看是否已设置hashCode甚至可以通过 Object.toString做一些令人惊讶的事而不是有用的事 toString的默认行为是为类和hashCode打印内部名称。 如前所述hashCode不是存储位置即使它以十六进制打印也是如此。 同样类名特别是对于数组也令人困惑。 例如; String []打印为[Ljava.lang.String; [表示它是一个数组L表示它是一个“语言”创建的类而不是像BTW这样具有代码B的字节之类的基元。 表示课程结束。 例如说你有一个像 String[] words { Hello, World };
System.out.println(words); 打印类似 [Ljava.lang.String;45ee12a7 不幸的是您必须知道该类是一个对象数组例如如果您只有对象字那么您将遇到问题并且必须知道调用Arrays.toStringwords。 这种中断封装的方式非常糟糕并且在StackOverflow上经常造成混乱。 我曾问过甲骨文公司的其他开发人员有关此问题我的印象是现在很难修复它。 参考 Vanilla Java博客上来自我们的JCG合作伙伴 Peter Lawrey的Java常见问题 。 翻译自: https://www.javacodegeeks.com/2014/03/common-gotchas-in-java.html