Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


–абота со строками в Java. —троки как объекты.  лассы String, StringBuffer и StringBuilder




 ласс String инкапсулирует действи€ со строками. ќбъект типа String Ц строка, состо€ща€ из произвольного числа символов, от 0 до 2*109. Ћитерные константы типа String представл€ют собой последовательности символов, заключЄнные в двойные кавычки:

ФAФ, ФabcdФ, ФabcdФ, Фћама моет рамуФ, Ф Ф.

Ёто так называемые УдлинныеФ строки. ¬нутри литерной строковой константы не разрешаетс€ использовать р€д символов - вместо них примен€ютс€ управл€ющие последовательности.

¬нутри строки разрешаетс€ использовать переносы на новую строку. Ќо литерные константы с такими переносами запрещены, и надо ставить управл€ющую последовательность У\nФ.   сожалению, такой перенос строки не срабатывает в компонентах.

–азрешены пустые строки, не содержащие ни одного символа.

¬ €зыке Java строковый и символьный тип несовместимы. ѕоэтому ФAФ Ц строка из одного символа, а 'A' Ц число с ASCII кодом символа ФAФ. Ёто заметно усложн€ет работу со строками и символами.

—троки можно складывать: если s1 и s2 строковые литерные константы или переменные, то результатом операции s1+s2 будет строка, €вл€юща€с€ сцеплением (конкатенацией) строк, хран€щихс€ в s1 и s2. Ќапример, в результате операции

String s=ФЁто Ф+Фмо€ строкаФ;

в переменной s будет хранитьс€ строковое значение ФЁто мо€ строкаФ.

ƒл€ строк разрешЄн оператор Ф+=Ф. ƒл€ строковых операндов s1 и s2 выражение

s1+=s2 эквивалентно выражению s1=s1+s2.

Ћюба€ строка (набор символов) €вл€етс€ объектом Ц экземпл€ром класса String. ѕеременные типа String €вл€ютс€ ссылками на объекты, что следует учитывать при передаче параметров строкового типа в подпрограммы, а также при многократных изменени€х строк. ѕри каждом изменении строки в динамической области пам€ти создаЄтс€ новый объект, а прежний превращаетс€ в УмусорФ. ѕоэтому при многократных изменени€х строк в цикле возникает много мусора, что нежелательно.

ќчень частой ошибкой €вл€етс€ попытка сравнени€ строк с помощью оператора У==Ф. Ќапример, результатом выполнени€ следующего фрагмента

String s1="—трока типа String";

String s2="—трока";

s2+=" типа String";

if(s1==s2)

System.out.println("s1 равно s2");

else

System.out.println("s1 не равно s2");

будет вывод в консольное окно строки Уs1 не равно s2Ф, так как объекты-строки имеют в пам€ти разные адреса. —равнение по содержанию дл€ строк выполн€ет оператор equals. ѕоэтому если бы вместо s1==s2 мы написали s1.equals(s2), то получили бы ответ Уs1 равно s2Ф.

”дивительным может показатьс€ факт, что результатом выполнени€ следующего фрагмента

String s1="—трока";

String s2="—трока";

if(s1==s2)

System.out.println("s1 равно s2");

else

System.out.println("s1 не равно s2");

будет вывод в консольное окно строки Уs1 равно s2Ф. ƒело в том, что оптимизирующий компил€тор Java анализирует имеющиес€ в коде программы литерные константы, и дл€ одинаковых по содержанию констант использует одни и те же объекты-строки.

 

¬ остальных случа€х то, что строковые переменные ссылочные, обычно никак не вли€ет на работу со строковыми переменными, и с ними можно действовать так, как если бы они содержали сами строки.

¬ классе String имеетс€ р€д методов. ѕеречислим важнейшие из них. ѕусть s1 и subS имеют тип String, charArray Ц массив символов char[], ch1 Ц переменна€ или значение типа char, а i, index1 и count (УсчЄт, количествоФ) Ц целочисленные переменные или значени€. “огда

