Целочисленный диапазон в Java равен -2,147,483,648 до +2,147,483,647, хотя он переполнен для значения 128 [duplicate]

В руководстве указано следующее:

LOAD_FILE (имя_файла)

Считывает файл и возвращает содержимое файла в виде строки. Чтобы использовать эту функцию, файл должен находиться на хосте сервера, вы должны указать полный путь к файлу, и вы должны иметь привилегию FILE. Файл должен быть доступен для чтения всем и его размер меньше, чем max_allowed_packet байтов. Если системная переменная secure_file_priv установлена ​​на непустое имя каталога, файл, который должен быть загружен, должен находиться в этом каталоге.

Если файл не существует или не может быть прочитан, поскольку одно из предыдущих условий не является удовлетворен, функция возвращает NULL.

Начиная с MySQL 5.0.19 системная переменная character_set_filesystem управляет интерпретацией имен файлов, которые указаны как литералы.

mysql> UPDATE t
            SET blob_col=LOAD_FILE('/tmp/picture')
            WHERE id=1;

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

  • передаете полный путь?
  • установлены ли привилегии?
  • , что возвращает функция? NULL?
  • вы пробовали его с запросом, указанным в руководстве?

130
задан Ciro Santilli 新疆改造中心 六四事件 法轮功 15 February 2016 в 00:17
поделиться

6 ответов

Когда вы компилируете литерал числа в Java и назначаете его Integer (capital I), компилятор испускает:

Integer b2 =Integer.valueOf(127)

Эта строка кода также генерируется при использовании автобоксинга.

valueOf реализовано так, что определенные числа «объединены», и он возвращает тот же экземпляр для значений, меньших 128.

Из исходного кода java 1.6 строка 621:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

Значение high может быть настроено на другое значение с системным свойством.

-Djava.lang.Integer.IntegerCache.high = 999

Если вы запустите свою программу с этим системным свойством, она выведет true!

Очевидный вывод: никогда не полагайтесь на то, что две ссылки идентичны, всегда сравнивайте их с .equals().

Таким образом, b2.equals(b3) будет печатать true для всех логически равных значений b2, b3.

Обратите внимание, что кег Integer отсутствует по соображениям производительности, а скорее соответствует JLS, раздел 5.1.7 ; идентификатор объекта должен быть задан для значений от -128 до 127 включительно.

Целое число # valueOf (int) также документирует это поведение:

этот метод вероятно, даст значительно лучшую производительность пространства и времени, кэшируя часто запрашиваемые значения. Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127 включительно и может кэшировать другие значения за пределами этого диапазона.

179
ответ дан Sнаđошƒаӽ 16 August 2018 в 11:27
поделиться
  • 1
    обратите внимание, что значения, меньшие 127, будут игнорироваться java, а значения больше Integer.MAX_VALUE-128 будут закрыты. – Andreas Petersson 9 November 2009 в 11:14
  • 2
    Целые элементы кэшируются для значений байтов в Java 5 и выше, что делает новый Integer (1) == new Integer (1). Однако это не так в Java 1.4 или ниже, поэтому будьте осторожны, если вам придется в конечном итоге перейти к этой среде. – MetroidFan2002 9 November 2009 в 15:55
  • 3
    Нет, это неправильно. new Integer (1) == new Integer (1) является ложным независимо от jvm. AFAIK никакой компилятор не будет обманывать «новый». ключевое слово. он ДОЛЖЕН всегда создавать экземпляр нового объекта. – Andreas Petersson 9 November 2009 в 16:28
  • 4
    Это все еще имеет место в Java 8 по состоянию на октябрь 2016 года? – Kyle 8 December 2016 в 20:59

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

Однако, поскольку вы используете объекты Integer, оператор == имеет другое значение.

В контексте объектов == проверяет, ссылаются ли переменные на одну и ту же ссылку на объект.

Чтобы сравнить значение объектов, вы должны использовать метод equals () Eg

 b2.equals(b1)

, который укажет, является ли b2 меньше, чем b1, больше или равно (проверьте API для деталей)

8
ответ дан chrisbunney 16 August 2018 в 11:27
поделиться

