2015-07-07 3 views
0

Я искал метод deleteCharAt по документам API. Тип возврата этого метода: StringBuilder. Поэтому я думал, что для изменения значения ссылки необходимы ссылочные переменные.Я хочу спросить о методе deleteCharAt

Например, я думаю, что sbuf=sbuf.deleteCharAt(0); является лучшим выражением, чем sbuf.deleteCharAt(0);.

Однако, для многих книг и кодов используется последний.

Какая ложная часть в моей мысли?

+7

'StringBuilder' часто возвращает тот же экземпляр' StringBuilder', так что вы можете сделать метод формирования цепочки 'sbuf.append ("Hello") .deletCharAt (0) '==' ello'. Этот подход часто используется объектами, реализующими шаблон построителя, поскольку он помогает вам сократить повторяющийся код. – MadProgrammer

+0

Я могу понять ваши коды. Но в этом коде 'sbuf.deleteCharAt (0);', где возвращается экземпляр?к компилятору Java? или Основной метод? – Volnyar

+0

Рассмотрите оцениваемое выражение шаг за шагом; 'sbuf' оценивается как ссылка на экземпляр StringBuffer, в этом экземпляре вызывается метод, поэтому' sbuf.deleteCharAt (0) 'оценивается как ссылка на экземпляр StringBuffer и т. д. Экземпляр возвращается из метода deleteCharAt в вызывающее выражение. – Luke

ответ

2

Объект StringBuilder является изменяемым; как только вы вызываете операцию .deleteCharAt(), ссылка sbuf остается на том же объекте, и внутреннее состояние этого объекта изменилось. Таким образом, вы можете вызвать метод в форме sbuf.deleteCharAt(0);.

Строки, например, не изменяются. Когда вы вызываете метод .substring(), скажем, он возвращает ссылку на совершенно новый экземпляр класса строк. Поэтому, если вы написали str.substring(5);, возвращаемое значение будет выброшено, а str все равно будет иметь старое значение. Вместо этого вам нужно написать что-то вроде newStr = str.substring(5); в случае неизменяемых объектов.

0

В java, String Объекты immutable. После создания строкового объекта его данные или состояние не могут быть изменены, но создается новый строковый объект.

Рассмотрим пример, приведенный ниже:

class Demo{ 
public static void main(String args[]){ 
    String s="Demo"; 
    s.concat("String");//concat() method appends the string at the end 
    System.out.println(s); 
} 
} 

Выход:

Demo

Здесь новый модифицированный строковый литерал создается и удаляется.

Если мы относим его к исходной переменной, она будет относиться к модифицированному object.For например:

class Demo{ 
public static void main(String args[]){ 
    String s="Demo"; 
    s=s.concat("String"); 
    System.out.println(s); 
} 
} 

Выход:

DemoString

Java StringBuilder класс используется для создания изменяемой строки.

class Demo{ 
    public static void main(String args[]){ 
    StringBuilder sb=new StringBuilder("Demo"); 
    sb.append("String");//now original string is changed 
    System.out.println(sb); 
    } 
} 

Выход:

DemoString