Разработчики и новички часто застревают в своей карьере Java-разработчика, и для освоения каждой работы требуются определенные усилия и практика. Разработчики часто задают вопросы своей команде или общественности для получения решений. Как разработчики Java, они сталкиваются с тысячами проблем каждый день. Эта проблема может быть критической или незначительной.
Java – это объектно-ориентированный язык программирования общего назначения. Для разработчика Java или любого другого разработчика ошибки продолжают возникать. Чаще всего программисты сталкиваются с такими ошибками во время практики или экспериментов.
Итак, мы составили список наиболее часто задаваемых вопросов о Java, чтобы помочь вам, ребята. Вот список вопросов о Java.
10 Самых Часто Задаваемых Вопросов О Java
Если вы также являетесь разработчиком Java, и если вы также сталкивались с ошибками при кодировании, и если у вас есть какие-то вопросы о Java, то, пожалуйста, сначала ознакомьтесь с решениями, приведенными ниже. Приведенные ниже вопросы о Java описаны с использованием наилучших возможных решений.
1. Является ли Java “передачей по ссылке” или “передачей по значению”?
Ответ:
Java всегда передается по значению . К сожалению, когда мы передаем значение объекта, мы передаем ссылку на него. Это сбивает с толку начинающих, так как эти вопросы о java часто задают новички, и это выглядит следующим образом:
public static void main(String[] args) { Dog aDog = new Dog("Max"); Dog oldDog = aDog; // we pass the object to foo foo(aDog); // aDog variable is still pointing to the "Max" dog when foo(...) returns aDog.getName().equals("Max"); // true aDog.getName().equals("Fifi"); // false aDog == oldDog; // true } public static void foo(Dog d) { d.getName().equals("Max"); // true // change d inside of foo() to point to a new Dog instance "Fifi" d = new Dog("Fifi"); d.getName().equals("Fifi"); // true }
В приведенном выше примере aDog.getName()
все равно вернет "Max"
. Значение аДог
внутри main
не изменяется в функции foo
с помощью Dog "Fifi"
, поскольку ссылка на объект передается по значению. Если бы он был передан по ссылке, то aDog.getName()
в main
вернул бы "Fifi"
после вызова foo
.
Также:
public static void main(String[] args) { Dog aDog = new Dog("Max"); Dog oldDog = aDog; foo(aDog); // when foo(...) returns, the name of the dog has been changed to "Fifi" aDog.getName().equals("Fifi"); // true // but it is still the same dog: aDog == oldDog; // true } public static void foo(Dog d) { d.getName().equals("Max"); // true // this changes the name of d to be "Fifi" d.setName("Fifi"); }
В приведенном выше примере Фифи
– это имя собаки после вызова |/foo(собака) потому что имя объекта было задано внутри
foo(…) . Любые операции, которые
food выполняет над d , таковы, что для всех практических целей они выполняются над
собакой , но
невозможно изменить значение переменной собака
сама по себе.
Дополнительный Ответ:
В спецификации Java говорится, что все в Java передается по значению. В Java нет такого понятия, как “передача по ссылке”.
Ключом к пониманию этого является то, что что-то вроде
Dog myDog;
это не Собака; на самом деле это указатель на Собаку.
Что это значит, так это то, что у вас есть
Dog myDog = new Dog("Rover"); foo(myDog);
по сути, вы передаете адрес созданного объекта Dog
методу foo
.
Предположим, что объект Dog
находится по адресу памяти 42. Это означает, что мы передаем 42 методу.
если бы Метод был определен как
public void foo(Dog someDog) { someDog.setName("Max"); // AAA someDog = new Dog("Fifi"); // BBB someDog.setName("Rowlf"); // CCC }
Давайте посмотрим, что происходит.
- параметр
некоторая собака
установлена на значение 42 - в строке “AAA”
за некоторой собакой
следуетСобака
, на которую она указывает (объектСобака
по адресу 42)- эту
Собаку
(ту, что по адресу 42) просят сменить имя на Макс
- в строке “BBB”
- создается новая
Собака
. Допустим, он находится по адресу 74 - мы присваиваем параметр
someDog
до 74
- создается новая
- в строке “CCC”
за некоторой собакой
следуетСобака
, на которую она указывает (объектСобака
по адресу 74)- этого
Пса
(того, что по адресу 74) просят сменить его имя на Роулф
- затем, мы возвращаемся
Теперь давайте подумаем о том, что происходит за пределами метода:
Сделал моя Собака измениться?
Вот ключ.
Имея в виду, что my Dog
– это указатель, а не фактическая Dog
, ответ – НЕТ. моя собака
по-прежнему имеет значение 42; она по-прежнему указывает на исходную
Собаку/| (но обратите внимание, что из–за строки “AAA” ее имя теперь “Max” – все та же собака; значение myDog
не изменилось.)
Вполне допустимо следовать по адресу и изменять то, что находится в его конце; однако это не меняет переменную.
Java работает точно так же, как C. Вы можете назначить указатель, передать указатель методу, следовать указателю в методе и изменять данные, на которые были указаны. Однако вы не можете изменить, куда указывает этот указатель.
В C++, Ada, Pascal, m и других языках, поддерживающих передачу по ссылке, вы действительно можете изменить переданную переменную.
Если бы в Java была семантика передачи по ссылке, метод foo
, который мы определили выше, изменил бы то, на что указывал myDog
, когда он назначал какая-то собака
на линии ВВВ.
Думайте о ссылочных параметрах как о псевдонимах для передаваемой переменной. Когда этот псевдоним присваивается, то же самое относится и к переменной, которая была передана.
2. Как прочитать/преобразовать входной поток в строку в Java?
Ответ:
Хороший способ сделать это – использовать Apache commons IOUtils для копирования Входной поток
в StringWriter
, что-то вроде
StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, encoding); String theString = writer.toString();
или даже
// NB: does not close inputStream, you'll have to use try-with-resources for that String theString = IOUtils.toString(inputStream, encoding);
даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream
даже в качестве альтернативы вы могли бы использовать
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать дополнительный ответ:
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
String result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
String result = CharStreams.toString(new InputStreamReader( inputStream, Charsets.UTF_8));
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
Scanner s = new Scanner(inputStream).useDelimiter("\\A"); String result = s.hasNext() ? s.next() : "";
- даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью Долговые расписки.toString (ApacUsing CharStreams
(Guava) he Utils) С использованием
Scanner(JDK) С использованием
Stream API
String result = new BufferedReader(new InputStreamReader(inputStream)) .lines().collect(Collectors.joining("\n"));
- даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью Долговые расписки.toString (ApacUsing CharStreams
(Guava) he Utils) С использованием
Scanner(JDK) С использованием
Stream API
String result = new BufferedReader(new InputStreamReader(inputStream)).lines() .parallel().collect(Collectors.joining("\n"));
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString(ApacUsing
CharStreams
final int bufferSize = 1024; final char[] buffer = new char[bufferSize]; final StringBuilder out = new StringBuilder(); Reader in = new InputStreamReader(stream, StandardCharsets.UTF_8); int charsRead; while((charsRead = in.read(buffer, 0, buffer.length)) > 0) { out.append(buffer, 0, charsRead); } return out.toString();
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString(ApacUsing
CharStreams
StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, "UTF-8"); return writer.toString();
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString(ApacUsing
CharStreams
ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length); } // StandardCharsets.UTF_8.name() > JDK 7 return result.toString("UTF-8");
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString (ApacUsing CharStreams(Guava) he Utils) С использованием
Scanner(JDK) С использованием
Stream API
String newLine = System.getProperty("line.separator"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder result = new StringBuilder(); boolean flag = false; for (String line; (line = reader.readLine()) != null; ) { result.append(flag? newLine: "").append(line); flag = true; } return result.toString();
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString(ApacUsing
CharStreams
BufferedInputStream bis = new BufferedInputStream(inputStream); ByteArrayOutputStream buf = new ByteArrayOutputStream(); int result = bis.read(); while(result != -1) { buf.write((byte) result); result = bis.read(); } // StandardCharsets.UTF_8.name() > JDK 7 return buf.toString("UTF-8");
- даже в качестве альтернативы вы могли бы использовать
ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString(ApacUsing
CharStreams (Guava) he Utils) С использованием Scanner
int ch; StringBuilder sb = new StringBuilder(); while((ch = inputStream.read()) != -1) sb.append((char)ch); reset(); return sb.toString();
даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
- даже в качестве альтернативы вы могли бы использовать
- ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || С использованием || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n\ r || ) в || line.separator || системное свойство (foPerformance tests Решение 11 не может корректно работать с текстовыми решениями Unicode 4, 5, и 9 преобразуют разные разрывы строк в один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
Benchmark Mode Cnt Score Error Units 8. ByteArrayOutputStream and read (JDK) avgt 10 1,343 ± 0,028 us/op 6. InputStreamReader and StringBuilder (JDK) avgt 10 6,980 ± 0,404 us/op 10. BufferedInputStream, ByteArrayOutputStream avgt 10 7,437 ± 0,735 us/op 11. InputStream.read() and StringBuilder (JDK) avgt 10 8,977 ± 0,328 us/op 7. StringWriter and IOUtils.copy (Apache) avgt 10 10,613 ± 0,599 us/op 1. IOUtils.toString (Apache Utils) avgt 10 10,605 ± 0,527 us/op 3. Scanner (JDK) avgt 10 12,083 ± 0,293 us/op 2. CharStreams (guava) avgt 10 12,999 ± 0,514 us/op 4. Stream Api (Java 8) avgt 10 15,811 ± 0,605 us/op 9. BufferedReader (JDK) avgt 10 16,038 ± 0,711 us/op 5. parallel Stream Api (Java 8) avgt 10 21,544 ± 0,583 us/op
даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
Benchmark Mode Cnt Score Error Units 8. ByteArrayOutputStream and read (JDK) avgt 10 200,715 ± 18,103 us/op 1. IOUtils.toString (Apache Utils) avgt 10 300,019 ± 8,751 us/op 6. InputStreamReader and StringBuilder (JDK) avgt 10 347,616 ± 130,348 us/op 7. StringWriter and IOUtils.copy (Apache) avgt 10 352,791 ± 105,337 us/op 2. CharStreams (guava) avgt 10 420,137 ± 59,877 us/op 9. BufferedReader (JDK) avgt 10 632,028 ± 17,002 us/op 5. parallel Stream Api (Java 8) avgt 10 662,999 ± 46,199 us/op 4. Stream Api (Java 8) avgt 10 701,269 ± 82,296 us/op 10. BufferedInputStream, ByteArrayOutputStream avgt 10 740,837 ± 5,613 us/op 3. Scanner (JDK) avgt 10 751,417 ± 62,026 us/op 11. InputStream.read() and StringBuilder (JDK) avgt 10 2919,350 ± 1101,942 us/op
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || Использование || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n \ r || ) в || line.separator || системное свойство (F) (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстом Unicode Решения 4, 5 и 9 преобразуют другой разрыв строки на один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || С использованием || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n\ r || ) в || line.separator || системное свойство (проверка работоспособности (среднее время) в зависимости от длины входного потока в системе Windows 7: Графики (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстовыми решениями Unicode 4, 5, и 9 преобразуют разные разрывы строк в один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
length 182 546 1092 3276 9828 29484 58968 test8 0.38 0.938 1.868 4.448 13.412 36.459 72.708 test4 2.362 3.609 5.573 12.769 40.74 81.415 159.864 test5 3.881 5.075 6.904 14.123 50.258 129.937 166.162 test9 2.237 3.493 5.422 11.977 45.98 89.336 177.39 test6 1.261 2.12 4.38 10.698 31.821 86.106 186.636 test7 1.601 2.391 3.646 8.367 38.196 110.221 211.016 test1 1.529 2.381 3.527 8.411 40.551 105.16 212.573 test3 3.035 3.934 8.606 20.858 61.571 118.744 235.428 test2 3.136 6.238 10.508 33.48 43.532 118.044 239.481 test10 1.593 4.736 7.527 20.557 59.856 162.907 323.147 test11 3.913 11.506 23.26 68.644 207.591 600.444 1211.545
3. даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || Использование || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n\ r || ) в || line.separator || системное свойство (Как избежать операторов? Тест производительности (среднее время) в зависимости от длины входного потока в системе Windows 7: Графики (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстом Unicode Решения 4, 5 и 9 преобразуют другой разрыв строки на один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || Использование || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n\r || ) в || line.separator || системное свойство (foAnswer: Как избежать операторов? Тест производительности (среднее время) в зависимости от длины входного потока в системе Windows 7: Графики (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстом Unicode Решения 4, 5 и 9 преобразуют другой разрыв строки на один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || С использованием || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \ n \ r || ) в || line.separator || системное свойство (Есть два случая, когда возникает проверка null: Ответ: Как избежать заявления? Тест производительности (среднее время) в зависимости от длины входного потока в системе Windows 7: Графики (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстом Unicode Решения 4, 5 и 9 преобразуют другой разрыв строки на один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
- даже в качестве альтернативы вы могли бы использовать
- ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
даже в качестве альтернативы вы могли бы использовать ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью
Долговые расписки.toString
assert
даже в качестве альтернативы вы могли бы использовать || ByteArrayOutputStream, если вы не хотите смешивать свои потоки и писать Дополнительный ответ: Кроме того, существуют различные способы преобразования InputStream в строку в Java с помощью || Долговые расписки.toString || (ApacUsing || CharStreams || (Guava) he Utils) С использованием || Scanner || (JDK) С использованием || Stream API || (Java 8). Предупреждение ||: Это решение преобразует различные разрывы строк (например, || \r\n || ) В предупреждение ||: Это решение преобразует различные разрывы строк (например, || С помощью || InputStreamReader || \r\n || ) в || \n || . (Java 8). Использование || С использованием || ByteArrayOutputStream || (ApacheWarning ||: Это решение преобразует различные разрывы строк (например, || С использованием || \n\ r || ) в || line.separator || системное свойство (foAssertions – это часто недоиспользуемая функция Java, которая была добавлена в 1.4. Либо использовать || assert || утверждения (утверждения) или разрешить сбой (2) несложно. Там, где это неверный ответ. Где null является допустимым ответом с точки зрения контракта; и Есть два случая, когда возникает проверка null: Ответ: Как избежать утверждений? Тест производительности (среднее время) в зависимости от длины входного потока в системе Windows 7: Графики (тесты производительности в зависимости от длины входного потока в системе Windows 7) Время,, оценка 200,715 является лучшим): Тесты производительности для больших || строк || ) Тесты производительности для малых || строк || ), Время,, оценка 1,343 является лучшим): Тесты производительности Решение 11 не может корректно работать с текстом Unicode Решения 4, 5 и 9 преобразуют другой разрыв строки на один. Предупреждение ||: Предупреждение ||: Это решение имеет проблемы с Юникодом, например, с русским текстом (корректно работает только с текстом, отличным от Юникода), используя || InputStream.read() || и || StringBuilder || (JDK). || (JDK) и || ByteArrayOutputStream BufferedInputStream (например, в Windows на “\r\n”). Используя || BufferedReader || (JDK). InputStream.read || (JDK) и || Commons) и || IOUtils.скопируйте StringWriter || С помощью || и || StringBuilder || (JDK) parallel Stream API |/|| \n || .
assert:
где <условие>
– логическое выражение, а <объект>
– объект, выходные данные метода toString()
будут включены в ошибку.
Оператор assert
выдает ошибку (AssertionError)
если условие неверно. По умолчанию Java игнорирует утверждения. По умолчанию Java игнорирует утверждения. -ea
в JVM. Вы можете включать и отключать утверждения для отдельных классов и пакетов. Это означает, что вы можете проверять код с помощью утверждений во время разработки и тестирования и отключать их в рабочей среде, хотя мое тестирование практически не показало влияния утверждений на производительность.
Не использовать утверждения в этом случае нормально, потому что код просто завершится сбоем, что и произойдет, если вы используете утверждения. Единственная разница заключается в том, что с утверждениями это может произойти раньше, более значимым образом и, возможно, с дополнительной информацией, которая может помочь вам понять, почему это произошло, если вы этого не ожидали.
(1) Немного сложнее. Если у вас нет контроля над кодом, который вы вызываете, то вы застряли. Если null является допустимым ответом, вы должны проверить его наличие.
Однако, если это код, который вы действительно контролируете (и это часто бывает), тогда это совсем другая история. Избегайте использования нулей в качестве ответа. С методами, которые возвращают коллекции, это просто: возвращайте пустые коллекции (или массивы) вместо нулей практически все время.
С не-коллекциями это может быть сложнее. Рассмотрим это в качестве примера: если у вас есть эти интерфейсы:
public interface Action { void doSomething(); } public interface Parser { Action findAction(String userInput); }
Где анализатор принимает необработанный пользовательский ввод и находит, что нужно сделать, возможно, если вы для чего-то реализуете интерфейс командной строки. Теперь вы можете заключить контракт, чтобы он возвращал значение null, если нет соответствующего действия. Это приводит к нулевой проверке, о которой вы говорите.
Альтернативным решением является никогда не возвращать значение null и вместо этого использовать шаблон объекта Null :
public class MyParser implements Parser { private static Action DO_NOTHING = new Action() { public void doSomething() { /* do nothing */ } }; public Action findAction(String userInput) { // ... if ( /* we can't find any actions */ ) { return DO_NOTHING; } } }
Сравнивать:
Parser parser = ParserFactory.getParser(); if (parser == null) { // now what? // this would be an example of where null isn't (or shouldn't be) a valid response } Action action = parser.findAction(someInput); if (action == null) { // do nothing } else { action.doSomething(); }
к
ParserFactory.getParser().findAction(someInput).doSomething();
это гораздо лучший дизайн, потому что он приводит к более сжатому коду.
Тем не менее, возможно, для метода find Action() вполне уместно выдавать исключение со значимым сообщением об ошибке — особенно в этом случае, когда вы полагаетесь на пользовательский ввод. Было бы гораздо лучше, если бы метод foundation выдал исключение, чем если бы вызывающий метод взорвался простым NullPointerException без каких-либо объяснений.
try { ParserFactory.getParser().findAction(someInput).doSomething(); } catch(ActionNotFoundException anfe) { userConsole.err(anfe.getMessage()); }
Или, если вы считаете, что механизм try/catch слишком уродлив, вместо того, чтобы ничего не делать, ваше действие по умолчанию должно обеспечивать обратную связь с пользователем.
public Action findAction(final String userInput) { /* Code to return requested Action if found */ return new Action() { public void doSomething() { userConsole.err("Action not found: " + userInput); } } }
4. Различия между HashMap и Hashtable?
Ответ:
В Java существует несколько различий между HashMap
и Hashtable
:
Хэш-таблица
является синхронизированной , в то время какHashMap
– нет. Это делаетHashMap
лучше для непоточных приложений, поскольку несинхронизированные объекты обычно работают лучше, чем синхронизированные.Хэш-таблица
не допускаетnull
ключи или ценности.HashMap
допускает одиннулевой
ключ и любое количествонулевых
значений.- Одним из подклассов Hashmap является
LinkedHashMap
, поэтому в случае, если вам нужен предсказуемый порядок итераций (который по умолчанию является порядком вставки), вы можете легко заменитьHashMap
наLinkedHashMap
. Это было бы не так просто, если бы вы использовалиHashtable
.
Поскольку синхронизация для вас не является проблемой, то HashMap
лучше. Если синхронизация становится проблемой, вы также можете посмотреть |/ConcurrentHashMap .
Дополнительный Ответ:
Очень распространенной идиомой является “check then put” — т.Е. Найдите запись в Map
и добавьте ее, если она еще не существует. Это никоим образом не является атомарной операцией, независимо от того, используете ли вы Hashtable
или HashMap
.
Эквивалентно синхронизированная HashMap
может быть получена с помощью:
Collections.synchronizedMap(myMap);
Но чтобы правильно реализовать эту логику, вам нужна дополнительная синхронизация формы:
synchronized(myMap) { if (!myMap.containsKey("tomato")) myMap.put("tomato", "red"); }
Даже перебор записей Хэш-таблицы
‘ (или хэш-карты
, полученной с помощью Коллекции.synchronizedMap
) не является потокобезопасным, если вы также не защищаете Map
от изменения с помощью дополнительной синхронизации.
Реализации интерфейса ConcurrentMap
(например ConcurrentHashMap
) частично решают эту проблему, включая потокобезопасную семантику проверки и последующего действия , такую как:
ConcurrentMap.putIfAbsent(ключ, значение);
5. Как и когда следует использовать UserManager.isUserAGoat()?
Ответ:
Из source метод , используемый для возврата false
, пока он не был изменен в API 21.
/** * Used to determine whether the user making this call is subject to * teleportations. * @return whether the user making this call is a goat */ public boolean isUserAGoat() { return false; }
Похоже, что этот метод не имеет реальной пользы для нас, разработчиков.
В API 21 реализация была изменена, чтобы проверить, есть ли установленное приложение с пакетом com.coffeestainstudios.goatsimulator
/** * Used to determine whether the user making this call is subject to * teleportations. * *As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can * now automatically identify goats using advanced goat recognition technology.
* * @return Returns true if the user making this call is a goat. */ public boolean isUserAGoat() { return mContext.getPackageManager() .isPackageAvailable("com.coffeestainstudios.goatsimulator"); }
6. Почему операторы присваивания Java +=, -=, *=, не требуют приведения?
Ответ:
В данном случае §15.26.2 Составные операторы присваивания . Выдержка:
Составное выражение присваивания вида E1
эквивалентно E1 = E1
эквивалентно E1 = (T)((E1) op (E2)) E1
эквивалентно E1 = (T)((E1) op (E2))
, где T
является типом
E1 эквивалентно E1 = (T)((E1) op (E2))
short x = 3; x += 4.6;
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: .
short x = 3; x = (short)(x + 4.6);
E1 эквивалентно
E1 = (T)((E1) op (E2)) , где
T
7. E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из массива?
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList froAnswer: murray?
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью кода, который выглядит примерно так: murray?
new ArrayList<>(Arrays.asList(array)); Also the Simplest way can be
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью codList.asList(array); e, который выглядит примерно так: murray?
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов можно создать из массива, используя альтернативный ответ codAlternative: List.asList(array); e, который выглядит примерно так: murray?
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью codGiven: Альтернативный ответ: List.asList(array); e, который выглядит примерно так: murray?
Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью codeпростейший ответ заключается в том, чтобы сделать: Дано: Альтернативный ответ: List<Элемент>.asList(массив); e который выглядит примерно так Ответ: murray?
Listlist = Arrays.asList(array);
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью Codeпростейший ответ – сделать: Дано: Альтернативный ответ: Список<Это будет работать нормально. Элемент>.asList(массив); e, который чем-то похож на этот ответ: Мюррей? E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью Codeпростейший ответ – сделать: Дано: Альтернативный ответ: Список <Но с некоторыми оговорками: Это будет работать нормально. Элемент>.asList(массив); e, который чем-то похож на этот ответ: Мюррей?
- E1 эквивалентно E1 = (T)((E1) op (E2))
, где
Tявляется типом
E1 - , за исключением того, что
E1
вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из
8. E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью Codeпростейший ответ заключается в следующем: Дано: Альтернативный ответ: Список<Список, возвращаемый из asList, имеет || фиксированный размер || . Но есть некоторые предостережения, поэтому, если вы хотите иметь возможность добавлять или удалять элементы из возвращаемого списка в своем коде, вам нужно будет обернуть его в новый || ARRAВ противном случае вы получите исключение || UnsupportedOperationException || Как генерировать случайные целые числа в определенном диапазоне в Java? Это может быть удивительно. Если вы измените исходный массив, список также будет изменен. Список, возвращаемый из || asList() |/, поддерживается исходным массивом. yList || .: Это будет работать нормально. Элемент>.asList(массив); e, который чем-то похож на этот ответ: murray?
E1 || эквивалентно || E1 = (T)((E1) op (E2)) || , где || T || является типом || E1 || , за исключением того, что || E1 || вычисляется только один раз. Ошибки при отливке могут привести к критическому отказу. Пример приведен из || § 15.26.2 || и приводит к тому, что x имеет значение 7, поскольку оно эквивалентно: . Другими словами, || i; || – это ярлык для || i =(тип i) (i + j) || . Как создать ArrayList из Java, список массивов может быть создан из массива с помощью Codeпростейший ответ заключается в следующем: Дано: Альтернативный ответ: Список<Список, возвращаемый из asList, имеет || фиксированный размер || . Но есть некоторые предостережения, поэтому, если вы хотите иметь возможность добавлять или удалять элементы из возвращаемого списка в своем коде, вам нужно будет обернуть его в новый || ARRAВ противном случае вы получите исключение || UnsupportedOperationException || Ответ: Как генерировать случайные целые числа в определенном диапазоне в Java? Это может быть удивительно. Если вы измените исходный массив, список также будет изменен. Список, возвращаемый из || asList() |/, поддерживается исходным массивом. yList || .: Это будет работать нормально. Элемент>.asList(массив); e, который чем-то похож на этот ответ: murray?
E1 эквивалентно E1 = (T)((E1) op (E2))
import java.util.concurrent.ThreadLocalRandom; // nextInt is normally exclusive of the top value, // so add 1 to make it inclusive int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
Смотрите соответствующий JavaDoc . Преимущество этого подхода заключается в том, что нет необходимости явно инициализировать файл java.util. Случайный экземпляр, который может стать источником путаницы и ошибок при неправильном использовании.
Однако, наоборот, нет способа явно задать начальное значение, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, таких как тестирование или сохранение состояний игры или тому подобное. В таких ситуациях можно использовать технику, разработанную до Java 1.7, показанную ниже.
До Java 1.7 стандартный способ сделать это выглядел следующим образом:
import java.util.Random; /** * Returns a pseudo-random number between min and max, inclusive. * The difference between min and max can be at most * Integer.MAX_VALUE - 1. * * @param min Minimum value * @param max Maximum value. Must be greater than min. * @return Integer between min and max, inclusive. * @see java.util.Random#nextInt(int) */ public static int randInt(int min, int max) { // NOTE: This will (intentionally) not run as written so that folks // copy-pasting have to think about how to initialize their // Random instance. Initialization of the Random instance is outside // the main scope of the question, but some decent options are to have // a field that is initialized once and then re-used as needed or to // use ThreadLocalRandom (if using at least Java 1.7). // // In particular, do NOT do 'Random rand = new Random()' here or you // will get not very good / not very random results. Random rand; // nextInt is normally exclusive of the top value, // so add 1 to make it inclusive int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum; }
Смотрите соответствующий JavaDoc . На практике java.util. Случайный класс часто предпочтительнее, чем java.lang.Math.random() .
В частности, нет необходимости изобретать колесо генерации случайных целых чисел, когда в стандартной библиотеке есть простой API для выполнения этой задачи.
9. Почему char[] предпочтительнее, чем строка для паролей?
Ответ:
Строки являются неизменяемыми . Это означает, что после того, как вы создали String
, если другой процесс может сбросить память, нет никакого способа (кроме отражения ) избавиться от данных до начинается сбор мусора .
С помощью массива вы можете явно стереть данные после того, как закончите с ними. Вы можете перезаписать массив чем угодно, и пароль не будет присутствовать нигде в системе, даже перед сборкой мусора.
Так что да, это проблема безопасности, но даже использование char []
только уменьшает окно возможностей для злоумышленника, и это только для этого конкретного типа атаки.
Также возможно, что массивы, перемещаемые сборщиком мусора, оставят случайные копии данных в памяти. Сборщик мусора может очистить всю память по ходу работы, чтобы избежать подобных вещей. Даже если это произойдет, все равно есть время, в течение которого char[]
содержит фактические символы в качестве окна атаки.
10. Как эффективно перебирать каждую запись в Java Map?
Ответ:
Чтобы эффективно перебирать каждую запись в Java, используйте следующий код:
Mapmap = ... for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + "/" + entry.getValue()); }
Дополнительный Ответ:
Кроме того, это описание с примером может быть вам полезно
Например, если мы хотим найти сумму всех ключей и значений карты, мы можем написать:
- Использование итератора и Карта. Вход
long i = 0; Iterator> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); i += pair.getKey() + pair.getValue(); }
- Использование foreach и Карта. Вход
long i = 0; for (Map.Entrypair : map.entrySet()) { i += pair.getKey() + pair.getValue(); }
- Использование forEach из Java 8
final long[] i = {0}; map.forEach((k, v) -> i[0] += k + v);
- Использование набора ключей и для каждого
long i = 0; for (Integer key : map.keySet()) { i += key + map.get(key); }
- Использование набора ключей и итератор
long i = 0; Iteratoritr2 = map.keySet().iterator(); while (itr2.hasNext()) { Integer key = itr2.next(); i += key + map.get(key); }
- Используя для и карты. Вход
long i = 0; for (Iterator> entries = map.entrySet().iterator(); entries.hasNext(); ) { Map.Entry entry = entries.next(); i += entry.getKey() + entry.getValue(); }
- Использование Java 8 Stream API
final long[] i = {0}; map.entrySet().stream().forEach(e -> i[0] += e.getKey() + e.getValue());
- Параллельное использование Java 8 Stream API
final long[] i = {0}; map.entrySet().stream().parallel().forEach(e -> i[0] += e.getKey() + e.getValue());
- Использование Повторяющаяся карта из
Коллекций Apache
long i = 0; MapIteratorit = iterableMap.mapIterator(); while (it.hasNext()) { i += it.next() + it.getValue(); }
- Использование Изменяемой карты коллекций Eclipse (CS)
final long[] i = {0}; mutableMap.forEachKeyValue((key, value) -> { i[0] += key + value; });
в заключение
Это список из 10 наиболее часто задаваемых вопросов о Java. Если вы просмотрели полный список, пожалуйста, оставьте свой комментарий относительно списка.
Надеюсь, что эта статья помогла вам. Дайте нам знать, какое решение помогло вам в комментарии ниже. Кроме того, не забудьте поделиться этим постом, так как у других, подобных вам, также могут возникнуть аналогичные проблемы, связанные с Java.
Кроме того, пожалуйста, не стесняйтесь задавать любые вопросы, связанные с Java, мы будем рады вам помочь.
Исходный источник: Сообщение разработчика от True mark
Оригинал: “https://dev.to/truemark/10-most-asked-questions-about-java-5db3”