String类
- String对象用于保存字符串,也就是一组字符序列;
- 字符串常量对象使用双引号包括起来的字符序列
- 字符串的字符使用unicode字符编码,一个字符(不区分字母还是汉字)占用两个字节
- String常用的构造器:
- new String();
- new String(String original);
- new String(char[] a);
- new String(char[] a,int startIndex,int count);
- String实现了Serializable说明String可以串行化,可以网络传输
- String实现了Comparable接口,说明String对象可以比较
- String 是final类,不能被继承
- 字符串本质是char数组,value[]是一个final类型,不可以修改(地址不能修改)
String01
public class String01 { public static void main(String[] args) { String name ="Jack"; final char[] value = {'a','b'}; char[] v2 = {'5','4'}; value[0]='h'; for(char i:value){ System.out.println(i); } } }
- 创建String对象的方式
- 直接赋值:String s="测试";
- 调用构造器:String s1 = new String("测试");
- 方式一:先从常量池查看是否有数据空间,如果有,直接指向,如果没有则重新创建,然后指向,最终指向的是常来那个池的空间地址;
- 方式二:现在堆中创建空间,里面维护了value属性,指向常量池的空间,如果常量池没有,重新创建,如果有,直接通过value指向,最终指向的是堆中的空间地址
- 当调用intern方法,如果池中包含一个等于String对象的字符串,用equals(object)方法确定,则返回池中的字符串,否则将String对象爱过你添加到池中,并返回此String对象的引用;intern()方法最终返回的是常量池的地址;
intern
public class String01 { public static void main(String[] args) { final char[] value = {'a','b'}; char[] v2 = {'5','4'}; value[0]='h'; for(char i:value){ System.out.println(i); } String name1 = new String("Jack"); String name ="Jack"; System.out.println(name == name1.intern());//true } }
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的,,一个字符串对象一旦被分配,其内容是不可变的
- 底层是StringBuilder sb = new StringBuilder();sb.append(a);sb.append(b);sb是在堆中,并且append是在原来字符串的基础上追加的
- String c1 = "ab" +"cd";常量相加看的是池,变量相加,是在堆中
方法String示例
public class String02 { String str = new String("hsp"); final char[] ch = {'j','a','v','a'}; public void change(String str,char ch[]){ str = "java"; ch[0] = 'h'; } //调用方法会开一个新栈,方法里的形参是在这个新栈里面创建的变量,String是不可以变更的,所以在新栈中str指向 //常量池中的java,方法执行完毕后,这个栈也被销毁了,原来的str维持不变 public static void main(String[] args) { String02 string02 = new String02(); string02.change(string02.str, string02.ch); System.out.println(string02.str);//hsp System.out.println(string02.ch);//hava } }
- String类是保存字符常量的,每次更新都需要重新开辟空间,效率较低,因此java设计者提供了StringBuilder和StringBuffer来增强String的功能,并提高效率
- String常见的方法
- equals 区分大小写,判断内容是否相等
- equalsIgnoreCase忽略大小写判断内容是否相等
- length获取字符的个数
- indexOf获取字符在字符串中第一次出现的索引,找不到返回-1
- lastIndexOf获取字符在字符串中最后一次出现的索引,找不到返回-1
- substring截取指定范围的字符串
- trim去掉前后空格
- charAt获取某索引出的字符
- toUpperCase
- toLowerCase
- concat
- replace替换字符串中的字符
- split分割字符串,对于某些分割符,我们需要转义比如|\\
- compareTo比较两个个字符串大小:返回正数,前者大,相等返回0,长度相等,根据字符从左向右比较差值,字符不等,直接比较字符串长度
- toCharArray转化为字符数组
- format格式化字符串%s字符串 %c字符 %d整型 %.2f浮点型 ,其中%s等为占位符
String常用方法示例
public class StringMethod01 { public static void main(String[] args) { String n1 = "hello"; String n2 = "Hello"; System.out.println(n1.toUpperCase()); System.out.println(n2.toLowerCase()); System.out.println(n1.concat("测试").concat("2测试").concat("23")); System.out.println(n1.replace("hello","开发")); System.out.println(n1); String name = "张三"; int n23 = 20; double sal = 2000.0; char gender = '男'; String test = "我的名字叫%s,今年%d岁,月收入%.2f元,性别是%c"; System.out.println(test.format(test,name,n23,sal,gender)); System.out.println(n1.equals(n2)); System.out.println(n1.equalsIgnoreCase(n2)); System.out.println(n1.length()); System.out.println(n1.indexOf("h")); System.out.println(n1.indexOf("H")); System.out.println("kk"+n1.indexOf("ll")); System.out.println(n1.lastIndexOf("l")); System.out.println(n1.substring(3)); } }