1.字符串
String是Java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包 |
Java 程序中所有的双引号字符串,都是 String 类的对象 |
字符串不可变,它们的值在创建后不能被更改 (字符串其实是一个字符数组,即是数组,长度不可改) |
final表示最终的,String被final修饰,不可改 |
2.创建String对象的两种方式
(1)直接赋值
(2)使用new的方式获取一个字符串对象
3.内存
方法运行时进栈,运行完出栈 |
堆与对象有关,new出来的对象都放在堆中 |
字节码文件加载到方法区中 |
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在 不存在,创建新的,存在,复用 |
4.字符串比较
==号基本数据类型比较,比的是数据值
==号引用数据类型比较,比的是地址值
boolean equals(要比较的字符串) | 完全一样才为true |
boolean equalsIgnoreCase(要比价的字符串) | 忽略大小写的比较 |
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
System.out.println("基本数据类型比较------------------------------------");
String s1 = "abc";
String s2 = "ABC";
System.out.println(s1==s2);//true,在串池中值相同,复用
boolean result1=s1.equals(s2);
boolean result2 = s1.equalsIgnoreCase(s2);
System.out.println(result1);//false
System.out.println(result2);//true
System.out.println("引用数据类型比较------------------------------------");
String s3 = new String("abc");
String s4 = new String("ABC");
System.out.println(s3==s4);//false
boolean result3=s3.equals(s4);
boolean result4=s3.equalsIgnoreCase(s4);
System.out.println(result3);//false
System.out.println(result4);//true
System.out.println("-------------------------------------------------");
String s5 = "abc";//记录的是串池里面的地址值
String s6 = new String("ABC");//记录的是堆里面的地址值
System.out.println(s5==s6);//false
boolean result5= s5.equals(s6);//false
boolean result6= s5.equalsIgnoreCase(s6);//true
System.out.println(result5);
System.out.println("----键盘录入的abc与直接赋值的abc是否相等-----------");
Scanner scanner=new Scanner(System.in);
System.out.println("请自动输入一个字符串:");
String str1 = scanner.next();//ctrl alt+V自动生成等号左边
String str2="abc";
boolean result7 = str1.equals(str2);
System.out.println(str1==str2);//false,new出来的对象指向的是地址值
System.out.println(result7);
}
}
(1)字符串--登录练习
import java.util.Scanner;
/**字符串
* 用户登录
* 已知用户名和密码,有三次机会,要有提示
*/
public class Test3 {
public static void main(String[] args) {
String rightUsername="王一";
String rightPassword="123456";
Scanner scanner=new Scanner(System.in);
for(int i=0;i<3;i++)
{
System.out.println("请输入你的用户名:");
String username = scanner.next();
System.out.println("请输入你的密码:");
String password = scanner.next();
if(rightUsername.equalsIgnoreCase(username)&&rightPassword.equalsIgnoreCase(password))
{
System.out.println("用户登录成功");
break;
}else
{
System.out.println("用户登录失败,用户名和密码错误,你还有"+(2-i)+"次机会");
}
}
}
}
(2)字符串--遍历和统计字符个数
public char charAt(int index) | 根据索引返回字符 |
public int length() | 返回字符串的长度 |
数组名.length() | 数组的长度 |
字符串对象.length() | 字符串长度 |
import java.util.Scanner;
/**字符串
* 键盘录入一个字符串,控制台遍历
* 统计该字符串中出现的大写字母,小写字母,数字出现的次数
*/
public class Test4 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = scanner.next();
System.out.println("输出该字符串的每一个字符:");
//统计,要有计数器思想,定义计数器解决
int smallcount=0;
int bigcount=0;
int count=0;
for(int i=0;i<str.length();i++)//快捷str.length().fori
{
char c = str.charAt(i);//根据索引返回字符
System.out.print(c + " ");
if (c >= 'a' && c <= 'z') //char类型的变量在计算的时候会自动提升为int,查询ASCII表
{
smallcount++;
} else if (c >= 'A' && c <= 'Z') {
bigcount++;
} else if (c >= '0' && c <= '9') {
count++;
}
}
System.out.println();
System.out.println("小写字母的个数:"+smallcount);
System.out.println("大写字母的个数:"+bigcount);
System.out.println("数字的个数:"+count);
}
}
(3)字符串--拼接和反转
import java.util.Scanner;
/**字符串
* 字符串拼接和反转
*定义一个方法,把int中的数组中的数据按照指定格式拼接成一个字符串返回
* 定义一个方法,实现字符串反转
*/
public class Test5 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
String str = arrToString(arr);
System.out.println("["+str + "]");
String str3 = reverseString(str);
System.out.println("反转后的字符串:["+str3+"]");
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str1 = scanner.next();
String str2=reverseString(str1);
System.out.println("反转后的字符串为:"+str2);
}
public static String arrToString(int[] arr) {
if (arr == null) {
return "";
}
if (arr.length == 0) {
return "[]";
}
String result = "";
for (int i = 0; i < arr.length; i++) {
if (i != arr.length - 1) {
result += arr[i] + ",";
} else {
result += arr[i]; //字符串拼接
}
}
return result;
}
public static String reverseString( String str)
{
String result1="";
for (int i = str.length()-1; i >= 0; i--) //i依次表示字符串中的每个索引,倒序
{
char c = str.charAt(i);
result1+=c; //字符串拼接
}
return result1;//return一个长度为0的字符串
}
}
(4)字符串--手机号屏蔽
String substring(int beginIndex,int endindex) 截取 包头不包尾,包左不包右 只有返回值才是截取的小串,对原来的字符串的没有影响 |
String substring(int beginindex) 截取到末尾 |
String replace(旧值,新值),替换 只有返回值才是替换的结果 |
import java.util.Scanner;
/**字符串
* 手机号屏蔽,敏感词替换
*/
public class Test7 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//-----------------------------------------------------------
System.out.println("请输入你的手机号:");
String phone= scanner.next();
String start=phone.substring(0,3);//方法在截取的时候只有返回值才是截取的结果,它对原来调用的字符串没有任何影响
System.out.println(start);
String end=phone.substring(7);
System.out.println(end);
String result=start+"****"+end;
System.out.println(result);
//-----------------------------------------------------------
System.out.println("输入你想说的话:");
String talk= scanner.next();
String[] arr={"TMD","SB","CNMD","WC"};
for(int i=0;i<arr.length;i++)
{
talk=talk.replace(arr[i],"******");
System.out.println(talk);
}
}
}