【java基础】字符串(String)及其常用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]);


}

猜你喜欢

转载自blog.csdn.net/wdy00000/article/details/121700031
今日推荐