String常用API

一 String

1.1 String是什么?

 String是 java.lang.String , 使用不需要导包     

1.2 String 特性   

   1 String是字符串类,是引用类型,底层是char数组,所以String的特性几乎和数组一致
   2 字符串一旦创建,该字符串对象不能更改
   3 为了提高字符串的访问效率,java虚拟机使用了一种缓存技术,可以对字符串操作更加简单方便,更加高效(字符串常量池)
   4 字符串会被保存在静态区中的常量池中,可以复用性增强
         当我们用到一个重复的字符串的时候,会去常量池中进行检索,如果有该字符串,则直接指向,如果没有就创建

5         使用String不推荐进行频繁的字符串拼接操作因为字符串一旦创建不可改变,只要拼接,就会创建新的字符串对象;浪费空间,效率还低,就等于是使用定长数组频繁做添加操作一样

public class String_05 {
	public static void main(String[] args) {
		String s1 = "ab";
		String a = "a";
		String b = "b";
		String s2 = a+b;
		// false
		System.out.println(s1 == s2);//false
		
		String s3 = "a"+"b";
		// true
		System.out.println(s3 == s1);//true
		
		String s4 = new String("ab");
		// false
		System.out.println(s1 == s4);//false
	}
}

eg:

String str="a"+"b";//字符串常量池创建a,b,ab三个对象

String str = "a"+new String("b");//字符串常量区创建a,b,堆中创建new String("b"),共三个对象

1.3 String 基本使用

public class String_01 {
	public static void main(String[] args) {
		// 创建一个字符串对象,直接指向常量池
		String string = "ab";
		// string 是main方法中的局部变量, = 赋值只是更改了这个变量的值,并没有更改ab这个字符串对象
		string = "cd";

		// 只会创建一个对象 , 就是abc 保存在常量池中
		String s1 = "abc";
		String s2 = "abc";
		// true
		System.out.println(s1 == s2);//true
		System.out.println(s1.equals(s2));//true
		
		// 创建了3个对象,堆内存两个,常量池1个
		String s3 = new String("abc");
		String s4 = new String("abc");
		System.out.println(s3 == s4);//false
		System.out.println(s3.equals(s4));//true
	}
}

1.4 构造方法

构造方法常见对象的几种方式:

1 直接构造

String s1 = "xxx";

2 普通构造

String s2 = new String("xxx");

3 字节数组

字节数组转换成字符,通过ASCII码转换 0的ASCII码为 48;a的ASCII码为: 97; A的ASCII码为: 65

byte[] bytes = {97,98,99,100};
		String s3 = new String(bytes);
		// abcd
		System.out.println(s3);
	
		//  字节数组 截取一部分
		// 下标0开始, 第二个参数  起始下标(包含) , 第三个参数 是个数
		String s4 = new String(bytes,1,3);
		// bcd
		System.out.println(s4);

4 字符数组

//  字符数组
		char[] chars = {'q','w','e','r','d','f'};
		String s5 = new String(chars);
		System.out.println(s5);//qwerdf
		// 6 字符数组 截取一部分
		String s6 = new String(chars,2,3) ;
		System.out.println(s6);//erd

1.5 常用方法

1.5.1 char(返回值类型) charAt(int index)(参数列表)

功能:获取字符串中指定下标的字符

例子:

	String s1 = "qwer";
    char c = s1.charAt(2);
		System.out.println(c);//e

1.5.2 boolean startsWith(String prefix)

功能:判断该字符串是否以指定字符串开头

System.out.println("Hello.java".startsWith("Hello"));//true
System.out.println("Hello.java2".startsWith(".java"));//false

1.5.3  boolean endsWith(String prefix)

功能:判断该字符串是否以指定字符串结尾

System.out.println("Hello.java2".endsWith(".java"));//false
System.out.println("Hello.java".endsWith("a"));//true

1.5.4 boolean equals(Object obj)

功能:判断字符串是否相等

System.out.println("aAfXCs".equals("aaFxcs"));/false

        boolean equalsIgnoreCase(String str)

功能:不区分大小写判断相等

System.out.println("aAfXCs".equalsIgnoreCase("aaFxcs"));//true

1.5.5 byte[] getBytes()

功能: 把字符串转换为字节数组

byte[] bytes = "abcd".getBytes();
		for (byte b : bytes) {
			System.out.println(b);//97 98 99 100
		}

1.5.6 char[] toCharArray()

功能: 把字符串转换为字符数组

char[] chars = "abcd".toCharArray();
		for (char d : chars) {
			System.out.println(d);//a b c d
		}

1.5.7 int indexOf(String str)