Ключи для автобоксинга -128 до 127. Это указано в JLS ( 5.1.7 ).

Если значение p , помещенное в поле, равно true, false, байт, символ в диапазоне от \ u0000 до \ u007f или int или short число между -128 и 127, затем пусть r1 и r2 - результаты любых двух бокс-преобразований p. Всегда бывает, что r1 == r2.

Простое правило запоминания при работе с объектами - использовать .equals, если вы хотите проверить, являются ли эти два объекта «equal», используйте ==, когда вы хотите увидеть, указывают ли они на один и тот же экземпляр.

20
ответ дан Soner Gönül 16 August 2018 в 11:27
поделиться

Я написал следующее, поскольку эта проблема не просто специфична для Integer. Мое заключение состоит в том, что чаще всего, если вы неправильно используете API, вы видите неправильное поведение. Используйте его правильно, и вы должны увидеть правильное поведение:

public static void main (String[] args) {
    Byte b1=127;
    Byte b2=127;

    Short s1=127; //incorrect should use Byte
    Short s2=127; //incorrect should use Byte
    Short s3=128;
    Short s4=128;

    Integer i1=127; //incorrect should use Byte
    Integer i2=127; //incorrect should use Byte
    Integer i3=128;
    Integer i4=128;

    Integer i5=32767; //incorrect should use Short
    Integer i6=32767; //incorrect should use Short

    Long l1=127L;           //incorrect should use Byte
    Long l2=127L;           //incorrect should use Byte
    Long l3=13267L;         //incorrect should use Short
    Long l4=32767L;         //incorrect should use Short
    Long l5=2147483647L;    //incorrect should use Integer 
    Long l6=2147483647L;    //incorrect should use Integer
    Long l7=2147483648L;
    Long l8=2147483648L;

    System.out.print(b1==b2); //true  (incorrect) Used API correctly
    System.out.print(s1==s2); //true  (incorrect) Used API incorrectly
    System.out.print(i1==i2); //true  (incorrect) Used API incorrectly
    System.out.print(l1==l2); //true  (incorrect) Used API incorrectly

    System.out.print(s3==s4); //false (correct) Used API correctly
    System.out.print(i3==i4); //false (correct) Used API correctly
    System.out.print(i5==i6); //false (correct) Used API correctly
    System.out.print(l3==l4); //false (correct) Used API correctly
    System.out.print(l7==l8); //false (correct) Used API correctly
    System.out.print(l5==l6); //false (correct) Used API incorrectly

}
-5
ответ дан thejartender 16 August 2018 в 11:27
поделиться

Это оптимизация памяти в Java.

Чтобы сохранить в памяти, Java «повторно использует» все объекты-обертки, значения которых попадают в следующие диапазоны:

All Логические значения (true и false)

Все значения байта

Все значения символов от \ u0000 до \ u007f (т.е. от 0 до 127 в десятичной форме)

Все короткие и Целочисленные значения от -128 до 127.

Примечание:

  • , если вы создаете Boolean с новым логическим значением (значением); вы всегда будете получать новый объект
  • , если вы создадите String с новой строкой (значение); вы всегда будете получать новый объект
  • , если вы создадите Integer с новым Integer (значение); вы всегда будете получать новый объект

и т. д.

4
ответ дан Willmore 16 August 2018 в 11:27
поделиться

Посмотрите на Integer.java, если значение находится между -128 и 127, оно будет использовать кешированный пул, поэтому (Integer) 1 == (Integer) 1 пока (Integer) 222 != (Integer) 222

 /**
 * Returns an {@code Integer} instance representing the specified
 * {@code int} value.  If a new {@code Integer} instance is not
 * required, this method should generally be used in preference to
 * the constructor {@link #Integer(int)}, as this method is likely
 * to yield significantly better space and time performance by
 * caching frequently requested values.
 *
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 *
 * @param  i an {@code int} value.
 * @return an {@code Integer} instance representing {@code i}.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}       
2
ответ дан yanghaogn 16 August 2018 в 11:27
поделиться
Другие вопросы по тегам:

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