我无法理解Java Constant Pool for Integer的工作原理.
我理解字符串的行为,因此能够证明自己与Integer Constants的情况相同.
所以,对于整数
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2); // True
Run Code Online (Sandbox Code Playgroud)
&
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1==i2); // False
Run Code Online (Sandbox Code Playgroud)
直到这里,一切都在我的脑海里.
我无法消化的是,当我从127增加整数时,它的行为有所不同.这种行为在127之后发生变化,下面是代码片段
Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1==i2); // False. WHY?????
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解吗?
什么是Klass
与KlassKlass
在JVM中执行热点?
据我在文章介绍Perm生成中所理解的,Klass
是Java类的内部表示(比如说A
),它将保存有关类结构的基本信息,包括字节码.它将作为对象本身存储.A类的每个对象都有一个指向Klass
PermGen中内部表示的指针
KlassKlass是Klass
类本身的内部表示.为什么KlassKlass
需要?它存储了哪些额外信息?
此外,KlassKlass's
Klass
指针指向自身,我也不理解它.
我想设计一个类来逐步展示不变性.
以下是一个简单的课程
public class ImmutableWithoutMutator {
private final String firstName;
private final String lastName;
private final int age;
public ImmutableWithoutMutator(final String firstName, final String lastName, final int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
@Override
public String toString() {
return String.format(
"ImmutableWithoutMutator [age=%s, firstName=%s, lastName=%s]",
age, firstName, lastName);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我仍然可以通过使用以下代码来破坏使用反射.
import java.lang.reflect.Field;
public class BreakImmutableUsingReflection {
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
ImmutableWithoutMutator immMutator = new ImmutableWithoutMutator(
"firstName", "lastName", …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写这个函数,它f
在x上应用了两次函数
Prelude> applyTwice :: (a -> a) -> a -> a
Prelude> let applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试评估下面的表达式时
Prelude> applyTwice (`subtract` 3) 10
Output: 10
Prelude> applyTwice (3 `subtract`) 10
Output: 4
Run Code Online (Sandbox Code Playgroud)
根据我的理解,subtract
是一个中缀函数,所以给定的参数应该填充空位(左或右操作数),因此第一个表达式applyTwice (`subtract` 3) 10
应该像
10 `subtract` 3 `subtract` 3
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下的结果应该是4
,但输出是10
而在另一种情况下,即applyTwice (3 `subtract`) 10
输出是4
,我期待它10
我在某个地方出错了吗?
我想使用某种编辑器打开由Java Compiler生成的字节代码(Java二进制文件),这允许我查看字节代码(Raw,但人类可以理解,采用此处定义的格式)并直接修改.class
文件中的内容.
我试过这个javap
实用程序.但通过javap
,我无法更改我的.class文件,它似乎也没有显示原始字节代码
此外,我已经看到像JD Decompiler这样的反编译器,它给了我来自.class
File 的代码.但我对源代码不感兴趣,我想查看字节码.
另外,我尝试过名为dirtyJOE&JBE的 GUI编辑器.这个编辑器非常好,完成了我的目的的一半.我可以在.class
文件中看到各种字段并编辑我的.class
文件.但这似乎也就像一个翻译器,它解码字节码并在UI上显示它以便于理解.它没有显示原始字节代码.
甚至可以转到原始字节码?
我可能听起来很愚蠢,但我想确认这一点,以正确理解Java编译器和JVM.
java ×4
jvm ×2
.class-file ×1
bytecode ×1
constants ×1
haskell ×1
immutability ×1
integer ×1
javac ×1
jvm-hotspot ×1
permgen ×1
reflection ×1