文章目录
- 1.String的概念和底层实现
- StringBuilder和StringBuffer
- StringBuilder和StringBuffer和String拼接速度比较
- 2.String初始化
- 3.字符串常量池
- 4.常用api接口
- 5.案例
- (1)异构判断
- (2)统计字符串中的字符出现次数
- (3)回文判断
- (4)利用api解析网址目标内容
1.String的概念和底层实现
- String是多个字符连接起来组合字符序列。String底层是一个字符数组,且不可变(final)!
StringBuilder和StringBuffer
- 当需要处理大量字符串,由于String类的不可变,运算会不断产生新的未使用对象既耗时又浪费空间。
这时可以用StringBuilder避免这些问题。 - StringBuilder和StringBuffer类都具有可变性,StringBuilder和StringBuffer 添加字符, 通过调用append方法,扩展长度且不产生未使用对象。
- StringBuilder相较于StringBuffer有速度优势。
- StringBuilder的方法不是线程安全的(不能同步访问的),在要求线程安全的情况下必须用StringBuffer。
- 扩容方法的底层实现
StringBuilder和StringBuffer和String拼接速度比较
public static void main(String[] args) {
String str="hello";
long s1=System.currentTimeMillis();
for(int i=0;i<10000;i++) {
str+=" java";
}
long s2=System.currentTimeMillis();
System.out.println("String拼接"+(s2-s1)+"毫秒");
StringBuilder sb=new StringBuilder(" java");
long s3=System.currentTimeMillis();
for(int i=0;i<1000000;i++) {
sb.append(" java");//StringBuilder和StringBuffer 添加字符, 就调用append方法
}
long s4=System.currentTimeMillis();
System.out.println("StringBuilder拼接"+(s4-s3)+"毫秒");
StringBuffer sf=new StringBuffer(" java");
long s5=System.currentTimeMillis();
for(int i=0;i<1000000;i++) {
sf.append(" java");
}
long s6=System.currentTimeMillis();
System.out.println("StringBuffer拼接"+(s6-s5)+"毫秒");
}
2.String初始化
String str="hello";
String str=new String("hello");
3.字符串常量池
public static void main(String[] args) {
String s1 =new String("Hello");
String s2 =new String("Hello");//new所创建的字符串对象,会创建"Hello"字符串对象,不会放入字符常量池中
String s3 ="Hello";//常量池中没有 >>在常量池中创建hello>>s3引用常量池中的hello
String s4 ="Hello";//常量池中有hello>>s4引用常量池中的hello
System.out.println(s1==s2);//结果为false ==运算符比较两个引用是否指向同一字符串
System.out.println(s2==s3);//结果为false
System.out.println(s3==s4);//结果为true s3将hello字符串放入常量池
}
4.常用api接口
```java
public class StringApi {
public static void main(String[] args) {
String str=" hello java ";
String str1="HELLO java java";
String str3=" java";
/* 显示字符串长度 */
System.out.println("字符串长度:"+str.length());
/* 去除字符串前后的空格字符 */
System.out.println("去掉前后空格字符:"+str.trim());
str=str.trim();//指向新字符串
System.out.println("字符串新长度:"+str.length());
/*拼接字符串的3种方式 */
str=str.concat(" java");//方法一
//System.out.println("join-->"+String.join("", str,str3));//方法二 (String.join("连接内容",字符1,字符2,字符3...))
//str+=str3;//方法三
System.out.println(str);
/* 找出字符串指定位置字符 */
System.out.println("找出第5个字符:"+str.charAt(5));//第5个是空格
/* 将字符串转换为字符数组 */
char[] a=str.toCharArray();
System.out.println("转换为数组:"+Arrays.toString(a));
/* 将字符数组转换为字符串 */
System.out.println("转换为字符串"+str.valueOf(a));
/* 大小写转换 */
System.out.println("转换为小写:"+str.toLowerCase());
System.out.println("转换为大写:"+str.toUpperCase());
/* 判断两个字符串是否相等 */
System.out.println("不区分大小写是否相等:"+str.equalsIgnoreCase(str1));//不区分大小写
System.out.println("区分大小写是否相等:"+str.equals(str1));//区分大小写
/* 判断字符串是不是以某字符串开头 */
System.out.println("是否以'he'开头"+str.startsWith("he"));
System.out.println("是否以'a'"+str.endsWith("a"));
System.out.println("2、3位是否为'll'"+str.startsWith("ll", 2));//第2、3位置是ll吗?
/* 找字符串的位置 */
System.out.println("从前往后找java的位置:"+str.indexOf("java"));//不区分大小写
System.out.println("从后往前找java的位置:"+str.lastIndexOf("java"));//区分大小写
/*比较字符串中字符大小 a.compareTo(b) a>b显示为正数,a==b显示为0、a<b显示负数*/
String a1="123";
String a2="121";
String a3="131";
System.out.println("a1比a2:"+a1.compareTo(a2));//从0位开始对应依次比较 。0、1位相等。第2位a1大 则为a1大
System.out.println("a2比a3:"+a2.compareTo(a3));//第1位2小于3,a3>a2
/*判断是否存在指定字符串 */
System.out.println("str是否存在java:"+str.contains("java"));
/**
* 字符串从指定位置输出
*/
// String s1=str.substring(6);//从第六位开始输出
// System.out.println(s1);
// String s2 =str.substring(8,15);//[8,15)//8到14 位
// System.out.println(s2);
}
``
5.案例
(1)异构判断
public static void main(String[] args) {
/*
* 法一
*/
String a="hello";
String b="hello";
// int[] chs1=new int[26];
//
// int[] chs2=new int[26];
// for(int i=0;i<a.length();i++) {
// char ch1=a.charAt(i);
// chs1[ch1-'a']+=1;
// char ch2=b.charAt(i);
// chs2[ch2-'a']+=1;
// }
// System.out.println(Arrays.toString(chs1));
// System.out.println(Arrays.toString(chs2));
// System.out.println(Arrays.equals(chs1,chs2));
char[] chs1=a.toCharArray();//把字符串装换为数组
char[] chs2=b.toCharArray();
Arrays.sort(chs1);//对数组排序
Arrays.sort(chs2);
System.out.println(Arrays.toString(chs1));
System.out.println(Arrays.toString(chs2));
}
(2)统计字符串中的字符出现次数
/**
* 统计字符串中的字符出现次数
* 转换为数组 利用ASCII码和数组位置对应判断
* @author wdy
*
*/
public class String20 {
public static void main(String[] args) {
int[] chs=new int[127];
String str="abchadjak*DH9(&$BSDCvsd}}JSHJ";
for(int i=0;i<str.length();i++) {
char ch=str.charAt(i);//
chs[ch]+=1;// 把ch(字符)对应的ASCII码 。存到chs数组中对应的位置0-127位。出现一次则加一
}//str为小写字母字符串。则chs[ch-a] 共0-25 共26个长度
System.out.println(Arrays.toString(chs));
int val=0;//出现的次数
int pos=0;//字符的位置:a-97
for(int i=0;i<chs.length;i++) {
if(chs[i]>val) {
val=chs[i];
pos=i;
}
System.out.println((char)(i)+"出现"+chs[i]+"次");
}
System.out.println("出现次数最多的字符"+(char)pos);
}
}
(3)回文判断
/**
*回文判断
*api 反转 -reverse
*api 删除某一字符 -deleteCharAt
* @author wdy
*
*/
public class String19 {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
sb.append("上海自来水来自上海ab");
StringBuilder s=sb.delete(sb.length()-2, sb.length());
System.out.println(s);
String a=s.toString();
String b=s.reverse().toString();
System.out.println("结果"+a.compareTo(b));
}
}
(4)利用api解析网址目标内容
/**
* 利用api解析目标内容
* @author wdy
*
*/
public class String07 {
public static void main(String[] args) {
String url = "http://dyit:8990/pets?username=xxt33dw&password=12345";
// 解析:端口号8990 用户名:com 密码:123
String[] strs = new String[3];
int s1 = url.indexOf("username");
int s2 = url.indexOf("&password");
strs[2] = url.substring(s1 + "username=".length(), s2);
int s3 = url.lastIndexOf("=");
strs[1] = url.substring(s3 + 1);
int s4 = url.indexOf("dyit");
int s5 = url.indexOf("/pets");
strs[0] = url.substring(s4 + 5, s5);
System.out.println(Arrays.deepToString(strs));
}
}
//api方法:拆分;split
public static void main(String[] args) {
String url = "http://dyit:8990/pets?username=xxt33dw&password=12345";
String[] s=url.split("[?]");
for(String xs:s) {
System.out.println(xs);
}
String[] t =s[1].split("[&]");
for(String tx:t) {
System.out.println(tx);
}
System.out.println("用户名"+t[0].split("[=]")[1]);
System.out.println("密码"+t[1].split("[=]")[1]);
}