Задачу я решил, путем гугла и раздела помощь, но возникли вопросы.
1. name.length() откуда взялось lenght()? Что это вообще такое и почему это надо использовать, если раньше об этом даже мельком не было речи?
2. Не понимаю этот момент http://prntscr.com/ns99ze Просто не вижу в чем разница, по мне они одинаковые и результат должен быть один.
CilitBang
25 уровень
Несколько вопросов
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
23 мая 2019, 09:34решение
1. Невозможно ни в одном курсе рассказать про все методы даже основных классов. Про них про всех можно узнать только с помощью поиска: либо читать официальную документацию по этому классу, либо внимательно изучать исходники самого класса, либо гуглить локально требуемые функции "java найти длину строки", "java String длина" и т.д. Лучше сразу на английском.
Привыкай.
В данном случае length() - это метод, который возвращает количество символов у объекта типа String, т.е. проще говоря длину строки.
2. Тут немного теории. Два любых объекта в java можно сравнить при помощи метода equals(). Оригинально, если в классе не переопределена собственная реализация метода equals(), то они сравниваются так, как вот эти два кота на скриншоте: возвращают false, если переменные содержат ссылки на разные объекты. Поскольку созданы два разных объекта (т.к. два раза произведена операция new), то и хранятся они в двух отдельных ячейках памяти. Это значит, что в переменных содержатся две разные ссылки, в одной ссылка на первый объект, во второй - на второй объект. Поскольку ссылки разные, значит содержимое переменных разное, значит переменные не равны. Если проводить аналогию, то это все равно, что сравнивать двух близнецов: они могут выглядеть абсолютно одинаково и даже можно предположить, что их одинаково зовут, но тем не менее это будут два разных человека, нельзя сказать, что это один человек.
А в классе String метод equals переопределен таким образом: ссылки на объекты уже не сравниваются, сравнивается только содержимое самой строки. И сделано утверждение, если содержимое строки одинаковое, то и объекты одинаковые. Поэтому два разных объекта с одинаковым содержимым считаются одинаковыми.
+6
CilitBang QA в КЕФИР!
23 мая 2019, 10:53
Кажется, понял. А для int(или другого класса, char, long и тд) это работает как и для String? Будет сравниваться содержимое? Без переопределения я понял, что два объекта, разные переменные - разные ссылки, потому false.
И до кучи вопрос, чтобы не плодить. Имеем фрагмент кода:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // знаю как работает и почему выглядит так, как выглядит
String q = reader.readLine(); // Тоже знаю для чего и что делает, но не совсем понимаю, почему нельзя reader.read();
int a = Integer.parseInt(q); // вообще не имею понятия, что тут происходит
0
hidden #598481
23 мая 2019, 11:24
Примитивы тем отличаются от ссылочных типов, что они хранят не ссылки на объекты, а сами объекты. Именно поэтому их можно сравнивать через "==", а не через equals(). Поэтому 1 == 1, и если int a = 1 и int b = 1, то a == b. То есть тут работа идет непосредственно со значением.
У каждого примитива есть т.н. обертка: int - Integer, byte - Byte и т.д. Обертки - это ссылочный тип, он как и String хранит ссылку на объект. Их уже надо сравнивать через equals. И да, equals вернет true, если они ссылаются на одинаковые объекты:
reader.read() прочитает один байт с консоли. Если ты введешь например цифру "1", то этот метод вернет байт, который означает цифру 1, а не символ "1". Это может показаться несколько сложным, поймешь потом.
Вообще почему ридер называется буферизованным? Потому что он может считывать не только посимвольно, но и накапливать у себя в буфере все прочитанные символы до тех пор, пока не встретит символ переноса строки. Этим как раз занимается метод readLine(). Переход на новую строчку - это ввод таких же невидимых символов, как и пробел, у которых тоже есть свои байты. И ввод этих символов как раз служит своеобразным триггером для того, чтобы метод readline() прекратил буферизацию и вернул все прочитанные символы в виде одной переменной String.
Integer.parseInt() - это метод, позволяющий программе посмотреть содержимое строки и представить его в виде числа. Для этого нужно, чтобы все символы в этой строке были символами той системы счисления, в которую происходит преобразование. parseInt() с одним параметром по умолчанию работает с десятичной системой счисления, поэтому требуется, чтобы строка содержала в себе только символы от 0 до 9 +4
hidden #598481
23 мая 2019, 11:25
Если это не выполнится, то метод выбросит исключение, и преобразование строки в число не удастся. Если в строке только цифры, то выполнение метода позволит получить из строки "123" число 123, с которым можно в дальнейшем работать как с числом: производить арифметические действия, использовать в качестве числовых аргументов и т.д.
+3
CilitBang QA в КЕФИР!
23 мая 2019, 11:45
Спасибо. Как всегда подробно и понятно.
0