1.String类
(1) String:表示字符串
字符串是常量;它们的值在创建之后不能更改
String是一种特殊的引用类型, 默认值:null
字符串是常量;它们的值在创建之后不能更改
String是一种特殊的引用类型, 默认值:null
(2)构造方法:
String():无参构造
String(byte[] bytes) :将字节数转换成字符串
public String(byte[] bytes, int index,int length):将字节数组的一部分转换成字符串
public String(char[] value):将字符数组转化成字符串 toCharArray():将字符串转换成字符数组
public String(char[] value, int index, int count):将字符数组的一部分转换成字符串
public String(String original):将一个字符串常量构造成一个字符串对象
String():无参构造
String(byte[] bytes) :将字节数转换成字符串
public String(byte[] bytes, int index,int length):将字节数组的一部分转换成字符串
public String(char[] value):将字符数组转化成字符串 toCharArray():将字符串转换成字符数组
public String(char[] value, int index, int count):将字符数组的一部分转换成字符串
public String(String original):将一个字符串常量构造成一个字符串对象
测试上述构造方法
public static void main(String[] args) { //1)String():无参构造 String s1= new String() ; System.out.println("s1:"+s1);//不是地址值:说明String类本身就是重写Object类中的toString()方法 System.out.println("------------"); //String(byte[] bytes) :将字节数转换成字符串 //首先定义一个字节数组 byte[] bys = {97,98,99,100,101} ; String s2 = new String(bys) ; System.out.println("s2:"+s2);//abcde:找ASCII码里对应的字母 System.out.println("---------------"); //public String(byte[] bytes, int index,int length):将字节数组的一部分转换成字符串 String s3 = new String(bys, 1, 2) ; System.out.println("s3:"+s3); System.out.println("----------------"); //public String(char[] value):将字符数组转化成字符串 char[] ch = {'我','爱','高','圆','圆'} ; String s4 = new String(ch) ; System.out.println("s4:"+s4); //public String(char[] value, int index, int count):将字符数组的一部分转换成字符串 String s5 = new String(ch, 2,3); System.out.println("s5:"+s5); System.out.println("-----------------"); //public String(String original):将一个字符串常量构造成一个字符串对象 String s6 = new String("abc") ; //在写法上:等同于:String s6 = "abc" ; String s7 = "" ;//空字符串 System.out.println("s7:"+s7); String s8 = null ;//对象是空的 }
(3)常用的方法:
public int length()返回此字符串的长度
public int length()返回此字符串的长度
面试题:
数组中有没有length(),字符串中有没有length(),集合中有没有length()?
[解] 数组中没有length()方法,只有length属性
字符串中有length()
集合中没有length(),获取集合的元素数:size() (后面讲)
数组中有没有length(),字符串中有没有length(),集合中有没有length()?
[解] 数组中没有length()方法,只有length属性
字符串中有length()
集合中没有length(),获取集合的元素数:size() (后面讲)
注:带括号的都叫方法!
(4
)String字符串的最大的特点:
字符串一旦被赋值,其值不能被改变
String s = "hello" ; s+="world" ; System.out.println("s:"+s);
直接把一个常量赋值给String类型,这种形式,它是先在方法区中的字符串常量池中找有没有当前字符串,有,直接返回他的地址值;如果没有,就在常量池中开辟空间!
public static void main(String[] args) { String s1 = "abc" ; String s2 = "world" ; System.out.println("s1:"+s1+",s2:"+s2);//s1:abc,s2:world //String作为形式参数:它的效果和基本类型是一样的,形式参数的改变对对实际参数没有影响 (它一旦赋值,不能被改变) change(s1,s2) ; System.out.println("s1:"+s1+",s2:"+s2);//s1:abc,s2:world } public static void change(String s1, String s2) { s1 = s1 +"java" ; s2 = s1+"hello" ; }
注意:
String作为形式参数:它的效果和基本类型是一样的,形式参数的改变对对实际参数没有影响 (它一旦赋值,不能被改变)
面试题:
String s1 = new String("abc");
String s1 = "abc" ;
这两个分别创建了几个对象?
String s1 = new String("abc");
String s1 = "abc" ;
这两个分别创建了几个对象?
第一个创建了两个对象,分别在堆内存和常量池
第二个只创建了一个对象,在常量池
注:
1)在实际开发中,创建字符串对象,用 String str = "常量";
2)对于上述面试题,
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s2));//true
==:比较的是地址值
equals:默认的比较是地址值,但是String类底层重写了equals方法,所以比较的是内容是否相同!
(5)String类常用的判断功能
boolean equals(Object obj):将此字符串与指定的对象比较
boolean equalsIgnoreCase(String str):将此 String 与另一个 String 比较,不考虑大小写
boolean contains(String str):判断当前大串中是否包含子字符串 (重点)
boolean startsWith(String str):以当前str字符串开头(重点)
boolean endsWith(String str):以当前str字符串结尾(重点)
boolean isEmpty():判断字符串是否为空
和contains()方法区别开来:
boolean equals(Object obj):将此字符串与指定的对象比较
boolean equalsIgnoreCase(String str):将此 String 与另一个 String 比较,不考虑大小写
boolean contains(String str):判断当前大串中是否包含子字符串 (重点)
boolean startsWith(String str):以当前str字符串开头(重点)
boolean endsWith(String str):以当前str字符串结尾(重点)
boolean isEmpty():判断字符串是否为空
和contains()方法区别开来:
public String concat(String str):字符串的特有功能:拼接功能和"+"拼接符是一个意思
public static void main(String[] args) { //定义字符串 String s1 = "helloworld" ; String s2 = "HelloWorld" ; //boolean equals(Object obj):将此字符串与指定的对象比较 System.out.println("equals:"+s1.equals(s2)); System.out.println("---------------------------"); //boolean equalsIgnoreCase(String str)将此 String 与另一个 String 比较,不考虑大小写 System.out.println("equalsIgnoreCase:"+s1.equalsIgnoreCase(s2)); System.out.println("---------------------------"); //boolean contains(String str):判断当前大串中是否包含子字符串 (重点) System.out.println("contains:"+s1.contains("llo")); System.out.println("contains:"+s1.contains("android")); System.out.println("---------------------------"); System.out.println("---------------------------"); //boolean startsWith(String str):以当前str字符串开头(重点) System.out.println("startsWith:"+s1.startsWith("he")); //boolean isEmpty():判断字符串是否为空 System.out.println("isEmpty:"+s1.isEmpty()); }
[案例]
模拟登录,给三次机会,并提示还有几次,如果登录成功,玩一个猜数字小游戏..
分析:
1)定义一个规则:
用户名:admin
密码:admin
2)循环三次,使用for循环
创建键盘录入对象
录入的用户名和密码和当前存在的用户名和密码进行比较,如果一致,登录成功
1)定义一个规则:
用户名:admin
密码:admin
2)循环三次,使用for循环
创建键盘录入对象
录入的用户名和密码和当前存在的用户名和密码进行比较,如果一致,登录成功
玩一个猜数字小游戏, 获取1-100之间的随机数(int类型)?
Math中有一个方法:public static double random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
random()的取值范围:[0.0,1.0);
break
random()的取值范围:[0.0,1.0);
break
3)登录失败
分两种情况:
提示有几次机会 次数:2-x
当前2-x==0,换一中提示,当前机会用完了,请联系管理员...
分两种情况:
提示有几次机会 次数:2-x
当前2-x==0,换一中提示,当前机会用完了,请联系管理员...
public class GuessNumberGame { //构造私有化 private GuessNumberGame() { } //提供静态功能 public static void start() { //生成一个随机数 int num = (int)(Math.random()*100) +1 ; while(true) { //创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入要猜的数据:"); int guessNumber = sc.nextInt() ; if(guessNumber >num) { System.out.println("你要猜的值大了..."); }else if(guessNumber<num) { System.out.println("你要猜的值小了..."); }else { System.out.println("恭喜你,猜中了..."); break ; } } } }
public static void main(String[] args) { // 定义用户名和密码 String username = "admin"; String password = "admin"; // 模拟登录,有三次机会 for (int x = 0; x < 3; x++) { // 创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String InputUserName = sc.nextLine(); System.out.println("请输入密码:"); String InputPwd = sc.nextLine(); // 判断录入的和存在用户名或者密码和存在的用户名或者密码看他们是否一致 if (username.equals(InputUserName) && password.equals(InputPwd)) { // 一致,登录成功 System.out.println("登录成功...."); //玩一个猜数字小游戏 System.out.println("开始玩游戏了..."); GuessNumberGame.start(); break; } else { // 没有登录成功:2,1,0 if ((2 - x) == 0) { System.out.println("请速联系管理员"); } else { // !=0 ,2,1 System.out.println("当前您还是有" + (2 - x) + "次机会"); } } } }
(6)String类的常用获取功能:
public int length():获取字符串的长度
public char charAt(int index)返回指定索引处的字符
public int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引
问题:既然传入的字符:这里为什么用int类型?
因为 'a'和97 在ASCII码表中都表示a!
public int indexOf(int ch,int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
public int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
public int indexOf(String str,int fromIndex)回在此字符串中第一次出现指定字符串处的索引,从指定的索引开始搜索。
截取功能
public String substring(int beginIndex):从指定位置开始截取,默认截取到末尾,返回新的字符串
public String substring(int beginIndex, int endIndex):从指定位置开始到指定位置末尾结束,包前不包含
public int length():获取字符串的长度
public char charAt(int index)返回指定索引处的字符
public int indexOf(int ch)返回指定字符在此字符串中第一次出现处的索引
问题:既然传入的字符:这里为什么用int类型?
因为 'a'和97 在ASCII码表中都表示a!
public int indexOf(int ch,int fromIndex)返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
public int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引
public int indexOf(String str,int fromIndex)回在此字符串中第一次出现指定字符串处的索引,从指定的索引开始搜索。
截取功能
public String substring(int beginIndex):从指定位置开始截取,默认截取到末尾,返回新的字符串
public String substring(int beginIndex, int endIndex):从指定位置开始到指定位置末尾结束,包前不包含
需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
public static void main(String[] args) { //定义三个统计变量 int bigCount = 0 ; int smallCount = 0 ; int numberCount = 0 ; //键盘录入对象 Scanner sc = new Scanner(System.in) ; System.out.println("请您输入一个字符串:"); String line = sc.nextLine() ; //将字符串遍历 for(int x =0 ; x < line.length() ; x ++) { //可以通过索引获取每一个字符 char ch = line.charAt(x) ; //判断他是否大写字母,小写字母,还是数字字符 if(ch >= 'a' && ch<='z') { //小写字母字符 smallCount ++ ; }else if(ch>='A' && ch<='Z') { bigCount++; }else if(ch>='0' && ch<'9') { numberCount ++; } } System.out.println("大写字母字符有:"+bigCount+"个"); System.out.println("小写字母字符有:"+smallCount+"个"); System.out.println("数字字母字符有:"+numberCount+"个"); }
(7) String的常用转换功能:
public byte[] getBytes() :将字符串转换为字节数组
public char[] toCharArray() :将字符串转换成字符数组(重点)
public static String valueOf(int i):将int类型的数据转换成字符串(重点)
这个方法可以将任何类型的数据转化成String类型 public String toLowerCase():转成小写
public String toUpperCase():字符串中所有的字符变成大写
/** * 需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符) helloWORLD * *分析: * 获取第一个字符:通过截取 返回一个新的字符串s1 * 将s1转换成大写 * 在获取除了第一个1字符以为的其他字符,截取s2 * s2转换成小写 * s1和s2拼接 * */ public static void main(String[] args) { //键盘录入一个字符串 Scanner sc = new Scanner(System.in) ; System.out.println("请输入一个字符串:"); String s = sc.nextLine(); //截取当前第一个字符 String s1 = s.substring(0, 1) ; //在截取除了第一个字符以为的其他字符 String s2 = s.substring(1); //将s1转换成大写 String s3 = s1.toUpperCase() ; //s2转换成小写 String s4 = s2.toLowerCase() ; //s3和s4拼接 String result = s3.concat(s4) ; System.out.println("result:"+result); System.out.println("-----------------"); //链式编程 String result2 = s.substring(0, 1).toUpperCase().concat( s.substring(1).toLowerCase()) ; System.out.println("result2:"+result2); }
(8) String类型的其他功能:
public String replace(char oldChar,char newChar):将大字符串中的某个字符替换掉成新的字符
public String replace(String oldStr,String newStr):将大串中的某个子字符串替换掉
public String trim():去除字符串两端空格
public int compareTo(String anotherString)按字典顺序比较两个字符串
public String replace(char oldChar,char newChar):将大字符串中的某个字符替换掉成新的字符
public String replace(String oldStr,String newStr):将大串中的某个子字符串替换掉
public String trim():去除字符串两端空格
public int compareTo(String anotherString)按字典顺序比较两个字符串
(9)String类的应用
1)如何进行遍历:charAt(int index)和length()相结合
//需求:需要遍历一个字符串:String s = "helloworld"; public static void main(String[] args) { //定义一个字符串 String str = "helloworld" ; //借助于:只获取字符串长度length() //charAt(int index):获取指定索引处的字符 for(int x = 0 ;x < str.length();x++) { System.out.println(str.charAt(x)); } }
2)toCharArray();
public static void main(String[] args) { //定义一个字符串 String str ="JavaSE" ; //public char[] toCharArray() :将字符串转换成字符数组(重点) char[] chs = str.toCharArray() ; for(int x = 0 ; x < chs.length ; x ++) { System.out.println(chs[x]); } }