String.valueOf(параметр) Ц возвращает строку типа String, €вл€ющуюс€ результатом преобразовани€ параметра в строку. ѕараметр может быть любого примитивного или объектного типа.

String.valueOf(charArray, index1,count) Ц функци€, аналогична€ предыдущей дл€ массива символов, но преобразуетс€ count символов начина€ с символа, имеющего индекс index1.

 

” объектов типа String также имеетс€ р€д методов. ѕеречислим важнейшие из них.

s1.charAt(i) Ц символ в строке s1, имеющий индекс i (индексаци€ начинаетс€ с нул€).

s1.endsWith(subS) Ц возвращает true в случае, когда строка s1 заканчиваетс€ последовательностью символов, содержащихс€ в строке subS.

s1.equals(subS) - возвращает true в случае, когда последовательностью символов, содержащихс€ в строке s1, совпадает с последовательностью символов, содержащихс€ в строке subS.

s1.equalsIgnoreCase(subS) Ц то же, но при сравнении строк игнорируютс€ различи€ в регистре символов (строчные и заглавные буквы не различаютс€).

s1.getBytes() Ц возвращает массив типа byte[], полученный в результате платформо-зависимого преобразовани€ символов строки в последовательность байт.

s1.getBytes(charset) Ц то же, но с указанием кодировки (charset). ¬ качестве строки charset могут быть использованы значени€ УISO-8859-1Ф (стандартный латинский алфавит в 8-битовой кодировке), УUTF-8Ф, УUTF-16Ф (символы UNICODE) и другие.

s1.indexOf(subS) Ц индекс позиции, где в строке s1 первый раз встретилась последовательность символов subS.

s1.indexOf(subS,i) Ц индекс позиции начина€ с i, где в строке s1 первый раз встретилась последовательность символов subS.

s1. lastIndexOf (subS) Ц индекс позиции, где в строке s1 последний раз встретилась последовательность символов subS.

s1. lastIndexOf (subS,i) Ц индекс позиции начина€ с i, где в строке s1 последний раз встретилась последовательность символов subS.

s1.length() Ц длина строки (число 16-битных символов UNICODE, содержащихс€ в строке). ƒлина пустой строки равна нулю.

s1.replaceFirst(oldSubS,newSubS) Ц возвращает строку на основе строки s1, в которой произведена замена первого вхождени€ символов строки oldSubS на символы строки newSubS.

s1.replaceAll(oldSubS,newSubS)Ц возвращает строку на основе строки s1, в которой произведена замена всех вхождений символов строки oldSubS на символы строки newSubS.

s1.split(separator) Ц возвращает массив строк String[], полученный разделением строки s1 на независимые строки по местам вхождени€ сепаратора, задаваемого строкой separator. ѕри этом символы, содержащиес€ в строке separator, в получившиес€ строки не вход€т. ѕустые строки из конца получившегос€ массива удал€ютс€.

s1.split(separator, i) Ц то же, но положительное i задаЄт максимальное допустимое число элементов массива. ¬ этом случае последним элементом массива становитс€ окончание строки s1, которое не было расщеплено на строки, вместе с вход€щими в это окончание символами сепараторов. ѕри i равном 0 ограничений нет, но пустые строки из конца получившегос€ массива удал€ютс€. ѕри i <0 ограничений нет, а пустые строки из конца получившегос€ массива не удал€ютс€.

s1.startsWith(subS) Ц возвращает true в случае, когда строка s1 начинаетс€ с символов строки subs.

s1.startsWith(subs, index1) Ц возвращает true в случае, когда символы строки s1 с позиции index1 начинаютс€ с символов строки subs.

s1.substring(index1) Ц возвращает строку с символами, скопированными из строки s1 начина€ с позиции index1.

s1.substring(index1,index2) Ц возвращает строку с символами, скопированными из строки s1 начина€ с позиции index1 и конча€ позицией index2.

