1 String类型
- 概述:
(1)用来定义字符串的类型。
(2)引用数据类型。
(3)在java.lang包定义,使用该类不需要导包 - 特点:
(1)如果String类型直接接收一个字符串常量,那么这个字符串常量在常量池中定义,引用中存储的是常量池中字符串的地址值。
(2)如果String类型通过new关键字创建,那么会在堆内存中创建一个对象,引用中 存储的是该对象的地址。
如果使用new 创建了一个字符串对象,字符串对象中维护了一个字符数组,通过字符数组来保存数据。
(3)字符串本身并不能被修改,String类型是一个不可变的字符序列。
原因1:如果使用的是=字符串常量。字符串常量不能被改变
原因2:如果使用的是new创建了一个字符串对象,对象中维护了一个私有的字符数组,私有的数组在其他类中不能直接访问,只可以通过公共的方法访问,String类型只提供了获取值的方法,没有提供公共改值的方法,所以通过new创建的字符串对象,属性值不能被改变的。
2 String类构造方法
String()
空参构造
2.String(byte[] bytes)
:将一个字节数组转成一个字符串,解码String(byte[] bytes, int offset, int length)
:将字节数组的一部分转成字符串String(char[] value)
:将一个字符数组转成一个字符串String(char[] value, int offset, int count)
:将字符数组的一部分转成字符串String(String original)
:将字符串存储到字符数组中
代码
package demos5_string;
public class Demo03 {
public static void main(String[] args) {
//通过空参构造创建一个字符串对象
String str1 = new String();
System.out.println(str1);
//将一个字节数组转为一个字符串
//通过String的有参构造定义
byte[] bs = {97,98,99};
String str2 = new String(bs);
System.out.println(str2);
//将字符数组的一部分转为一个字符串
String str3 = new String(bs,0,2);
System.out.println(str3);
//将字符数组转为一个字符串
char[] chs = {'x','y','z'};
String str4 = new String(chs);
System.out.println(str4);
//将字符数组的一部分转为一个字符串
String str5 = new String(chs,1,2);
System.out.println(str5);
//通过有参构造,创建一个字符串对象
String str6 = new String("abcxyz");
System.out.println(str6);
}
}
3 String类的判断功能
contains(CharSequence s)
:判断是否包含参数endsWith(String suffix)
:判断调用者字符串是否以参数字符串结尾tartsWith(String prefix)
:判断调用者字符串是否以参数字符串开头equals(Object anObject)
:判断两个字符串是否一样equalsIgnoreCase(String anotherString)
:忽略大小写判断两个字符串是否一样isEmpty() :
判断调用者是否为空
代码
package demos5_string;
public class Demo04 {
public static void main(String[] args) {
String str = "abcdefg";
//判断调用者字符串是否包含参数字符串
System.out.println(str.contains("abc"));//true
System.out.println(str.contains("ac"));//false
//判断调用者字符串是否以参数字符串开头
System.out.println(str.startsWith("abc"));//true
System.out.println(str.startsWith("a"));//true
//判断调用者字符串是否以参数字符串结尾
System.out.println(str.endsWith("fg"));//true
System.out.println(str.endsWith("e"));//false
//判断两个字符串属性值是否相同
System.out.println(str.equals("abcdefg"));//true
System.out.println(str.equals("ABCDEFG"));//false
//忽略大小写判断两个字符串是否相同
System.out.println(str.equalsIgnoreCase("ABCDEFG"));//true
//判断字符串是否是空串
System.out.println(str.isEmpty());//false
System.out.println("".isEmpty());//true
//null不能调用该方法,不属于任何数据
// System.out.println(null.isEmpty());
}
}
4 String类的获取功能
charAt(int index)
获取index索引对应的字符concat(String str)
:拼接字符串indexOf(int ch)
:获取ch字符在字符串中的索引indexOf(int ch, int fromIndex)
:从制定位置找ch字符出现的索引indexOf(String str)
:找str字符串在调用者中出现的索引indexOf(String str, int fromIndex)
:从制定位置寻找str出现的索引lastIndexof()
:从后往前找制定元素出现的索引length()
:返回字符串的长度substring(int beginIndex)
:从参数索引开始往后截取字符串,形成一个新串substring(int beginIndex, int endIndex)
:截取字符串一部分,形成一个新串
包含头部索引,不包含尾部索引
代码
package demos5_string;
public class Demo05 {
public static void main(String[] args) {
String str = "abcdefgabc";
//根据指定的索引获取对应的字符
System.out.println(str.charAt(3));
//索引越界异常
//System.out.println(str.charAt(10));
//拼接字符串
String str2 = str.concat("Hello");
System.out.println(str2);
//根据指定的字符,获取对应的索引
System.out.println(str.indexOf('a'));
System.out.println(str.indexOf('x')==-1?"没有该元素":str.indexOf('x'));
System.out.println(str.indexOf('a',3));
//根据传递得字符串获取对应的索引
System.out.println(str.indexOf("abc"));
System.out.println(str.indexOf("abc",3));
//从字符串后开始寻找字符出现的索引
System.out.println(str.lastIndexOf('a'));
//返回字符串元素的个数
System.out.println(str.length());
//截取字符串返回新的字符串
String str3 = str.substring(2);
System.out.println(str3);
String str4 = str.substring(3, 7);
System.out.println(str4);
}
}
5 String类的转换功能
getBytes()
:将字符串转成字节数组toCharArray()
:将字符串转为字符数组toLowerCase()
:将字符串转为全小写形式toUpperCase()
:将字符串转成全大写形式valueOf(参数)
:将基本类型数据的参数或者引用类型转为字符串类型,当前方法是一个 静态方法,可以通过类名直接调用。trim()
:去掉前后两边的空格replace(char oldChar, char newChar)
:将old元素改为new元素
代码
package demos5_string;
import java.util.Arrays;
import java.util.Locale;
public class Demo06 {
public static void main(String[] args) {
String str = "abcdefg";
byte[] bs = str.getBytes();
System.out.println(Arrays.toString(bs));
//如果打印的数组不是一个字符数组,统统将该数组当做一个Object对象打印的,打印的是数组的地址值
System.out.println(bs);
char[] chs = str.toCharArray();
//打印的如果是一个字符数组,有一个特殊的方法,遍历字符数组的元素
System.out.println(chs);
//将字符串转为全大写
System.out.println(str.toUpperCase());
//将字符串转为全小写
System.out.println("ABCD".toLowerCase());
//将其他各种类型的参数,统统转为字符串类型
int i = 100;
String s = String.valueOf(i);//100 "100"
System.out.println(s);
String s2 = String.valueOf(12.345);
System.out.println(s2);
String s3 = " he llo ";
System.out.println(s3.trim());//去掉字符串前后的空格
//将字符串中的老字符串,替换为新的字符串
String s4 = "I love java , java not love me";
String s5 = s4.replace("java", "you");
System.out.println(s5);
}
}
6 String案例讲解
6.1 案例1
1、分析以下程序,判断控制台上的输出结果是什么:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2); //true
System.out.println(s3 == s4); //false
System.out.println(s1 == s3);//false
System.out.println(s1.equals(s2)); //true
System.out.println(s3.equals(s4));//true
System.out.println(s1.equals(s4));//true
6.2 案例2
模拟用户登录:
(1)正确用户名是admin,密码是123
(2)键盘录入用户名和密码,一共有三次机会
(3)如果录入错误,前两次提示还有几次机会最后一次提示“登录机会已经用完”
(4)如果录入正确,提示“登录成功”
代码
package demos5_string;
import java.util.Scanner;
public class Demo07 {
// (1)正确用户名是admin,密码是123
//(2)键盘录入用户名和密码,一共有三次机会
//(3)如果录入错误,前两次提示还有几次机会最后一次提示“登录机会已经用完”
// 4)如果录入正确,提示“登录成功”
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i = 1;i <= 3;i++){
System.out.println("请录入用户名");
String name = sc.nextLine();
System.out.println("请录入密码");
String password = sc.nextLine();
if(name.equals("admin") && password.equals("123")){
System.out.println("登录成功!!!");
break;
}else{
int x = 3-i;
if(x == 0){
System.out.println("登录失败,没有机会录入");
}else{
System.out.println("登录失败,你还有" +x+"次机会");
}
}
}
}
}