字符串的特点:
1.String是java定义好的一个类,定义在java.lang包里面,所以使用的时候是不需要进行导包的
2.java程序中的所有字符串文字,都被实为此类的对象。也就是说当我们就算是进行赋值,这个也会创造两个字符串
3.字符串是不可变的,它的值在创建后不能被更改
创建String对象的两种方式:
- 直接赋值 String name = “关岁安”;
- 可以使用new一个String来创建
创建字符串的几种方式
public class Role {public static void main(String[] args) {//1.直接赋值String s1 = "abc";System.out.println(s1);//2.使用new一个字符串对象//空参构造;可以获取一个空白的字符串对象String s2 = new String();System.out.println("@"+s2+"!");//3.有参构造,根据传递的字符串内容再创建以一个新的字符串String s3 = new String("abc");System.out.println(s3);//4.传递一个字符数组,根据字符串数组的内容再创建一个新的字符串对象//修改字符串的内容:abc = {'a','b','c'}-->{'q','b','c'}可以通过字符行数组进行改变char[] chs = {'a','b','c'};String s4 = new String(chs);System.out.println(s4);//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象//引用场景:以后在网络种传输的数据其实都是字节信息byte[] bytes = {100,23,33};//这个是一个ASILL值区查找相应的字符String s5 = new String(bytes);System.out.println(s5);}
}
这几种创建字符串的内存方式;
当使用双引号直接赋值的时候,系统会检查该字符串在串池中是否存在
不存在:创建新的
存在:复用
使用字符数组进行创建字符串
s1和s2是创建两个空间
java的常见方法(比较)
==所以这个是什么意思?
如果是基本数据类型比较的是数值
如果是引用数据了类型比较的是地址值
如果我们想要比较字符床就需要使用两个函数第一个是
Boolean equals方法(要比较的字符串—这个是不能忽略大小写
Boolean equalsignoreCase方法(要比较的字符串—这个是可以忽略大小写)
public class Role {public static void main(String[] args) {//1.创建两个字符串对象String s1 = new String("abc");String s2 = new String("abc");System.out.println(s1 == s2);}
}
由于最后的地址不一样的
所以最后的答案是:false
boolean result = s1.equals(s2);
System.out.println(result);
如果是比较两个字符串里面的内容,这个时候返回的值是true
String s3 = new String("Abc");
boolean result_1 = s1.equalsIgnoreCase(s3);
System.out.println(result_1);
那么最后出来的是true
import java.util.Scanner;//这个相当于一个iostream的头文件public class Role {public static void main(String[] args) {//如果我想要通过键盘进行字符串比较//1.创建一个输入的对象名(栈区存放的是一个地址)Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");//2.原来输入一个字符串是这样的String s1 = sc.next();String s2 = "abc";//3.使用==比较,这两者能一样吗?System.out.println(s1 == s2);}
}
答案很显然是false是因为这个我们输入的这个是通过Scanner sc = new Scanner(System.in)
New出来的一个新的地址,所以肯定会不一样最好使用之前介绍的两个函数进行比较
案例:用户登录
需求:已知正确的用户名和密码,请用程序实现模拟用户登录
总共给三次机会,登录之后,给出相应的提示
小提示:自动生成左边ctrl + alt + v
使用ctrl + alt + t 使我们所写的代码在一个while if for等语句中
这个是一个判定用户密码输入的小程序
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {//1.创建正确的用户名和密码String RightUserName = "关岁安";String RightUserWord = "2829649106";Scanner sc = new Scanner(System.in);for (int i =1;i<=3;i++) {System.out.println("请输入用户名");String name = sc.next();System.out.println("请输入密码");String word = sc.next();//3.判断用户名和我们输入的密码是否一致if(name.equals(RightUserName)&&word.equals(RightUserWord)){System.out.println("输入密码正确");break;}else{if(i == 3){System.out.println("账号已锁定" + name + "请联系我解决");}else{System.out.println("输入的密码或者用户名不存在,你还剩下"+(3-i)+"次机会");}}}}
}
遍历字符串:
需求:键盘输入一个字符串,使用程序实现在控制台遍历该字符串
public char charAt(int index);
public int length();返回此字符串的长度
数组长度:数组名.lenght;
字符串长度:字符串对象.lengh
小技巧:当我们在进行输入字符串的时候,可以先写左边的输入: sc.next() 然后按着ctrl + shift + v 就会自动生成左边 当我们的这个项目体量增加后有可能会忘记这个变量的名字所以这个可以有效帮助我们进行书写
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {Scanner sc = new Scanner((System.in));System.out.println("请输入一个字符串");//1.进行输入字符串String str = sc.next();//2.遍历字符串for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);System.out.println(c);}}
}
在这里函数charAt(i) 相当于是一个数组下标 其实把这个看成一个数组下表i就行
统计字符串的大小写,数字的一个小程序
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {//1.键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();//2.统计...计数器的思想int bigcount = 0;int smallcount = 0;int num = 0;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (c >= 'a' && c <= 'z') {smallcount++;} else if (c >= 'A' && c <= 'Z') {bigcount++;} else if (c >= '0' && c <= '9') {num++;}}System.out.println("小写" + smallcount);System.out.println("大写" + bigcount);System.out.println("数字" + num);}
}
这个其实就是和c语言的差不多 但是我们需要知道其中的具体操作
拼接字符串:
需求:定义一个方法,把int数组中的数据按照指定的格式拼接一个字符串返回,调用该方法,并在控制台进行输出
最后的代码呈现:
需要注意的是这个[ ]和空格和逗号的问题,我们在遍历到最后一个时候就不需要再加逗号和空格。
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {int[] a = {1, 2, 3};String str = arrToString(a);System.out.println(str);}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 (arr.length - 1 == i) {result = result + arr[i] + "]";} else {result = result + arr[i] + ", ";}}return result;}
}
再来一个训练:字符串的反转
小技巧:当我们写str.length的时候再加上.fori或者.forr 其中fori是从0开始遍历,而forr是从最后一个开始,到下标为0结束。
我犯下的错误:1.字符串不能进行自加行为 2.我们在使用函数进行调用时,是不能像c语言直接使用sout(加函数) 只能使用一个变量进行承接,然后通过输出变量进行输出字符串。
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {String str = reverser("abc");System.out.println(str);}public static String reverser(String str){String ans = "";for(int i = str.length() - 1;i>=0 ;i--){char c = str.charAt(i);ans = ans + c;}return ans;}
}
小程序:金额转化
我犯下的错误:1.在while循环中我将int型变量放在了while循环的小括号中,在java中对于类型的要求时十分严格的,不能将整型的变量放这个小括号。
所以里面只能是true或者false
在后面我还搞错了一个东西:String类型的字符串中常常会赋初值”” 这个是不会占用String里面的下标的,只有赋” ”(里面含一个空格才能行)
- 首先我需要明白一件事,String[]是一个字符型数组,每个下标里面存放的是一个字符串。而对于一个String类型的字符串来说我们想要访问它其中的元素只能是通过str.charAt(i),来访问相应下标的元素。
关于这一题的相关代码:
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num;//1.输入数字并且判断这个数字是否合法while (true) {System.out.println("请输入一个数字");num = sc.nextInt();if (num <= 0 || num >= 9999999) {System.out.println("数字不符合常规请重新输入");} else {break;}}String str = "";//2.将每一位数字都输入到方法中while (true) {int go = num % 10;String bignum = ToChangeNum(go);str = bignum + str;num /= 10;if (num == 0) break;}//补零int count = 7 - str.length();for (int i = 0; i < count; i++) {str = "零" + str;}System.out.println(str);String result = "";String[] arr = {"佰", "拾","万","仟","佰","拾","元"};for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);result = result + c + arr[i];}System.out.println(result);}public static String ToChangeNum(int num) {String[] change = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};return change[num];}
}
substring函数的使用方法:
String substring(int beginindex,int endindex)截取函数
注意点:包头不包尾,包做补包右
只有返回值才是截取的最小串(对原来的字符串没有影响)
重载的方式:
String substring(int beginindex)从beginindex直接截取到末尾
我犯下的错误:String类型赋初值的时候我们不需要加上{}这样反而会错,应该直接加上双引号。
实体样例我们把密码中间那一步使用*代替
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {String numberPhone = "15570936136";String start = numberPhone.substring(0,3);String end = numberPhone.substring(7);String result = start + "****" + end;System.out.println(result);}
}
新学一个方法替换:str.replace(target:”字符串中的字符”,replacemaent:”***”);
后面这个可以和原来的字符串长度不一样。
我犯下的错误:这个其实和上面那截取是一样的,都容易犯忘记冲定义一个字符串来获取新字符串,注意截取和替换操作都无法对原来的字符串造成改变
import java.util.Scanner;public class StringDemo1 {public static void main(String[] args) {String str = "你可真牛,tmd";String ss = str.replace("tmd","******");System.out.println(ss);}
}