1.Scanner类与String类
1.1 Scanner类
Scanner类作用
用Scanner类的方法可以完成接收键盘录入的数据
package com.igeek_03;/*** @author Lynn* @create 2020-11-24-10:08*/import java.util.Scanner;/*** 用于字符串的获取* Scanner用于获取键盘输入的数据(基本类型,字符串类型)* 获取字符串类型:nextLine();--获取下一行字符串的数据(换行)* next();--获取下一个字符开始的数据(不换行)* 获取int类型:nextInt();**/public class ScannerDemo {public static void main(String[] args) {//实例化Scanner--系统中提供好的apiScanner sc=new Scanner(System.in);//System.in表示系统中输入的内容获取//接收数据System.out.println("请输入数据:");String s=sc.nextLine();String s1=sc.next();int n=sc.nextInt();System.out.println("s:"+s);System.out.println("s1:"+s1);System.out.println("n:"+n);//Scanner其实就是一个占用的资源,使用结束以后记得关闭//如果不关闭,会一直占用内存sc.close();}}
1.2 String类
String类概述
通过JDK提供的API,查看String类的说明
A:”abc”是String类的一个实例,或者成为String类的一个对象
B:字符串字面值”abc”也可以看成是一个字符串对象
C:字符串是常量,一旦被赋值,就不能被改变
D:字符串本质是一个字符数组
package com.igeek_03;/*** @author Lynn* @create 2020-11-24-10:25*//*** 字符串:string* 属于java.lang包下的api,使用的时候不需要导包** 字符串是一个串,是多个字符连接而成** 字符串的底层其实就是字符类型的数组*/public class PreString {public static void main(String[] args) {//储备知识String s="王嘉尔好帅!";//底层的实现--字符类型的数组char[] c={'王','嘉','尔','好','帅','!'};}}
String类的构造方法
String(String original):把字符串数据封装成字符串对象<br /> String(char[] value):把字符数组的数据封装成字符串对象<br /> String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象<br />**注意:字符串是一种比较特殊的引用数据类型,直接输出字符串对象输出的是该对象中的数据。**<br />/**<br />* **面试题:**<br />* String s="hello";s=s+"world",<br />* 问:原始值变了没有<br />* 答案:没有<br />* 解释:因为String是不可变类,即类的实例是不可被修改的。<br />*在这段代码中,s原来指向一个String对象,内容是“hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为”helloworld!",原来那个对象还存在内存中,只是s这个引用变量不再指向他了。<br />*/<br />// String s="hello";<br />// s1=s+"world";<br />// System.out.println(s);<br />// System.out.println(s1);
package com.igeek_03;/*** @author Lynn* @create 2020-11-24-10:30*//*** 演示String常用的构造方法** 构造函数:* String(String original):把字符串封装成字符串对象* String(char[] value):把字符数组封装成字符串对象* String(char[] value,int index,int count):把一部分字符数组封装成字符串对象** 注意:* 字符串是一个比较特殊的引用类型数据,直接输出字符串对象的时候输出的就是对象中的数据*/public class StringDemo {public static void main(String[] args) {//方式1--用的最多String s1=new String("hello");//在String的底层重写了toString()方法System.out.println(s1);//helloSystem.out.println("---------------");//方式2char[] chs={'h','e','l','l','o'};//char chs[]={'h','e','l','l','o'};//也可以String s2=new String(chs);System.out.println(s2);//hello//方式3String s3=new String(chs,0, chs.length);System.out.println(s3);//helloString s4=new String(chs,1,3);System.out.println(s4);//ell//方式4--字符串的特殊声明方式,直接按照基本类型的声明格式使用!!// --是Java对于String的恩赐String s5="故事的";System.out.println(s5);//故事的int a=10;// Integer i=new Integer(a);System.out.println(a);//10/*** 面试题:* String s="hello";s=s+"world",* 问:原始值变了没有* 答案:没有* 解释:因为String是不可变类,即类的实例是不可被修改的。*/// String s="hello";// s1=s+"world";// System.out.println(s);// System.out.println(s1);}}
创建字符串对象两种方式的区别
1.通过构造函数创建的字符串保存在堆中
2.直接声明的字符串保存在方法区中的常量池中
常量池的作用:
- Java字符串的优化机制
1.如果说利用直接声明字符串的时候会去常量池查找,如果有相同的字符串存在
则直接拿来使用,不再创建新的字符串
2.如果使用构造函数声明字符串(new),那么不管常量池中有没有相同的字符串都会在堆中
- 创建一个新的字符串对象
- ==:
- 基本类型:比较的是数据类型的值是不是相同
- 引用类型:比较的是引用类型的地址值是否相同 ```java package com.igeek_03;
/**
- @author Lynn
- @create 2020-11-24-11:07 */
/**
- 当前案例演示通过构造函数创建字符串和直接声明字符串的区别
- 1.通过构造函数创建的字符串保存在堆中
- 2.直接声明的字符串保存在方法区中的常量池中 *
- 常量池的作用:
- Java字符串的优化机制
- 1.如果说利用直接声明字符串的时候会去常量池查找,如果有相同的字符串存在
- 则直接拿来使用,不再创建新的字符串 *2.如果使用构造函数声明字符串(new),那么不管常量池中有没有相同的字符串都会在堆中
- 创建一个新的字符串对象 *
- ==:
- 基本类型:比较的是数据类型的值是不是相同
引用类型:比较的是引用类型的地址值是否相同 */ public class StringDemo02 { public static void main(String[] args) {
//构造函数创建String s1=new String("hello");//直接声明String s2="hello";System.out.println(s1);System.out.println(s2);//比较地址值System.out.println("s1==s2:"+(s1==s2));//s1==s2:false//s3直接从常量池中去拿的,并没有创建新的对象,其实就是s2String s3="hello";System.out.println("s1==s3:"+(s1==s3));//s1==s3:falseSystem.out.println("s2==s3:"+(s2==s3));//s2==s3:true
String类的判断功能
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str):判断字符串对象是否以指定的str开头
boolean endsWith(String str):判断字符串对象是否以指定的str结尾 ```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-25-0:34 */
/**
- String判断的演示 *对象的顶级父类:Object
- 是类层级结构中的根类(是Java中的顶级父类),所有的类都直接或者是间接的继承Object *
- String判断功能
- boolean equals(Object):比较两个字符串的内容是不是相同(比较两个双胞胎像不像)
- boolean equalsIgnoreCase(String str):比较两个字符串的内容是不是一样,忽略大小写
- boolean startWith(String str):判断这个字符串是不是以指定的str开头
- boolean endWith(String str):判断这个字符串是不是以指定的str结束 *
- 注意:
- ==与equals的区别(面试题)
- 1.==在基本类型中比较的是两个变量的值是不是相等
- 2.==在引用类型中比较的是两个对象的地址值是不是相同
- 3.equals在引用类型中比较的是两个对象像不像
4.在Object类中有一个equals方法,这个方法如果不重写,是按照==的比较规则进行比较的 */ //public class StringDemo extends Object{ // String name; // // @Override // public String toString() { // return “StringDemo{“ + // “name=’” + name + ‘\’’ + // ‘}’; // } //} public class StringDemo{ public static void main(String[] args) {
//创建字符串的对象--直接赋值方式String s1="hello";String s2="hello";String s3="HELLO";//boolean equals(Object):比较两个字符串的内容是不是相同(比较两个双胞胎像不像)System.out.println(s1.equals(s2));//trueSystem.out.println(s1.equals(s3));//falseSystem.out.println(s1.equalsIgnoreCase(s3));//true//boolean startWith(String str):判断这个字符串是不是以指定的str开头--大小写敏感System.out.println(s1.startsWith("h"));//true//boolean endWith(String str):判断这个字符串是不是以指定的str结束--大小写敏感System.out.println(s1.endsWith("o"));//true
判断功能案例
需求:模拟登录,给三次机会,并提示还有几次 ```java package com.igeek_04;
/**
- @author Lynn
- @create 2020-11-26-20:42 */
import java.util.Scanner;
/**
- 需求:模拟登录,给三次机会,并提示还有几次
- 分析:
- A:定义两个字符串对象,用于存储已经存在的用户名和密码
- B:键盘录入用户名和密码
- C:拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
- 如果内容相同,提示登录成功
- 如果内容不同,提示登录失败,并提示还有几次机会 */ public class Test { public static void main(String[] args) { //定义两个字符串对象,用于存储已经存在的用户名和密码 String username=”wlll”; String userpswd=”wlll”;
//给三次机会,用for循环实现for (int i = 0; i <3 ; i++) {//键盘录入用户名和密码Scanner sc=new Scanner(System.in);System.out.println("请输入用户名");String name=sc.nextLine();System.out.println("请输入密码");String pswd=sc.nextLine();//拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较if (username.equals(name) && userpswd.equals(pswd)){System.out.println("登录成功!");break;}else if (i==2){System.out.println("用户名和密码被锁定,请与管理员联系!");}else {System.out.println("登录失败,你还有"+(2-i)+"次机会!");//2,1,0//break;}}}
}
<a name="aXBvn"></a>### String类的获取功能String类的获取功能:- int length():获取字符串的长度,其实也就是字符个数- char charAt(int index):获取指定索引处的字符- int indexOf(String str):获取str在字符串对象中第一次出现的索引- String substring(int start):从start开始截取字符串- String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end```javapackage com.igeek_02_04;/*** @ClassName: StringDemo* @Description: String类的获取功能* @date 2017年11月11日 上午11:03:08* Company www.igeekhome.com** String类的获取功能:* int length():获取字符串的长度,其实也就是字符个数* char charAt(int index):获取指定索引处的字符* int indexOf(String str):获取str在字符串对象中第一次出现的索引* String substring(int start):从start开始截取字符串* String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end*/public class StringDemo {public static void main(String[] args) {//创建字符串对象String s = "helloworld";//int length():获取字符串的长度,其实也就是字符个数System.out.println(s.length());System.out.println("--------");//char charAt(int index):获取指定索引处的字符System.out.println(s.charAt(0));System.out.println(s.charAt(1));System.out.println("--------");//int indexOf(String str):获取str在字符串对象中第一次出现的索引System.out.println(s.indexOf("l"));System.out.println(s.indexOf("owo"));System.out.println(s.indexOf("ak"));System.out.println("--------");//String substring(int start):从start开始截取字符串System.out.println(s.substring(0));System.out.println(s.substring(5));System.out.println("--------");//String substring(int start,int end):从start开始,到end结束截取字符串System.out.println(s.substring(0, s.length()));System.out.println(s.substring(3,8));}}
案例
package com.igeek_02_04;/*** @ClassName: StringTest* @Description: 遍历字符串(获取字符串中的每一个字符)* @date 2017年11月11日 上午11:09:15* Company www.igeekhome.com**/public class StringTest {public static void main(String[] args) {//创建一个字符串对象String s = "abcde";//原始做法System.out.println(s.charAt(0));System.out.println(s.charAt(1));System.out.println(s.charAt(2));System.out.println(s.charAt(3));System.out.println(s.charAt(4));System.out.println("---------");//用for循环改进for(int x=0; x<5; x++) {System.out.println(s.charAt(x));}System.out.println("---------");//用length()方法获取字符串的长度for(int x=0; x<s.length(); x++) {System.out.println(s.charAt(x));}}}
package com.igeek_02_04;import java.util.Scanner;/*** @ClassName: StringTest2* @Description: 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)* @date 2017年11月11日 上午11:10:44* Company www.igeekhome.com** 分析:* A:键盘录入一个字符串数据* B:定义三个统计变量,初始化值都是0* C:遍历字符串,得到每一个字符* D:拿字符进行判断* 假如ch是一个字符。* 大写:ch>='A' && ch<='Z'* 小写:ch>='a' && ch<='z'* 数字:ch>='0' && ch<='9'* E:输出结果*/public class StringTest2 {public static void main(String[] args) {//键盘录入一个字符串数据Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串数据:");String s = sc.nextLine();//定义三个统计变量,初始化值都是0int bigCount = 0;int smallCount = 0;int numberCount = 0;//遍历字符串,得到每一个字符for(int x=0; x<s.length(); x++) {char ch = s.charAt(x);//拿字符进行判断if(ch>='A' && ch<='Z') {bigCount++;}else if(ch>='a' && ch<='z') {smallCount++;}else if(ch>='0' && ch<='9') {numberCount++;}else {System.out.println("该字符"+ch+"非法");}}//输出结果System.out.println("大写字符:"+bigCount+"个");System.out.println("小写字符:"+smallCount+"个");System.out.println("数字字符:"+numberCount+"个");}}
String类的转换功能
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串
案例
package com.igeek_02_05;/*** @ClassName: StringDemo* @Description: String类的转换功能* @date 2017年11月11日 上午11:13:33* Company www.igeekhome.com** String类的转换功能:* char[] toCharArray():把字符串转换为字符数组* String toLowerCase():把字符串转换为小写字符串* String toUpperCase():把字符串转换为大写字符串** 字符串的遍历:* A:length()加上charAt()* B:把字符串转换为字符数组,然后遍历数组*/public class StringDemo {public static void main(String[] args) {//创建字符串对象String s = "abcde";//char[] toCharArray():把字符串转换为字符数组char[] chs = s.toCharArray();for(int x=0; x<chs.length; x++) {System.out.println(chs[x]);}System.out.println("-----------");//String toLowerCase():把字符串转换为小写字符串System.out.println("HelloWorld".toLowerCase());//String toUpperCase():把字符串转换为大写字符串System.out.println("HelloWorld".toUpperCase());}}
package com.igeek_02_05;import java.util.Scanner;/*** @ClassName: StringTest* @Description: 键盘录入一个字符串,把该字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)* @date 2017年11月11日 上午11:16:20* Company www.igeekhome.com** 分析:* A:键盘录入一个字符串* B:截取首字母* C:截取除了首字母以外的字符串* D:B转大写+C转小写* E:输出即可*/public class StringTest {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);//B转大写+C转小写String s3 = s1.toUpperCase()+s2.toLowerCase();//输出即可System.out.println("s3:"+s3);}}
String类的其它功能
去除字符串两端空格
String trim()
按照指定符号分割字符串
String[] split(String str)
案例
package com.igeek_02_06;/*** @ClassName: StringDemo* @Description: String类的其它功能* @date 2017年11月11日 上午11:18:31* Company www.igeekhome.com** 去除字符串两端空格* String trim()* 按照指定符号分割字符串* String[] split(String str)*/public class StringDemo {public static void main(String[] args) {//创建字符串对象String s1 = "helloworld";String s2 = " helloworld ";String s3 = " hello world ";System.out.println("---"+s1+"---");System.out.println("---"+s1.trim()+"---");System.out.println("---"+s2+"---");System.out.println("---"+s2.trim()+"---");System.out.println("---"+s3+"---");System.out.println("---"+s3.trim()+"---");System.out.println("-------------------");//String[] split(String str)//创建字符串对象String s4 = "aa,bb,cc";String[] strArray = s4.split(",");for(int x=0; x<strArray.length; x++) {System.out.println(strArray[x]);}}}
String类的其它案例
package com.igeek_02_06;/*** @ClassName: StringTest* @Description: 把数组中的数据按照指定个格式拼接成一个字符串* @date 2017年11月11日 上午11:20:04* Company www.igeekhome.com** 举例:int[] arr = {1,2,3};* 输出结果:[1, 2, 3]** 分析:* A:定义一个int类型的数组* B:写方法实现把数组中的元素按照指定的格式拼接成一个字符串* C:调用方法* D:输出结果*/public class StringTest {public static void main(String[] args) {//定义一个int类型的数组int[] arr = {1,2,3};//写方法实现把数组中的元素按照指定的格式拼接成一个字符串//调用方法String s = arrayToString(arr);//输出结果System.out.println("s:"+s);}/** 两个明确:* 返回值类型:String* 参数列表:int[] arr*//*** @Title: arrayToString* @Description: 数组转成字符串* @param arr* @return*/public static String arrayToString(int[] arr) {String s = "";//[1, 2, 3]s += "[";for(int x=0; x<arr.length; x++) {if(x==arr.length-1) {s += arr[x];}else {s += arr[x];s += ", ";}}s += "]";return s;}}
字符串反转
package com.igeek_02_06;import java.util.Scanner;/*** @ClassName: StringTest2* @Description: 字符串反转* @date 2017年11月11日 上午11:23:19* Company www.igeekhome.com** 举例:键盘录入”abc”* 输出结果:”cba”** 分析:* A:键盘录入一个字符串* B:写方法实现字符串的反转* a:把字符串倒着遍历,得到的每一个字符拼接成字符串。* b:把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串* C:调用方法* D:输出结果*/public class StringTest2 {public static void main(String[] args) {//键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.nextLine();//写方法实现字符串的反转//调用方法String result = reverse(s);//输出结果System.out.println("result:"+result);}/** 把字符串倒着遍历,得到的每一个字符拼接成字符串。** 两个明确:* 返回值类型:String* 参数列表:String s*//*public static String reverse(String s) {String ss = "";for(int x=s.length()-1; x>=0; x--) {ss += s.charAt(x);}return ss;}*//*** @Title: reverse* @Description: 把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串* @param s* @return*/public static String reverse(String s) {//把字符串转换为字符数组char[] chs = s.toCharArray();//对字符数组进行反转for(int start=0,end=chs.length-1; start<=end; start++,end--) {char temp = chs[start];chs[start] = chs[end];chs[end] = temp;}//最后在把字符数组转换为字符串String ss = new String(chs);return ss;}}
1.3 StringBuilder类
StringBuffer和StringBuilder的区别:
- 1.StringBuffer是可追加的字符串,使用的方式和StringBuilder完全一样
- 2.区别:
- StringBuilder是jdk5.0推出的,线程不安全,但是效率高,优先选择使用
- StringBuffer是jdk1.0推出的,线程是安全的,但是效率低(非特殊情况,可以不使用)
- 3.Java在当初设计的时候做了过度设计,所以在jdk5.0的时候就推出了StringBuilder
- 线程安全:一群人过安检—一个一个的过
- 线程不安全:一群难民抢馒头吃 ```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-25-10:04 */
/**
- StringBuffer和StringBuilder的区别:
- 1.StringBuffer是可追加的字符串,使用的方式和StringBuilder完全一样
- 2.区别:
- StringBuilder是jdk5.0推出的,线程不安全,但是效率高,优先选择使用
- StringBuffer是jdk1.0推出的,线程是安全的,但是效率低(非特殊情况,可以不使用)
- 3.Java在当初设计的时候做了过度设计,所以在jdk5.0的时候就推出了StringBuilder *
- 线程安全:一群人过安检—一个一个的过
线程不安全:一群难民抢馒头吃 / public class StringBufferDemo { public static void main(String[] args) {
//创建对象StringBuffer sb=new StringBuffer();//不需要导包,就属于lang包//StringBuilder sb=new StringBuilder();结果一样//链式编程sb.append("黄药师,").append("洪七公,").append("欧阳锋,").append("段王爷,").append("王重阳");System.out.println(sb);
StringBuilder类概述
StringBuilder:是一个可变的字符串。字符串缓冲区类。
String和StringBuilder的区别:
String的内容是固定的
StringBuilder的内容是可变的StringBuilder类的常用方法
A:构造方法:
StringBuilder()
B:成员方法:
public int capacity():返回当前容量 (理论值)
public int length():返回长度(已经存储的字符个数)
public StringBuilder append(任意类型):添加数据,并返回自身对象
public StringBuilder reverse():反转功能 ```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-25-10:17 */
/**
- StringBuilder:是一个可变长度的字符串 *
- 构造函数:StringBuilder()
- 常用的成员方法:
- public int capacity():返回当前的容量—理论值(默认值—16)
- public int length():返回长度(字符数)—实际值
*/
public class StringBuilderDemo {
public static void main(String[] args) {
} } ```//创建对象StringBuilder sb=new StringBuilder();System.out.println(sb);//空的可变字符串System.out.println("sb.capacity():"+sb.capacity());//16 --默认值System.out.println("sb.length():"+sb.length());//0
```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-25-10:26 */
/**
- 其他的用法:
- 1.添加功能:append(任意类型的数据)
2.反转功能:reverse() */ public class StringBuilderDemo02 { public static void main(String[] args) {
//创建对象StringBuilder sb=new StringBuilder();//添加StringBuilder sb2=sb.append("你好");//输出结果System.out.println("sb:"+sb);//sb:你好System.out.println("sb2:"+sb2);//sb2:你好System.out.println(sb==sb2);//true//StringBuilder中的append方法会将所有的追加的元素统一转换为字符串进行处理--其实际效果就是:任意类型的数据+“sb.append(true);sb.append(9999);sb.append("王嘉尔");System.out.println(sb);//你好true9999王嘉尔//反转功能sb.reverse();System.out.println(sb);//尔嘉王9999eurt好你
案例
```java package com.igeek_02;
/**
- @author Lynn
- @create 2020-11-25-10:43 */
import java.util.Scanner;
/**
- 回文:
- 上海自来水来自海上 *
- 判断是不是回文
- 是:返回true
否:返回false */ public class Test { public static void main(String[] args) {
//作用:程序的主入口,在业务逻辑中调用层--main方法中的业务逻辑越少越好Scanner sc=new Scanner(System.in);System.out.println("请输入字符串:");String s=sc.nextLine();//调用方法boolean flag=isSymmetry(s);//s表示通过sc获取到的字符串System.out.println(flag);sc.close();
// StringBuilder sb=new StringBuilder(“上海自来水来自海上”); // StringBuilder sb2=new StringBuilder(sb.reverse()); // // System.out.println(); // System.out.println(sb.equals(sb2));//true
// sb.append(12321); // System.out.println(sb.reverse()); // System.out.println(sb==sb.reverse()); // System.out.println(“————————————————“); // // System.out.println(sb2.reverse()); // System.out.println(sb2==sb2.reverse()); } //封装一个方法—业务逻辑的封装—封装的越彻底越好 public static boolean isSymmetry(String s){ //逻辑代码—把字符串进行反转,之后的结果相同 //String转化成StringBuilder—再调用reverse()—再转回String //通过构造函数 StringBuilder sb=new StringBuilder(s); sb.reverse(); //转回String String result= sb.toString();
//比较结果是不是一样,--两个字符串是不是一样(反转前后)//result是经过反转之后的字符串//s是sc获取到用户输入的字符串return result.equals(s);}
} ```
,