功能: 获取指定字符串在该字符串中第一次出现的索引,找不到就返回-1

int index = "abfacdefabc".indexOf("fa");
		System.out.println(index);//2

1.5.8   int lastIndexOf(String str) 

功能:获取指定字符串在该字符串中最后一次出现的索引,找不到就返回-1

int index =  "abfacdefabc".lastIndexOf("fa");
        System.out.println(index);//7

1.5.9 int length()

功能:返回字符串长度

System.out.println("xzjhcaskd".length());//9

1.5.10  String[] split(String regex)    

功能: 分割字符串,支持正则表达式   

String[] strs = "2008,08,09".split(",");//以逗号分割
		for (String string : strs) {
			System.out.println(string);// 2008 08 09
		}

1.5.11 String replaceAll(String regex,String replacement)

功能: 替换字符串中的内容为指定文字,支持正则表达式

String string = "ahsdhqwajsbasda";
		// 替换为空字符串 就等于把a删掉
		String newString = string.replace("a", "A");//把字符串中的a替换成A
		System.out.println(newString);//AhsdhqwAjsbAsdA

1.5.12 String substring(int beginIndex , int endIndex)

功能: 截取字符串,包含开始 "不包含" 结束

String s2 = "abcdef";
		System.out.println(s2.substring(2,4));//cd

        substring(int beginIndex) 

功能: 从指定下标开始(包含),到末尾

String s2 = "abcdef";
System.out.println(s2.substring(2));	// cdef   从下标2开始到结束

1.5.13 String toUpperCase()

功能: 转换为大写

String ss="abc".toUpperCase();
		System.out.println(ss);//ABC

1.5.14 String toLowerCase()

功能: 转换为小写

String ss1="DFG".toLowerCase();
		System.out.println(ss1);//dfg

1.5.15 3 String trim()

功能:去除两边空格

System.out.println("                   a            b                     ");                   //        a            b                     
		System.out.println("                   a            b                     ".trim());//a            b

1.6 StringBuilder和StringBuffer

1.6.1 概念

是一个可变的字符串缓冲区,底层也是数组,只不过该数组会进行自动扩容
          作用:适合做字符串拼接操作

1.6.2 原理
           1   预先在内存中创建一个空间,用来保存字符(字符数组)
           2   如果预留空间不够了,会进行自动扩容,用来容纳更多的字符
           3   默认长度为16,扩大容量为(原长度+1)*2  :  16 -> 34 -> 70

1.6.3 StringBuffer和StringBuilder的区别

StringBuffer :

StringBuffer底层实现与StringBuffer最大的区别在于方法使用了synchronized同步修饰

synchronized是一个同步锁,在Java中每个类对象都可以作为锁,synchronized同步锁使用的关键在于对谁加锁~

synchronized修饰普通方法synchronized methodA(){//操作},是对当前对象加锁~

synchronized修饰静态方法static synchronized void methodB(){//操作},是对当前类的class对象(所有此类的对象)加锁~

synchronized修饰代码块methodC(obj){synchronized(obj) {//操作}},是对括号中的对象加锁 ~

因此,使用synchronized修饰方法时,会对方法中的相关对象进行加锁,如果某个线程抢先调用了该方法,那么将独占相关对象的锁,其他线程如果此时调用到该方法的相关对象时,会被阻塞~


StringBuilder :

底层继承了AbstractStringBuilder,实现了SerializableCharSequence接口

底层基于char字符数组,可以修改操作对象,非线程安全

实例化new StringBuffer()时默认字节数组初始化容量大小为16,当容量大于当前字节数组容量时会自动进行1倍扩容再加2,每次扩容都会开辟新空间,并且进行新老字符数组的复制

底层继承了AbstractStringBuilder,实现了SerializableCharSequence接口

底层基于char字符数组,可以修改操作对象,非线程安全

实例化new StringBuffer()时默认字节数组初始化容量大小为16,当容量大于当前字节数组容量时会自动进行1倍扩容再加2,每次扩容都会开辟新空间,并且进行新老字符数组的复制

public class StringBuilder_StringBuffer {
	public static void main(String[] args) throws  Exception {
		// 创建对象
		StringBuilder sb = new StringBuilder();
		// 添加(尾部添加)
		sb.append("a");
		sb.append("b");
		// 插入到指定位置
		sb.insert(1, "c");
		// 已添加元素个数
		System.out.println(sb.length());
		// 返回当前容量,默认是16
		System.out.println(sb.capacity());
		// 反转
		sb.reverse();
		// 调用 toString 方法 可以转换为字符串
		String str = sb.toString();
		System.out.println(str);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值