s1.toCharArray() Ц возвращает массив символов, скопированных из строки s1.

s1.toLowerCase() Ц возвращает строку с символами, скопированными из строки s1, и преобразованными к нижнему регистру (строчным буквам). »меетс€ вариант метода, делающего такое преобразование с учЄтом конкретной кодировки (locale).

s1.toUpperCase() - возвращает строку с символами, скопированными из строки s1, и преобразованными к верхнему регистру (заглавным буквам). »меетс€ вариант метода, делающего такое преобразование с учЄтом конкретной кодировки (locale).

s1.trim() Ц возвращает копию строки s1, из которой убраны ведущие и завершающие пробелы.

¬ классе Object имеетс€ метод toString(), обеспечивающий строковое представление объекта.  онечно, оно не может отражать все особенности объекта, а €вл€етс€ представлением Упо мере возможностейФ. ¬ самом классе Object оно обеспечивает возврат методом полного имени класса (квалифицированное именем пакета), затем идЄт символ У@Ф, после которого следует число Ц хэш-код объекта (число, однозначно характеризующее данный объект во врем€ сеанса работы) в шестнадцатеричном представлении. ѕоэтому во всех классах-наследниках, где этот метод не переопределЄн, он возвращает такую же конструкцию. ¬о многих стандартных классах этот метод переопределЄн. Ќапример, дл€ числовых классов метод toString() обеспечивает вывод строкового представлени€ соответствующего числового значени€. ƒл€ строковых объектов - возвращает саму строку, а дл€ символьных (тип Char) - символ.

ѕри использовании операций У+Ф и У+=Ф с операндами, один из которых €вл€етс€ строковым, а другой нет, метод toString() вызываетс€ автоматически дл€ нестрокового операнда. ¬ результате получаетс€ сложение (конкатенаци€) двух строк. ѕри таких действи€х следует быть очень внимательными, так как результат сложени€ более чем двух слагаемых может оказатьс€ сильно отличающимс€ от ожидаемого. Ќапример,

String s=1+2+3;

даст вполне ожидаемое значение s==Ф6Ф. ј вот присваивание

String s=Ф—умма =Ф+1+2+3;

даст не очень пон€тное начинающим программистам значение Ф —умма =123Ф. ƒело в том, что в первом случае сначала выполн€ютс€ арифметические сложени€, а затем результат преобразуетс€ в строку и присваиваетс€ левой части. ј во втором сначала производитс€ сложение Ф—умма =Ф+1. ѕервый операнд строковый, а второй Ц числовой. ѕоэтому дл€ второго операнда вызываетс€ метод toString(), и складываютс€ две строки. –езультатом будет строка Ф—умма =1Ф. «атем складываетс€ строка Ф—умма =1Ф и число 2. ќп€ть дл€ второго операнда вызываетс€ метод toString(), и складываютс€ две строки. –езультатом будет строка Ф—умма =12Ф. —овершенно так же выполн€етс€ сложение строки Ф—умма =12Ф и числа 3.

≈щЄ более странный результат получитс€ при присваивании

String s=1+2+Ф не равно Ф+1+2;

—леду€ изложенной выше логике мы получаем, что результатом будет строка

У3 не равно 12Ф.

¬ыше были приведены простейшие примеры, и дл€ них всЄ достаточно очевидно. ≈сли же в такого рода выражени€х используютс€ числовые и строковые функции, да ещЄ с оператором У?: Ф, результат может оказатьс€ совершенно непредсказуемым.

 роме указанных выше имеетс€ р€д строковых операторов, заданных в оболочечных числовых классах. Ќапример, мы уже хорошо знаем методы преобразовани€ строковых представлений чисел в числовые значени€

Byte.parseByte(строка)

Short.parseShort(строка)

Integer.parseInt(строка)

Long.parseLong(строка)

Float.parseFloat(строка)

Double.parseDouble(строка)

