BigInteger неизменен или нет?

Подобный ответу Ic - Вы могли бы попытаться сравнить изображения в нескольких разрешениях. Таким образом, каждый образ сохраняется как 1x1, 2x2, 4x4.. 800x800. Если самое низкое разрешение не соответствует (подвергающийся порогу), можно сразу отклонить его. Если это действительно соответствует, можно сравнить их в следующем более высоком разрешении и так далее..

Также - если изображения совместно используют какую-либо подобную структуру, такую как медицинские изображения, Вы могли бы быть в состоянии извлечь ту структуру в описание, которое более легко/быстрее сравнить.

9
задан Henk Holterman 22 March 2019 в 20:52
поделиться

2 ответа

Операторы ++ и - реализованы в терминах обычных + и - ], так что на самом деле:

b++;

эквивалентно:

var temp = b;
b = b + 1;
<use temp for the expression where b++ was located>

Теперь, как уже говорилось, это может показаться, что это нарушает неизменяемость, но это не так.

Вместо этого вы должны смотреть на этот код как на следующее:

var temp = b;
b = BigInteger.op_Add(b, 1); // constructs a new BigInteger value
<use temp ...>

В памяти останутся два объекта: исходное значение BigInteger и новый, на который теперь ссылается b. Вы можете легко проверить, что происходит, с помощью следующего кода:

var x = b;
b++;
// now inspect the contents of x and b, and you'll notice that they differ

Итак, исходный объект не изменился, следовательно, он не нарушает неизменяемость, и, чтобы ответить на новую часть вопроса, это должно быть потокобезопасным.

То же самое происходит со строками:

String s1 = s2;
s2 += "More";
// now inspect s1 and s2, they will differ
14
ответ дан 4 December 2019 в 13:03
поделиться

Since BigInteger is immutable, b++ will be just equivalent to:

BigInteger temp=b;
b=temp+1;

After this operation, temp is recycled by the GC and the memory is freed.

3
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: