== 1. RawPacket keeps the caller's array and returns its own == after raw[0] = 99 : [99, 2, 3] after rp.data()[1] = 88 : [99, 88, 3] == 2. Packet copies in the constructor and in the accessor == after the same two writes : [1, 2, 3] == 3. The generated equals() still compares the arrays by identity == new Packet({1}).equals(new Packet({1})) : false