Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
32
Добавлен:
27.03.2015
Размер:
397.31 Кб
Скачать

Пакет java.lang. Классы StringBuffer и StringBuilder (1)

Отличаются эти классы друг от друга только тем, что класс StringBuilder не рекомендуется применять в многопоточных приложениях. Методы этого класса не синхронизированы и не могут гарантировать правильных результатов при одновременном

доступе к экземпляру из нескольких потоков. Однако как следствие, методы класса StringBuffer работают значительно медленнее.

Оба класса предоставляют функциональность модификации строковых данных "in

place", т.е. без создания новой копии строки каждый раз, когда в ней что-то изменяется, как это делает класс String. Соответственно, использование StringBuffer или StringBuilder

приводит к меньшей нагрузке на память и к более высокому быстродействию при обработке текстовых данных.

Оба класса сохраняют свои строки в закрытых символьных массивах, размер которых (capacity) всегда удовлетворяет соотношению capacity >= length().

Далее в слайдах будет использоваться обозначение StringB* для этих классов. Конструкторы StringB*:

StringB*( ) – создает новый экземпляр пустой последовательности символов начальной емкостью 16 символов.

StringB*( int capacity ) – создает новый экземпляр пустой последовательности символов начальной емкостью capacity символов.

StringB*( CharSequence sequence ) – создает новый экземпляр StringB*, содержащий ту же последовательность символов, что и заданный sequence.

StringB*( String string ) – создает экземпляр, содержащий ту же последовательность символов, что и заданная строка string.

Пакет java.lang. Классы StringBuffer и StringBuilder (2)

Каждый из группы перегруженных методов append добавляет передаваемую ему (или формируемую им путем преобразования аргумента в) последовательность

символов в конец символьного массива и возвращает (ссылку на) собственный экземпляр StringB*:

public StringB* append( boolean boolValue ) public StringB* append( char charValue ) public StringB* append( char[ ] charArray )

public StringB* append( char[ ] charArray, int offset, int count ) public StringB* append( charSequence sequence )

public StringB* append( charSequence sequence, int start, int end ) public StringB* append( double doubleValue )

public StringB* append( float floatValue ) public StringB* append( long longValue ) public StringB* append( int intValue )

public StringB* append( Object objValue ) // добавляется objValue.toString( ) public StringB* append( String strValue )

public StringB* append( StringB* sbValue )

Аналогичен всем перечисленным метод: public StringB* appendCodePoint( int codePoint )

добавляющий один символ, кодовая точка которого передается в качестве аргумента.

Пакет java.lang Классы StringBuffer и StringBuilder (3)

Подобно предыдущей группе методов каждый из перегруженных методов insert вставляет передаваемую ему (или формируемую им путем преобразования аргумента в) последовательность символов в указанное место символьного массива и точно так же возвращают (ссылку на) собственный экземпляр:

public StringB* insert( int offset, boolean boolValue ) public StringB* insert( int offset, char charValue ) public StringB* insert( int offset, char[ ] charArray )

public StringB* insert( int index, char[ ] charArray, int offset, int count ) public StringB* insert( int offset, charSequence sequence )

public StringB* insert( int offset, charSequence sequence, int start, int end )

public StringB* insert( int offset, double doubleValue )

 

public StringB* insert( int offset, float floatValue )

 

public StringB* insert( int offset, long longValue )

 

public StringB* insert( int offset, int intValue )

 

public StringB* insert( int offset, Object objValue )

// вставляется objValue.toString( )

public StringB* insert( int offset, String strValue )

 

Нет методов:

 

insert( int offset, StringB* sbValue) и

 

insertCodePoint( int offset, int codePoint)

 

Пакет java.lang Классы StringBuffer и StringBuilder (4)

Удалить в точности один символ из содержимого можно вызовом метода: public StringB* deleteCharAt( int index )

Удалить подпоследовательность символов начиная с позиции start и кончая позицией end можно с помощию метода:

public StringB* delete( int start, int end )

Заменить подпоследовательность символов начиная с позиции start и кончая позицией end заданной строкой символов можно с помощию метода:

public StringB* replace( int start, int end, String str )

Замена одного символа в заданной позиции указанным символом: public void setCharAt( int index, char ch )

Метод reverse переставляет символы в обратном порядке(первый-последний, второй-предпоследний, …):

public StringB* reverse()

Принудительное наращивание емкости внутреннего символьного массива либо до minCapacity, либо до (пред. емкость)*2+2 (что больше) выполняется методом:

public void ensureCapacity( int minCapacity )

Принудительная установка длины строкового содержимого с удалением лишних символов, либо с добавлением символов с кодом \u0000:

public void setLength( int newLength )

Следующий метод пытается привести емкость в соответствие длине содержимого:

public void trimToSize()

