String概述
- java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串
- Java程序中的所有字符串文字(例如“abc”)都为此类的对象
String name1 = "石原里美"; //举例子 String name2 = "工藤静香";
String类特点
- String常被称为不可变字符串类型,它的对象在创建后不能被更改
String name = "石原里美"; name += "的微笑"; System.out.println(name); //输出结果:石原里美的微笑
此时我们会产生疑问刚才不是说对象在创建以后不可以被更改吗?那为什么最后的结果是被更改了呢?
事实上呢,对象在创建以后确实是没有被更改的,首先我们应该清楚的是“name中储存的是地址”,在起初创建的时候name对象的时候,name中储存的是“石原里美”的地址,在代码运行第二步的时候,堆内存中出现了“的微笑”,原来的两个对象并没有改变,而是实现拼接形成了第三个字符串“石原里美的微笑”,此时name所指向的地址发生了改变,原来创建的对象仍然存在,只是name不再指向原来的地址,而是指向新的地址,所以在输出的时候,电脑会通过name来获取其指向的数据。
通俗易懂来讲就是:”String变量每次的修改其实都是产生并指向新的字符串变量,而原来的字符串对象都是没有改变的,所以称为不可变字符“。
如果还有些不理解,可以通过以下两张图来加深理解:
在创建过name对象以后,name储存着“石原里美”的地址:
在执行第二步代码的时候,堆内存会出现”的微笑“,这两个对象并不会发生改变,而是二者实现拼接形成”石原里美的微笑“,地址指向改变为黑色的箭头,name指向”石原里美的微笑“。
String类创建对象方式
- 方式一:直接用” “定义
String name = "石原里美";
- 方式二:通过String类的构造器创建对象
构造器 说明 public String() 创建一个空白字符串对象,不含有任何内容 public String (String original) 根据传入的字符串内容,来创建字符串对象 public String (char [ ] chs) 根据字符数组的内容,来创建字符串对象 public String (byte [ ] chs) 根据字节数组的内容,来创建字符串对象 //1、创建一个空白字符串,不含任何内容 String name = new String(); System.out.println(name); //输出结果:什么都没有 //2、根据传入字符串内容,创建字符串对象 String name = new String("石原里美"); System.out.println(name); //输出结果:石原里美 //3、根据字符数组的内容,创建字符串对象 char [] chars = {'石','原','里','美'}; String name = new String(chars); //输出结果:石原里美 //4、根据字节数组的内容,创建字符串对象 byte[] bytes ={65,66,67,97,98,99}; String name = new String(bytes); //输出结果:ABCabc
两种方式有什么区别呢?
- 以" ”方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份
- 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中
String name1 = '石原里美'; String name2 = '石原里美'; System.out.println(name1 == name2);//true,二者地址相同 char name = {'石','原','里','美'}; String name3 = new String(name); String name4 = new String(name); System.out.println(name3 == name4);//false,二者地址不同
String类常用API
字符串内容比较——equals( )
现在有一个问题需要我们去解决,这个问题的要求是“验证账号和密码的正确与否”,这是一个在其他语言中很常见的问题,那么我们首先能够想到的思路是否和下面的一样呢?
通过判断账号和密码是否能够同时和用户输入的值相同来判断!
public static void main(String[] args) { String name = "石原里美"; String password = "123456"; Scanner sc = new Scanner(System.in); System.out.println("账号:"); String name1 = sc.next(); System.out.println("密码:"); String pwd = sc.next(); if (name==name1&& password==pwd){ System.out.println("登录成功!"); }else { System.out.println("账号或密码错误!"); } }
目前思路的确是没有问题的,然而输出结果却并不理想
那么这是出自什么原因呢?其真正原因是在Java中“==”比较的并不是字符串中的内容,而是字符串的地址,因此并不适用于此问题。
不过不需要着急,问题仍然是可以解决的,String类提供的“equals”比较再合适不过了,其只关心内容是否一致。
方法名 说明 public boolean equals (object anobject) 将此字符串与指定对象进行比较,只关心字符内容是否一致 public boolean equalsIgnoreCase (String anotherString) 将此字符串与指定对象进行比较,忽略大小写比较字符,只关心字符内容是否一致 //1、此时输入正确时便不会提示错误! if (name.equals(name1)&& password.equals(pwd)){ System.out.println("登录成功!"); }else { System.out.println("账号或密码错误!"); } //2、此种方法多用于验证码的比较 String code1 = "sylm520"; String code2 = "SyLm520"; System.out.println(code1.equals(code2));//false System.out.println(code1.equalsIgnorecase(code2));//true
获取字符串长度——length( )
String name = "石原里美";
System.out.println(name.length());
//输出结果:4
获取某索引位置处的字符——charAT(int index)
字符串的索引从0开始,依次累加1
char a = name.charAT(3);
System.out.println(a);
//输出结果:美
字符串转为字符数组——toCharArray()
char [] array = name.toCharArray();
System.out.println(array);
//输出结果:石原里美
截取字符串——substring(int begin, int end)
String name = "石原里美的微笑";
System.out.println(name.substring(2,7));//左闭右开
//输出结果:里美的微笑
当前索引截取到末尾——substring(int begin)
String name = "石原里美的微笑";
System.out.println(name.substring(3));
//输出结果:美的微笑
敏感词替换——replace(CharSequence target,CharSequence replacement)
括号内,第一个参数是需要替换的内容,第二个参数是替换过后的内容
String name = "石原里美很漂亮,没有人比石原里美更漂亮了!";
String array = name.replace("石原里美","工藤静香");
System.out.println(array);
//输出结果:
//工藤静香很漂亮,没有人比工藤静香更漂亮了!
判断是否含关键字——contains(CharSequence s)
括号中的参数是需要判断的关键字,其返回值是Boolean型
String name = "石原里美很漂亮!";
System.out.println(name.contains("石原里美"));//true
System.out.println(name.contains("工藤静香"));//false
判断是否是起始值——startsWitch(CharSequence s)
括号中的参数是需要判断的字符串,其返回值是Boolean型
String name = "石原里美很漂亮!";
System.out.println(name.startsWith("石原里美"));//true
System.out.println(name.startsWith("工藤静香"));//false
根据某个内容切割字符串返回字符串数组——split(String s)
括号中的参数是决定字符串以什么为切割点进行切割
String name = "石原里美,工藤静香,中岛美嘉";
String []array = name.split(",");
System.out.println(array[0]);
//输出结果:石原里美
方法名 | 说明 |
public int length() | 返回此字符串的长度 |
public char charAt(int index) | 获取某个索引位置处的字符 |
public char[ ] toCharArray() | 将当前字符串转换成字符数组返回 |
public String substring(int beginIndex,int endIndex) | 根据开始和结束索引进行截取,得到新的字符串(左闭右开) |
public String substring(int beginIndex) | 从传入的索引处截取,截取到末尾,得到新的字符串 |
public String replace(CharSequence target, CharSequence replacement) | 使用新值,将字符串中的旧值替换,得到新的字符串 |
public String[ ] split(String regex) | 根据传入的规则切割字符串,得到字符串数组返回 |
创作不易,给个三连吧!