и метод valueOf(строка), преобразующий строковые представлени€ чисел в числовые объекты Ц экземпл€ры оболочечных классов Byte, Short, Character, Integer, Long, Float, Double. Ќапример,

Byte.valueOf(строка), и т.п.

 роме того, имеютс€ методы классов Integer и Long дл€ преобразовани€ чисел в двоичное и шестнадцатеричное строковое представление:

Integer.toBinaryString(число)

Integer.toHexString(число)

Long.toBinaryString(число)

Long.toHexString(число)

»меетс€ возможность обратного преобразовани€ Ц из строки в объект соответствующего класса (Byte, Short, Integer, Long) с помощью метода decode:

Byte.decode(строка), и т.п.

“акже полезны методы дл€ анализа отдельных символов:

Character.isDigit(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ цифрой.

Character.isLetter(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ буквой.

Character.isLetterOrDigit(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ буквой или цифрой.

Character.isLowerCase(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ символом в нижнем регистре.

Character.isUpperCase(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ символом в верхнем регистре.

Character.isWhitespace(символ) Ц булевска€ функци€, провер€юща€, €вл€етс€ ли символ Упробелом в широком смыслеФ Ц пробелом, символом табул€ции, перехода на новую строку и т.д.

ƒл€ того чтобы сделать работу с многочисленными присваивани€ми более эффективной, используютс€ классы StringBuffer и StringBuilder. ќни особенно удобны в тех случа€х, когда требуетс€ проводить изменени€ внутри одной и той же строки (убирать или вставл€ть символы, мен€ть их местами, замен€ть одни на другие). »зменение значений переменных этого класса не приводит к созданию мусора, но несколько медленнее, чем при работе с переменными типа String.  ласс StringBuffer рекомендуетс€ использовать в тех случа€х, когда используютс€ потоки (threads) Ц он, в отличие от классов String и StringBuilder, обеспечивает синхронизацию строк.  ласс StringBuilder, введЄнный начина€ с JDK 1.5, полностью ему подобен, но синхронизации не поддерживает. «ато обеспечивает большую скорость работы со строками (что обычно бывает важно только в лексических анализаторах).

  сожалению, совместимости по присваиванию между переменными этих классов нет, как нет и возможности преобразовани€ этих типов. Ќо в классах StringBuffer и StringBuilder имеетс€ метод sb.append(s), позвол€ющий добавл€ть в конец УбуферизуемойФ строки sb обычную строку s. “акже имеетс€ метод sb.insert(index,s), позвол€ющий вставл€ть начина€ с места символа, имеющего индекс index, строку s.

ѕример:

StringBuffer sb=new StringBuffer();

sb.append("типа StringBuffer");

sb.insert(0,"—трока ");

System.out.println(sb);

 роме строк в методы append и insert можно подставл€ть

Ѕуферизуемые и обычные строки можно сравнивать на совпадение содержани€:

s1.contentEquals(sb) Ц булевска€ функци€, возвращающа€ true в случае, когда строка s1 содержит такую же последовательность символов, как и строка sb.

–абота с графикой

¬ывод графики осуществл€етс€ с помощью объектов типа java.awt.Graphics. ƒл€ них определЄн р€д методов, описанных в следующей далее таблице.

ѕодразумеваетс€, что w- ширина области или фигуры, h- высота; x,y- координаты левого верхнего угла области. ƒл€ фигуры x,y- координаты левого верхнего угла пр€моугольника, в который вписана фигура.

 

ѕараметры вывода графики
Color getColor() ”знать текущий цвет рисовани€.
setColor(Color c) «адать текущий цвет рисовани€.
Font getFont() ”знать текущий фонт дл€ вывода текстовой информации.
setFont(Font f) ”становить текущий фонт дл€ вывода текстовой информации. Ёкземпл€р фонта создаЄтс€ с помощью конструктора Font(У и숑онта Ф, стиль‘онта, размер‘онта)
FontMetrics getFontMetrics() ”знать параметры текущего фонта
FontMetrics getFontMetrics(Font f) ”знать параметры дл€ произвольного фонта f
setXORMode(Color c1)   ”становка режима рисовани€ XOR (Уисключающее илиФ) дл€ цвета c1. ѕри этом вывод точки цвета color даЄт цвет, равный побитовому значению color ^ c1 (то есть color XOR c1) дл€ числовой RGB-кодировки цвета. ѕовторный вывод графического изображени€ на то же место приводит к восстановлению первоначального изображени€ в области вывода.
setPaintMode()   ¬озврат в обычный режим из режима рисовани€ XOR.
translate(x0,y0) —двиг начала координат графического контекста в точку x0,y0. ¬се координаты, указанные при выводе графических примитивов, отсчитываютс€ относительно этого начала координат.
–исование контурных фигур
drawLine(x1,y1,x2,y2) ¬ывод линии из точки с координатами x1,y1 в точку x2,y2
   
drawRect(x,y,w,h) ¬ывод пр€моугольника.
drawRoundRect(x,y,w,h,arcWidth,arcHeight)   ¬ывод скруглЄнного пр€моугольника.
draw3DRect(x,y,w,h,isRaised) ¬ывод УобъЄмногоФ пр€моугольника. ≈сли переменна€ isRaised ==true, он УвыпуклыйФ (raised), иначе - УвдавленныйФ.
drawPolygon(Polygon p); drawPolygon(int[] xPoints, int[] yPoints, int nPoints) ¬ывод многоугольника по массиву точек, nPoints Ц число точек.
drawPolyline(int[] xPoints,int[] yPoints, int nPoints) ¬ывод незамкнутой ломаной линии по массиву точек, nPoints Ц число точек.
drawOval(x,y,w,h) ¬ывод эллипса.
drawArc(x,y,w,h,startAngle,arcAngle) ¬ывод дуги эллипса. Ќачальный угол startAngle и угол, задающий угловой размер дуги arcAngle, задаютс€ в градусах.
drawImage(Image img,int x,int y, ImageObserver observer) и другие перегруженные варианты метода ¬ывод изображени€.
–исование заполненных фигур
clearRect(x,y,w,h) ќчистка пр€моугольника (заполнение текущим цветом)
fillRect(x,y,w,h) ¬ывод пр€моугольника, заполненного текущим цветом.
fillRoundRect(x,y,w,h,arcWidth,arcHeight) ¬ывод скруглЄнного пр€моугольника, заполненного текущим цветом.
fill3DRect(x,y,w,h, isRaised) ¬ывод УобъЄмногоФ пр€моугольника, заполненного текущим цветом. ≈сли переменна€ isRaised ==true, он УвыпуклыйФ (raised), иначе - УвдавленныйФ.
fillPolygon(Polygon p) fillPolygon(int[] xPoints, int[] yPoints, int nPoints) ¬ывод многоугольника, заполненного текущим цветом.
fillOval(x,y,w,h) ¬ывод эллипса, заполненного текущим цветом.
fillArc(x,y,w,h,startAngle,arcAngle) ¬ывод сектора эллипса, заполненной текущим цветом. «аполн€етс€ сектор, ограниченный отрезками из центра эллипса в концы дуги, и самой дугой.
copyArea(x,y,w,h,dx,dy)  опирование области на новое место, сдвинутое от старого на dx,dy
¬ывод текстовой информации
drawString(s,x,y) ¬ывод строки s
drawChars(char[] data,int offset,int length,int x,int y) ¬ывод массива символов
drawBytes(byte[] data,int offset,int length,int x,int y) ¬ывод символов, представленных как последовательность байт
”правление областью вывода
setClip(x,y,w,h) setClip(Shape clip) ”становка новых границ области вывода. ¬не этой области при выводе графических примитивов они усекаютс€ (не вывод€тс€).
clipRect(x,y,w,h) —ужение области вывода.
Rectangle getClipBounds() Rectangle getClipBounds(Rectangle r) ¬озвращает параметры пр€моугольника, в который вписана область вывода.
Graphics create() g1=g.create()- создание копии графического объекта g
dispose() ƒеструктор - уничтожение графического объекта с одновременным высвобождением ресурсов (без ожидани€, когда это сделает сборщик мусора).

 

ѕример метода, работающего с графикой.

 

java.awt.Graphics g,g1;

 

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

java.awt.Graphics g,g1;

g=jPanel1.getGraphics();

int x1=20,x2=120,y1=20,y2=120;

int x3=20,y3=20,w3=60,h3=80;

int x4=30,y4=60,w4=30,h4=40;

int x0=10,y0=10,w0=10,h0=10;

int w1=80,h1=120;

g.setClip(0,0,60,80);//границы области вывода

g.drawLine(x1,y1,x2,y2);//лини€

g.drawOval(x3,y3,w3,h3);//эллипс

g.clipRect(x4,y4,20,20);//сужение области вывода

g.clearRect(x4,y4,w4,h4);//очистка пр€моугольника

g.setClip(0,0,200,280); //новые границы области вывода

g.copyArea(x1,y1,w1,h1,60,0);

g.draw3DRect(10,20,w1,h1,false);

g.drawPolygon(new java.awt.Polygon(new int[]{10,10,20,40},

new int[]{10,20,30,60},4));

}

¬ случае попытки такого использовани€ возникает проблема: при перерисовке графического контекста всЄ выведенное изображение исчезает. ј перерисовка вызываетс€ автоматически при изменении размера окна приложени€, а также его восстановлении после минимизации или перекрыти€ другим окном.

ƒл€ того, чтобы результаты вывода не пропадали, в классе приложени€ требуетс€ переопределить метод paint, вызываемый при отрисовке.  од этого метода может выгл€деть так:

 

 

public void paint(java.awt.Graphics g){

super.paint(g);

g=jPanel1.getGraphics();

... Ц команды графического вывода

}

ѕравда, при изменении размера окна приложени€ этот код не сработает, и дл€ панели надо будет назначить обработчик

private void jPanel1ComponentResized (java.awt.event.ComponentEvent evt) {

... Ц команды графического вывода

}

“о, что дл€ изменени€ размера компонента следует писать отдельный обработчик, вполне разумно Ц ведь при восстановлении окна требуетс€ только воссоздать изображение прежнего размера. ј при изменении размера может потребоватьс€ масштабирование выводимых элементов. ѕоэтому алгоритмы вывода графики в этих случа€х заметно отличаютс€.

¬ случае отрисовки из обработчика какого-либо событи€ изменени€ графического контекста не происходит до окончани€ обработчика. Ёто принципиальна€ особенность работы по идеологии обработчиков событий Ц пока не кончитс€ один обработчик, следующий не начинаетс€. ƒл€ досрочной отрисовки непосредственно во врем€ выполнени€ обработчика событи€ служит вызов метода update(Graphics g). ѕример:

for(int i=0;i<=100;i++){

FiguresUtil.moveFigureBy(figure,dx,dy);

update(g);

};

ѕри работе со статическими изображени€ми изложенных алгоритмов вполне достаточно. ќднако при использовании движущихс€ элементов во многих графических системах возникает мельтешение, св€занное с посто€нными перерисовками. ¬ этих случа€х обычно примен€ют идеологию двойной буферизации: отрисовку элементов по невидимому буферному изображению, а затем показ этого изображени€ в качестве видимого. ј то изображение, которое было видимо, при этом становитс€ невидимым буфером.

 

»сключительные ситуации





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2017-02-28; ћы поможем в написании ваших работ!; просмотров: 815 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

≈сли вы думаете, что на что-то способны, вы правы; если думаете, что у вас ничего не получитс€ - вы тоже правы. © √енри ‘орд
==> читать все изречени€...

1950 - | 1933 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.147 с.