Пакет java.lang. Классы StringBuffer и StringBuilder (5)

Метод

public int capacity()

возвращает текущую емкость закрытого символьного массива. Остальные методы:

public char charAt( int index ) public int codePointAt( int index )

public int codePointBefore( int index )

public int codePointCount( int beginIndex, int endIndex )

public void getChars( int srcBegin, int srcEnd, char[ ] dst, int dstBegin ) public int indexOf( String str )

public int indexOf( String str, int fromIndex ) public int lastIndexOf( String str )

public int lastIndexOf( String str, int fromIndex ) public int length( )

public CharSequence subSequence( int start, int end ) public String substring( int start )

public String substring( int start, int end )

полностью аналогичны одноименным методам класса String.

Пакет java.lang Класс Enum. Перечисления

При программировании часто бывает необходимо ограничить множество допустимых значений для данных некоторого типа. Так, например, день недели может иметь 7 разных значений, месяц в году - 12, а время года - 4.

Для решения подобных задач во многих языках программирования со статической типизацией предусмотрен специальный тип данных - перечисление (enum). В Java перечисление появилось не сразу. Специализированная языковая конструкция enum была введена начиная с версии 1.5. Перечисления реализованы

на уровне компилятора и виртуальной машины. Для поддержки перечислений в пакете java.lang появился специальный класс Enum. До этого использовались другие,

значительно менее удобные, методы для реализации перечислений. Пример:

enum Lights { GREEN, FLASHING_GREEN, YELLOW,

FLASHING_YELLOW , RED }

// цвета светофора

enum Direct { UP, DOWN, NONE }

// направление переключения

Хотя в тексте это явно и не указано, но Lights и Direct являются полноценными классами и наследуют от класса java.lang.Enum.

Константы, заданные в перечислении, преобразуются компилятором в константные вложенные классы. Каждому такому классу ставится в соответствие статическое поле (константное), означающее его порядковый номер (от 0) и возвращаемое методом ordinal( ):

System.out.println( Lights.YELLOW.ordinal( ) ); // напечатается 2

Перечисления Пример1: Светофор (1)

Lights currentLight = Lights.GREEN; Direct currentDirect = Direct.UP;

int timeLength;

switch (currentDirect){ case UP:

switch (currentLight) { case GREEN:

currentLight = Lights.FLASHING_GREEN; timeLength = 3; break;

case FLASHING_GREEN: currentLight = Lights.YELLOW; timeLength = 5; break;

case YELLOW: currentLight = Lights.RED; timeLength = 50; break; case RED:

currentLight = Lights.YELLOW; currentDirect = Direct.DOWN; timeLength = 5; break;

}

break;

Перечисления Пример1: Светофор (2)

case DOWN:

switch (currentLight) { case RED:

currentLight = Lights.YELLOW; timeLength = 5; break;

case YELLOW:

currentLight = Lights.GREEN; timeLength = 50; break;

case GREEN:

currentLight = Lights.FLASHING_GREEN; currentDirect = Direct.UP;

timeLength = 3; break;

}

break; case NONE:

currentLight = Lights.FLASHING_YELLOW; timeLength = 3; break;

}

trafficLight.setLight( currentLight ); trafficLight.setTime( timeLength );

Перечисления Расширения Enum (1)

Любое перечисление – это класс, наследуемый от java.lang.Enum, для которого можно определить свои конструкторы и методы:

enum Lights {

GREEN( 0 ), FLASHING_GREEN( 1 ), YELLOW( 2 ), RED( 3 ), FLASHING_YELLOW( -1 );

private int value;

private int currentValue =0;

Lights( int value ) { this.value=value; } public int getValue( ) { return value; } public Lights upLight() {

if( currentValue < 3) currentValue += 1;

return Lights.values( )[ currentValue ];

}

public Lights downLight() { if( currentValue == 3 ) currentValue -= 1;

else

currentValue = 0;

return Lights.values( )[ currentValue ];

}

}

Перечисления Пример2: Светофор

Lights currentLight = Lights.GREEN; Direct currentDirect = Direct.UP;

int timeLength;

switch (currentDirect){ case UP:

timeLength = ( (currentLight = Lights.upLight( ) ) == Lights.FLASHING_GREEN)? 3 : ( currentLight == Lights.RED )? 50 : 5;

if ( currentLight == Lights.RED) currentDirect = Direct.DOWN;

break; case DOWN:

timeLength = ((currentLight = Lights.downLight( ) ) == Lights.YELLOW)? 5 : 50; if ( currentLight == Lights.GREEN)

currentDirect = Direct.UP; break;

case NONE:

currentLight = Lights.FLASHING_GREEN; timeLength = 3; break;

}

trafficLight.setLight( currentLight );

Соседние файлы в папке Презентации по Java