Scanner的概述与String类的构造和使用_DAY12
1:Scanner的概述(理解)
1)Scanner是JDK5以后出现的方便我们从键盘接受数据的类。
2)Scanner的构造格式:
Scanner sc = new Scanner(System.in);
System.in 是System类下面有一个静态的成员变量in。它的类型是InputStream。
代表的是标准键盘输入流。也就是键盘录入数据。
Scanner是对其进行了封装,提供了各种转换功能。方便我们获取到想要的数据类型的数据。
3)要掌握的两个功能:
A:返回int类型
public int nextInt()
B:返回String类型
a、 public String nextLine() //返回下一个完整标记前的内容,完整标记包含:回车
例子:
import java.util.Scanner; public class Demo1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String s=sc.next(); System.out.println(s); //输入:123 456 输出:123 System.out.println("----------------"); Scanner sc2=new Scanner(System.in); //输入:123 456 输出:123 456 String s2=sc2.nextLine(); System.out.println(s2); } }
b、 public String next() //返回下一个完整标记前的内容,完整标记包含:回车,空格
例子:
import java.util.Scanner; public class Demo1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); String s=sc.next(); System.out.println(s); } } 输入:adfgrw131 输入:123 456 789 //有空格 输出:adfgrw131 输出:123 //空格为完整的标记,注意输出的不同
注意事项:
先next,再nextLine会有问题。
解决方案:
重新建立Scanner对象。//一般不会这样做。因为消耗资源
根据需求,选择合适的方法。
统一一种方法。
2:String类的概述和使用(掌握)
1)字符串数据类型。属于引用数据类型。
2)String本质:值就是一个char[]
3)String类的特殊性:
字符串为常量,字符串值一旦初始化便不可以修改。
常量池:在java用于保存在编译期已确定的,已编译的class文件中的一份数据。
字符串特殊性内存解释。
图String是常量
4)String类的构造方法:
A:String s = new String();
B:String s = new String(byte[] bys);
C:String s = new String(byte[] bys,int startIndex,int count);
D:String s = new String(char[] chs);
E:String s = new String(char[] chs,int startIndex,int count);
F:String s = new String(String s2);
G:String s = "hello";
常使用:
BCDEG
例子:
package cn.itcast.myString; /* * String本质:值就是一个char[] * String类型的构造方法: * 1:字面值 * 2:String() * 3:public String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String * 4:public String(byte[] bytes, int offset,//offset:偏移量 距起始点差多少 即从哪开始 int length)//length:长度 即取多少个元素 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String 5:public String(char[] value)分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 6:public String(char[] value, int offset, int count) 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 7:public String(String original) 使用字符串创建字符串 */ public class Demo3 { public static void main(String[] args) { //1:字面值 String s = "abc"; //2:String() //没有值&null&有字符串对象但内容为空 比较 //String s2; 没有值 String s3 = new String(); s3 = null; //有值,没有对象,值为null(空) String s4 = new String(); //有值,有对象,这个对象的值为空的。 //3,4:通过字节数组创建字符串 byte[] bArr = {97,98,99,-1,-2,-3}; String s5 = new String(bArr); System.out.println(s5); //abc?? ,java中2个字节确定一个char类型的字符,字节-1 ,-2对应一个字符? byte[] bArr2 = {97,98,99,100,101}; String s6 = new String(bArr2,1,2); System.out.println(s6); //bc s6 = new String(bArr2,1,bArr2.length-1); System.out.println(s6); //bcde //5,6:通过字符数组创建字符串 char[] cArr = {'a','b','c','c'}; String s7 = new String(cArr,2,2); System.out.println(s7); //cc char[] cArr2 = {97,98,99,100,101}; String s8 = new String(cArr2,2,2); System.out.println(s8); //de //7:通过字符串创建字符串 String s9 = new String("abc"); System.out.println(s9); //abc } }
5)String类的常用方法
(1)、判断方法
(1.1):public boolean equals(Object anObject) 类 Object 中的 equals,比较的为字符串的数值。
(1.2):public boolean equalsIgnoreCase(String?anotherString) Ignore:忽略 Case:大小写
(1.3):public boolean isEmpty() is:是 empty:空的
例子
package cn.itcast.myString; /* * String的判断方法: * 1:public boolean equals(Object anObject) 类 Object 中的 equals,比较的为字符串的数值。 * 2:public boolean equalsIgnoreCase(String anotherString) Ignore:忽略 Case:大小写 * 3:public boolean isEmpty() is:是 empty:空的 */ public class Demo4 { public static void main(String[] args) { //1:euqals方法被重写,比较值 String s = "abc"; String s2 = new String("abc"); String s3 = "abc"; System.out.println(s.equals(s2)); //比较内容 System.out.println(s==s2); //flase 不同地址 System.out.println(s==s3); //true 同一个地址 //2:忽略大小写比较值 System.out.println("======================="); String s4 = "Abc"; String s5 = "abc"; System.out.println(s4.equals(s5)); System.out.println(s4.equalsIgnoreCase(s5)); //3:判断字符串是否为空 System.out.println("======================="); String s6 = new String(); String s7 = null; String s8 = ""; System.out.println(s6.isEmpty()); //System.out.println(s7.isEmpty()); 空指针异常 System.out.println(s8.isEmpty()); System.out.println(s6==s8); } }
练习: 1:将一个int数组的值拼写成字符串形式。
{1,2,3,4,5}
[1,2,3,4,5]
package cn.itcast.myString; /* * 1:将一个int数组的值拼写成字符串形式。 * {1,2,3,4,5} * * [1,2,3,4,5] */ public class Test { public static void main(String[] args) { int[] arr = {1,2,3,4,6}; method(arr); } public static void method(int[] arr) { String s = "["; for (int i = 0; i < arr.length; i++) { /* int element = arr[i]; if(i==arr.length-1) { s += element; }else { s += element+","; // s = s + element + ","; } */ s += arr[i]; if(i!=arr.length-1); s += ","; } s += "]"; System.out.println(s); } }
(1.4)public boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。即A串里是否有子串
(1.5)public boolean startsWith(String prefix) 以某个字符串开头
(1.6)public boolean startsWith(String prefix, int toffset) 指定开始判断的偏移,是否以某个字符串开头
(1.7)public boolean endsWith(String suffix) 以某个字符串结束
例子
package cn.itcast.myString; /* * String的判断方法2: * 1:public boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。即A串里是否有子串 * 2:public boolean startsWith(String prefix) 以某个字符串开头 * 3:public boolean startsWith(String prefix, int toffset) 指定开始判断的偏移,是否以某个字符串开头 * 4:public boolean endsWith(String suffix) 以某个字符串结束 */ public class Demo5 { public static void main(String[] args) { //1:注意多态 String s = "我爱java"; String s2 = "java"; boolean contains = s.contains(s2); //String类实现了CharSequence的接口 System.out.println(contains); //2,3:从指定索引开始判断 System.out.println("==================="); String s3 = "i love java,more and more!~"; String s4 = "more"; String s5 = "i"; String s6 = "i love"; String s7 = "ilove"; System.out.println(s3.startsWith(s4)); //false System.out.println(s3.startsWith(s5)); //ture System.out.println(s3.startsWith(s6)); //true System.out.println(s3.startsWith(s7)); //false System.out.println("==================="); System.out.println(s3.startsWith(s4,12)); //true ,字符串‘i love java,’的长度为12 System.out.println(s3.startsWith(s5,12)); //flase System.out.println(s3.startsWith(s6,12)); //false System.out.println(s3.startsWith(s7,12)); //flase //4: System.out.println("==================="); String s8 = "i love java,more and more"; String s9 = "more"; String s10 = "i love"; System.out.println(s8.endsWith(s9)); //true System.out.println(s8.endsWith(s10)); //false } }
(2)、字符串的获取功能
(2.1):public int length() 获取字符串长度的 《方法()》! 数组是获取数组长度属性!
(2.2):public char charAt(int index) 通过索引获取字符
(2.3):public int indexOf(int ch) 根据字符获取索引
(2.4):public int indexOf(int ch,int fromIndex)
(2.5):public int indexOf(String str) 根据字符串获取索引
(2.6):public int indexOf(String str, int fromIndex)
(2.7):lastIndexOf对应indexOf
(2.8):public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
(2.9):public String substring(int beginIndex, int endIndex) 返回一个新的字符串,它是此字符串的一个子字符串。注意:包含头,不包含尾!
例子:
package cn.itcast.myString; /* * 字符串的获取功能: * 1:public int length() 获取字符串长度的 《方法()》! 数组是获取数组长度属性! * 2:public char charAt(int index) 通过索引获取字符 * 3:public int indexOf(int ch) 根据字符获取索引 * 4:public int indexOf(int ch,int fromIndex) * 5:public int indexOf(String str) 根据字符串获取索引 * 6:public int indexOf(String str, int fromIndex) * 7:lastIndexOf对应indexOf * 8:public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 * 9:public String substring(int beginIndex, int endIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 */ public class Demo6 { public static void main(String[] args) { //1:获取字符串与获取数组长度代码对比 String s = "i love java"; String[] sArr = {"i","love","java"}; System.out.println(s.length()); System.out.println(sArr.length); //2: String s2 = "i love java"; int index = 1; System.out.println(s2.charAt(index)); String s3 = "中国"; System.out.println(s3.charAt(index)); //3,4,5,6,7:indexOf(XXX) 根据字符(串)获取索引 返回第一次找到的索引 返回的永远是在整个字符串的索引,与从哪里开始检索无关 System.out.println("============================"); String s4 = "中国信息化建设程度赶超美国!"; int indexOf = s4.indexOf('国'); System.out.println(indexOf); int indexOf2 = s4.indexOf("国!"); System.out.println(indexOf2); int indexOf3 = s4.indexOf('国',4); System.out.println(indexOf3); int indexOf4 = s4.indexOf("国!",4); System.out.println(indexOf4); System.out.println("============================"); System.out.println(s4.lastIndexOf('国')); System.out.println(s4.lastIndexOf("国!")); System.out.println(s4.lastIndexOf('国',4)); System.out.println(s4.lastIndexOf("国!",4)); //8:public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 //9:public String substring(int beginIndex, int endIndex) 返回一个新的字符串,它是此字符串的一个子字符串。包含头不包含尾! String s5 = "abcde i love java!"; String substring = s5.substring(5); System.out.println(substring); String substring2 = s5.substring(0); System.out.println(substring2); //原来的字符串 String substring3 = s5.substring(0, 7); System.out.println(substring3); String substring4 = s5.substring(0,s5.length()); System.out.println(substring4); System.out.println(s5); } }
(3)、字符串的转换功能
(3.1):重写了Object的toString方法,返回这个字符串本身的数值
(3.2):public static String copyValueOf(char[] data, int offset, int count) //返回指定数组中表示该字符序列的 String。
(3.3):public static String valueOf(boolean b或其他基本类型) 基本类型直接转成引用类型
(3.4):public static String valueOf(char[] data,int offset,int count)
(3.5):public static String valueOf(Object obj) //注意:字符数组特殊性:打印时,结果不是地址,而是值
例子:
package cn.itcast.myString; import cn.itcast.Person; /* * String转换: * 1:重写了Object的toString方法,返回这个字符串本身的数值 * 2:public static String copyValueOf(char[] data, 返回指定数组中表示该字符序列的 String。 int offset, //从哪开始 int count) //取多少个 3:public static String valueOf(boolean b或其他基本类型) 基本类型直接转成引用类型 4:public static String valueOf(char[] data,int offset,int count) 5:public static String valueOf(Object obj) 注意: 字符数组特殊性:打印时,结果不是地址,而是值 */ public class Demo7 { public static void main(String[] args) { //2: char[] cArr = {97,98,99}; String copyValueOf = String.copyValueOf(cArr,1,2); System.out.println(copyValueOf);//bc //3:public static String valueOf(boolean b或其他基本类型) String valueOf = String.valueOf(true); System.out.println(valueOf); //true //4:public static String valueOf(char[] data,int offset,int count) char[] cArr2 = {'a','b','c'}; String valueOf2 = String.valueOf(cArr2, 0, cArr2.length); System.out.println(valueOf2); //abc //5:public static String valueOf(Object obj) Person p = new Person(); String valueOf3 = String.valueOf(p); System.out.println(valueOf3); //调用p对象的toString方法 int[] iArr = {1,2,3,4}; char[] cArr3 = {'a','b','g','s'}; String valueOf4 = String.valueOf(iArr); String valueOf5 = String.valueOf(cArr3); System.out.println(valueOf4); //打印出来地址 System.out.println(valueOf5);//abgs } }
(3.6):public String toLowerCase() 大变小
(3.7):public String toUpperCase() 小变大
(3.8):public String concat(String str) 将指定字符串连接到此字符串的结尾,可以直接用+代替
例子:
package cn.itcast.myString; /* * String转换2: * 1:public String toLowerCase() 大变小 * 2:public String toUpperCase() 小变大 * 3:public String concat(String str) 将指定字符串连接到此字符串的结尾,可以直接用+代替 */ public class Demo8 { public static void main(String[] args) { //1,2: String s = "I love java"; String lowerCase = s.toLowerCase(); System.out.println(lowerCase); String upperCase = s.toUpperCase(); System.out.println(upperCase); System.out.println(s); //3: String s2 = ", very much!"; System.out.println(s.concat(s2)); System.out.println(s+s2); //+代替concat() } }
(3.9)public char[] toCharArray() 转成字符数组
(3.10)public byte[] getBytes() 转换成字节数组
例子:
package cn.itcast.myString; /* * String的转换方法3: * 1:public char[] toCharArray() 转成字符数组 * 2:public byte[] getBytes() 转换成字节数组 */ public class Demo11 { public static void main(String[] args) { //1: String s = "i love java"; char[] charArray = s.toCharArray(); //{'i',' ','l','o','v','e'....} System.out.println(charArray); //2: String s2 = "ab"; byte[] bytes = s2.getBytes(); for (int i = 0; i < bytes.length; i++) { System.out.print(bytes[i] + " "); //输出对应的ASCII码 97 98 } System.out.println(); String s3 = "我爱a"; byte[] bytes2 = s3.getBytes(); for (int i = 0; i < bytes2.length; i++) { System.out.print(bytes2[i] + " "); //-50 -46 -80 -82 97 注意:一个中文字符对应两个字节 } } }
(4)、其他功能
(4.1):public String replace(char oldChar, char newChar) 用新字符替换旧字符
(4.2):public String[] split(String regex) 用指定规则分隔字符串
例子:
package cn.itcast.myString; /* * String的其他方法: * 1:public String replace(char oldChar, char newChar) 用新字符替换旧字符 * 2:public String[] split(String regex) 用指定规则分隔字符串 */ public class Demo9 { public static void main(String[] args) { //1: String s = "i love java?"; String replace = s.replace('?', '!'); String replace2 = s.replace('a', 'b'); System.out.println(replace);// i love java! System.out.println(replace2);// i love jbvb? //2:使用给定的regex规则,将调用split方法的对象分隔成字符串数组 String s2 = "i wanna u"; String[] split = s2.split(" "); //用空格分割 //{"i","wanna","u"} for (int i = 0; i < split.length; i++) { System.out.print(split[i]+"----"); } } }
(4.3):public String trim() 返回字符串的副本,忽略前导空白和尾部空白。
* (4.4):public int compareTo(String anotherString) 按字典顺序比较两个字符串。先比较字母,如果一个字符串是另一个字符串的子字符串,
则比较长度
例子:
package cn.itcast.myString; /* * String的其他方法: * 1:public String trim() 返回字符串的副本,忽略前导空白和尾部空白。 * 2:public int compareTo(String anotherString) 按字典顺序比较两个字符串。先比较字母,如果一个字符串是另一个字符串的子字符串,则比较长度 */ public class Demo10 { public static void main(String[] args) { //1: String s = "i love java"; String s2 = " i love java"; String s3 = "i love java "; String s4 = " i love java "; System.out.println(s.trim()); System.out.println(s2.trim()); System.out.println(s3.trim()); System.out.println(s4.trim()); //2按字典顺序比较,public int compareTo(String anotherString) 按字典顺序比较两个字符串。 String s5 = "abc"; String s6 = "bbc"; String s7 = "cbc"; System.out.println(s5.compareTo(s5)); System.out.println(s5.compareTo(s6)); System.out.println(s6.compareTo(s5)); System.out.println(s5.compareTo(s7)); System.out.println(s7.compareTo(s5)); String s8 = "abc"; String s9 = "abcd"; String s10 = "abcdefg"; System.out.println(s8.compareTo(s8)); //0 System.out.println(s8.compareTo(s9)); //-1 System.out.println(s9.compareTo(s8)); //1 System.out.println(s8.compareTo(s10));//-4 System.out.println(s10.compareTo(s8));//4 String s11 = "abcc"; String s12 = "zbc"; System.out.println(s11.compareTo(s12)); //-25 System.out.println(s12.compareTo(s11)); //25 String s13 = "aac"; String s14 = "abc"; System.out.println(s13.compareTo(s14)); //-1 } }
3、面试题:
A:字符串一旦被赋值就不能被改动。
注意:这里的改动指的是字符串的内容,而不是字符串对象的引用。
B:String s = new String("hello");和String s = "hello";有区别吗?是什么呢?
有。
前者创建了两个对象。
后者创建了一个对象。
C:看程序,写结果
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2); //比较地址,false
System.out.println(s1.equals(s2)); // 比较内容,true
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4); // 比较地址,false
System.out.println(s3.equals(s4)); // 比较内容,true
String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6); //常量池里面,比较地址 true
System.out.println(s5.equals(s6)); //常量池里面,比较内容 true
D:看程序,写结果
String s7 = "hello";
String s8 = "world";
String s9 = "helloworld";
System.out.println(s9==s7+s8); //false
System.out.println(s9=="hello"+"world"); //true
变量就直接造,常量先找,如果有就使用,否则就造。
(4)字符串的常见功能:(补齐中文)
A:判断功能
boolean equals(Object obj)
boolean equalsIgnoreCase(String str)
boolean contains(String str)
boolean startsWith(String str)
boolean endsWith(String str)
boolean isEmpty()
B:获取功能
int length()
char charAt(int index)
int indexOf(int ch)
int indexOf(String str);
int indexOf(int ch,int fromIndex)
int indexOf(String str,int fromIndex)
String substring(int start)
String substring(int start,int end)
C:转换功能
byte[] getBytes() //获取字符串的字节数组
char[] toCharArray() //获取字符串的字符数组
static String copyValueOf(char[] chs)
static String valueOf(char[] chs)
static String valueOf(int i)
String toLowerCase()
String toUpperCase()
String concat(String str)
D:其他功能
String replace(char old,char new)
String replace(String old,String new)
String[] split(String regex)
String trim()
int compareTo(String str)
int compareToIgnoreCase(String str)
(5)案例:(理解)
A:遍历字符串
package cn.itcast; /* * 遍历字符串中每一个字符 */ public class Test { public static void main(String[] args) { String s = "i love java"; for (int i = 0; i < s.length(); i++) { //遍历字符串 char charAt = s.charAt(i); //通过索引获取到每一个字符 System.out.print(charAt+" "); } System.out.println(); char[] charArray = s.toCharArray();//将字符串转成字符数组 for (int i = 0; i < charArray.length; i++) { //遍历数组 char c = charArray[i]; System.out.print(c); } } }
B:统计字符串中大写字母,小写字母以及数字字符出现的次数
package cn.itcast; public class Main { public static void main(String[] args) { String s = "hello123ABC"; //统计字符串中大写字母,小写字母以及数字字符出现的次数 char[] c= s.toCharArray(); int uCount=0; int lCount=0; int numCount=0; for(int i=0;i<c.length;i++){ if(c[i]>='A'&& c[i]<='Z'){ uCount++; }else if (c[i]>='a'&& c[i]<='z'){ lCount++; }else if(c[i]>='0'&& c[i]<='9'){ numCount++; } } System.out.println(uCount); System.out.println(lCount); System.out.println(numCount); } }
C:把一个字符串的首字母变成大写,其他的全部小写
package cn.itcast; public class Main { public static void main(String[] args) { String s = "I lovE Java"; //截取头 tset(s); } private static void tset(String s) { String headString=s.substring(0,1); //头变大写 String uHeadString= headString.toUpperCase(); //截取身体 String bodyString= s.substring(1); //身体大写 String uBodyString=bodyString.toLowerCase(); //输出 System.out.println(uHeadString+uBodyString); } }
D:统计大串中小串出现的次数
package cn.it; /* * 给定一个字符串找到子串在字符串中出现的次数。String s = “abcitcastabcxxxabc”中的“abc” */ public class Test4 { public static void main(String[] args) { //定义变量,记录大字符串 String s = "abcitcastabcxxxabc"; // "itcastabcxxxabc" //定义变量,记录小字符串 String subS = "abc"; method(s, subS); } public static int method(String s, String subS) { //定义变量,为初始字符串保持副本 String copyS = s; //定义变量,记录出现次数 int count = 0; //定义变量,记录小字符串在大字符串中出现的索引 int index = s.indexOf(subS); // while (index!=-1) { count++;//找到一次小字符串就将个数+1 // index+subS.length() 这是去掉了一次小字符串后的剩余字符串开始索引 // 截取剩余字符串 s = s.substring(index+subS.length()); // 使用剩余字符串继续判断是否有"abc"字符串 index = s.indexOf(subS); } System.out.println(subS+"在"+copyS+"中出现的次数为:"+count); } }