String
特点
- 用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改
String str="hello";
- 存储在堆中的字符串常量池
- 已经定义过的字符串,再次定义时直接使用已有的
- 字符串String类重写了**boolean equals(object obj)**方法,重写后的功能是比较两个字符串的内容是否一致
内存情况
- 先去堆中的字符串常量池找
“hello”
,没有找到则在字符串常量池中创建一个“hello”
- 这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象,
String str3=new String("hello");
class Demo9{public static void main(String[] args){
//字符串:用双引号引起来的一串字符,字符串不变,它们的值在创建后不能被更改
//先去堆中的字符串常量池找"hello",没有找到则在字符串常量池中创建一个"hello"String str1="he11o";
//先去堆中的字符串常量池找"hello",找到了,直接使用己有的"hello"String str2= "hello";sop(str1==str2); //true
//这行代码中存在几个对象?一个是new创建的对象,一个是hello这个字符串对象String str3=new String("hello"); sop(str1==str3);//false
//字符串String类重写了boolean equals(object obj)方法,重写后的功能是比较两个字符串的内容是否一致boolean boo = str1.equals(str3);sop(boo);//true}//判断用户名密码是否正确public static boolean check(String username,String password){if(username!=null && username!="" && password!=null && password!=""){if("admin".equels(username)&&"123".equals(password))return true;}}//封装意识public static void sop(object obj){System.out.println(obj);}
}
字符串方法
获取
-
获取字符串的长度
int length()int len = "owiueriouerioeur".length();
-
获取某一个位置上的字符
char charAt(int index)char ch = "hello world".charAt(6);
-
获取字符在字符串中的位置
如果要找的字符或者字符串不存在,返回值为**-1**-
返回字符在字符串中第一次出现的位置
int indexOf(char ch)int index = "hello world".indexOf('l');
-
第二个参数用于指定开始找的位置
int indexOf(int ch, int fromlndex)int index = "hello world".indexOf('l',5);
-
获取一个字符串在字符串中出现的位置
int indexOf(String str)int index = "hello world llo".indexOf("llo");
-
第二个参数用于指定开始找的位置
int indexOf(String str, int fromIndex)int index = "hello world llo".indexOf("llo",5);
-
最后一次出现的位置
int lastlndexOf(char ch)int index = "hello world".lastIndexOf('k');
-
验证邮箱是否合法,包含@和. ,@在.的前边
public static void main(String[] args) {boolean boo = checkEmail("xiaoer163.com");sop(boo); } public static boolean checkEmail(String email){ if(email!=null && email!="")if(email.indexOf('@' )==-1)return false;else if(email.indexOf(' . ' )==-1)return false;else if(email.indexOf( '@' )>email.indexOf('.'))return false;elsereturn true; return false; }
判断
-
判断是否包含一个字符串
boolean contains (CharSequence s) CharSequenceboolean boo = "hello world".contains("wor");
-
判断两个字符串的内容是否相同 (区分大小写)
boolean equals(Object anObject)boo = "hehe".equals("haha");
-
忽略大小写,判断两个字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString)boo = "HEHE".equalsIgnoreCase("hehe");
-
判断是否以某字符串开头
boolean startsWith(String prefix)boo = "javamysql".startsWith("java");
-
判断是否以某字符串结尾
boolean endsWith(String suffix)boo = "dog.jpg".endsWith("jpg");
-
判断字符串是否为空
为空返回true,不为空返回false
只要双引号中有字符,就不是空字符串
boolean isEmpty()
boo = " ".isEmpty();
转换
字符数组和字符串的转换
-
使用构造方法
String(char[] value)char[] ch={'h','e','l','l','o'}; String str1=new String(ch);//hello
String(char[] value,int offset, int count) 字符数组,开始下标,个数
String str2=new String(ch,2,3);//llo
-
使用静态方法
static String copyValueOf(char[] data)String str3 = String.copyValueOf(ch);//hello
static String copyValueOf(char[] data, int offset, int count)
String str4=String.copyValueOf(ch,2,3);//llo
-
将字符串转成字符数组
char[] toCharArray()char[] arr = "hello".toCharArray();//[h, e, l, l, o]
-
将字节数组转成字符串-----解码
String(byte[] bytes)String(byte[] bytes, int offset, int length)
byte[] b={65,66,67,68,69}; String str5 = new String(b);//使用平台默认的编码进行解码 sop(str5);//ABCDE String str6 = new String(b,2,3); sop(str6);//CDE
使用指定的编码将字节数组转换成字符串:
String(byte[] bytes, String charsetName)byte[] bb={-28, -67, -96, -27, -91, -67}; String str6=new String(bb,"UTF-8");//使用UTF-8进行解码 sop(str);//你好
-
将字符串转成字节数组-----编码
byte[] getBytes()byte[] c = "你好".getBytes(); //——使用平台默认的编码进行编码 sop(Arrays.toString(c));//[-60, -29, -70, -61] byte[] cc = "你好".getBytes("UTF-8"); //——使用UTF-8进行编码 sop(Arrays.toString(cc));//[-28, -67, -96, -27, -91, -67]
-
将基本数据类型转换成字符串
静态方法String.valueOf()String ss=String.valueOf(88);//88
替换
生成新的字符串,原字符串并没有被修改,字符串是不能被修改的
String replace(char oldChar, char newChar )
String replace(CharSequence target, CharSequence replacement)
String str = "hello world".replace('o','k');//hellk wkrld
String ss = "hello world".replace("wor","wc");//hello wcld
子串
String substring(int beginIndex )
String substring(int beginIndex, int endIndex)
包含起始位置,不包含结束位置,到结束位置的前一位
String s="I love java";
String s1=s.substring(7);//java
String s2=s.substring(2,6);//love
转换
大小写转换
String toLowerCase()
String toUpperCase( )
String t = "abcdefg".toUpperCase();//ABCDEFG
String tt = "LMN".toLowerCase();//lmn
去除空格
将字符串两端的空格去掉
String trim()
String m=" iweurie owieuroiwer ".trim();
sop("["+m+"]");//[iweurie owieuroiwer]
模拟trim方法,将字符串两端的空格去掉String trim()
class Demo3{public static void main(String[] args){String s=trim(" hello ");sop("["+s+"]");}public static String trim(String str){int start=0,end=str.length()-1;//从左边找到第一个不是空格的字符while (str.charAt(start)==' ' && start<=end)start++;//从右边找到第一个不是空格的字符while (str.charAt(end)==' ' && end>=0)end--;return str.substring(start,end+1);}public static void sop(Object obj){……} }
比较
-
按字典顺序比较两个字符串;
-
左边的大于右边的返回大于0的数,左边的小于右边的返回小于0的数,左边的等于右边的返回0;
-
对应的字符一一对比(第一个和第一个比,第二个和第二个比,……),当出现第一对互不相同的字符时,哪个字符大哪个字符串就大
int compareTo(String anotherString )
int compareToIgnoreCase(String str) (不区分大小写,比较大小)
int x = "aecd".compareTo("aaa");//4
x = "abc".compareToIgnoreCase("ABC");//0
拼接
String concat(String str)
String y = "hello".concat("world");//helloworld
切割
String[] split(String str)
String str=",wang,ji,guo,chen,sun";
String[] arr = str.split(",");
for(String ss:arr)sop(ss);
静态方法
将若干个字符串拼接到一起,在拼接的时候,元素与元素之间以指定的分隔符进行分隔。
String join ( CharSequence delimiter, CharSequence… elements )
String ss = String.join(",","ding","wang","yan");
以指定的格式,进行字符串的格式化
String format ( String format, object… args )
ss = String.format("%8s%5d%.1f%8c","hello",66,88.88,'k');
//1234567812345123412345678
// hello 6688.9 k
ss = String.format("%8s %5d %.1f %8c","hello",66,88.88,'k');
//12345678_12345_1234_12345678
// hello 66 88.9 k
常见占位符
%s : 替代字符串 → %ns : 凑够n位字符串,如果不够,补空格
%d : 整型数字占位符 → %nd : 凑够n位,如果不够,补空格
%f : 浮点型数字占位符 → %.hf : 保留小数点后面指定位的数字
%c : 字符型占位符
字符串缓冲区
-
StringBuffer
可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
线程安全的,可以安全地被多个线程使用 -
StringBuilder
不能安全使用多线程
存储
-
StringBuffer append(boolean b)
- 默认添加在容器的末尾
- 返回原容器
StringBuffer stringBuffer=new StringBuffer(); //字符串缓冲区 StringBuffer sb1 = stringBuffer.append(false);//返回原容器 StringBuffer sb2 = stringBuffer.append(666); sop(stringBuffer==sb1); sop(stringBuffer==sb2); stringBuffer.append(false).append(666).append("hello");//默认添加在容器的末尾 sop(stringBuffer);//StringBuffer重写了toString方法,返回的是容器中的字符串
-
StringBuffer insert(int offset, boolean b)
- 在指定位置添加数据
stringBuffer.insert(8,"ok");//在指定位置添加数据
删除
StringBuffer delete(int start, int end)
不包括结束下标上的字符,到结束下标的前一位
StringBuffer deleteCharAt(int index)
stringBuffer.delete(8,10);
stringBuffer.deleteCharAt(7);
修改
StringBuffer replace(int start, int end, String str)
不包括结束下标上的字符,到结束下标的前一位
void setCharAt(int index, char ch)
stringBuffer.replace(5,7,"88");
stringBuffer.setCharAt(6,'6');
获取
char charAt(int index)
int indexOf(String str)
int indexOf(String str, int fromIndex)
int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex)
返回最后一次出现的指定子字符串在此字符串中的索引。
int length()
返回长度(字符数)。
反转
StringBuffer reverse()
练习:使用StringBuilder打印一个矩形
public static void show(int rows,int cols) {StringBuilder stringBuilder=new StringBuilder();for(int i=1;i<=rows;i++){for(int j=1;j<=cols;j++){stringBuilder.append("*");}stringBuilder.append("\r\n");}sop(stringBuilder); }