Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Нет, длина строки Java является O (1), потому что строковый класс Java хранит длину как поле.
совет, который Вы получили, верен для C, среди других языков, но не Java. C strlen обходит массив символов, ища конец символа строки. Joel говорил об этом на подкасте, но в контексте C.
Вопреки тому, что было сказано до сих пор, нет никакой гарантии, которая String.length()
постоянная операция времени в количестве символов, содержавшихся в строке. Ни javadocs для String
класс, ни Спецификация языка Java не требуют String.length
быть постоянной операцией времени.
Однако в реализации Sun String.length()
постоянная операция времени. В конечном счете трудно вообразить, почему любая реализация имела бы непостоянную реализацию времени для этого метода.
Строка хранит длину в отдельной переменной. Так как строка неизменна, длина никогда не будет изменяться. Это должно будет вычислить длину только однажды, когда это будет создано, который происходит, когда память выделяется для него. Следовательно его O (1)
Необходимо знать, что length()
метод возвращает количество кодовых точек UTF-16, которое является не обязательно тем же как количеством символов во всех случаях.
хорошо, возможности того фактического влияния Вы являетесь довольно худыми, но нет никакого вреда в знании его.
В конечном счете Вы не знали, что могли записать ему этот путь:
for (int i = 0, l = x.length(); i < l; i++) {
// Blah
}
Это просто немного более чисто с тех пор l
, объем меньше.
Я не знаю, как хорошо ссылка переведет, но видеть источник String#length
. Короче говоря, #length()
имеет O (1) сложность, потому что это просто возвращает поле. Это - одно из многих преимуществ неизменных строк.
Согласно это , длина является полем Строкового объекта.