JAVASE基础模块十五(scanner类 String类 String 方法)
scanner类
-
Scanner(InputStream source) 构造一个新的scanner 它生成的值是从指定的输入流扫描的
-
in public static final InputStream in 标准输入流 此流已打开并准备提供输入数据
-
nextxxx的方法
- scanner.nextInt();
- scanner.nextDouble();
- scanner.nextLine();
-
使用hasNextInt()输入数据是否符合我们得需求
import java.io.InputStream; import java.util.Scanner; public class Scan { public static void main(String[] args) { InputStream in = System.in; Scanner scanner = new Scanner(in); System.out.println("请输入数据"); if (scanner.hasNextInt()) { int i = scanner.nextInt(); } else { System.out.println("输入的类型有误"); } scanner.close(); } } 请输入数据 k 输入的类型有误 Process finished with exit code 0 请输入数据 5 Process finished with exit code 0
-
当你先录入整数使用nextline再录入字符串时 会发现字符串没让你录入
- 原因是 回车换行被默认当做字符串录入
- 解决方法
- 录字符串时再创建一个scanner对象
- 可以使用next()方法来录入字符串 sc.next()方法
- sc.next()方法 不会录入空格 从空格后就不会录入
import java.util.Scanner; public class Scan { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int i; System.out.println("请输入数据1"); while (true) { try { i = scanner.nextInt(); System.out.println(i); break; } catch (Exception e) { System.out.println("输入的类型有误"); System.out.println("请再次输入"); scanner = new Scanner(System.in); } } Scanner scannerxx = new Scanner(System.in); System.out.println("请输入数据2"); while (true) { try { String s = scannerxx.nextLine(); System.out.println(s); break; } catch (Exception e) { System.out.println("输入的类型有误"); System.out.println("请再次输入"); scannerxx = new Scanner(System.in); } } Scanner scannerx = new Scanner(System.in); System.out.println("请输入数据3"); while (true) { try { String s = scannerx.next(); System.out.println(s); break; } catch (Exception e) { System.out.println("输入的类型有误"); System.out.println("请再次输入"); scannerx = new Scanner(System.in); } } scanner.close(); scannerx.close(); } } 运行结果: 请输入数据1 k 输入的类型有误 请再次输入 k 输入的类型有误 请再次输入 5 5 请输入数据2 ccc vvc cc ccc vvc cc 请输入数据3 ccc ccc cccddd ff ccc Process finished with exit code 0
-
将此方法抽成工具类
import java.util.Scanner;
public class ScannerUtils {
private ScannerUtils() {
}
public static int geiNum(Scanner scanner){
int i;
System.out.println("请输入数据1");
while (true) {
try {
i = scanner.nextInt();
System.out.println(i);
break;
} catch (Exception e) {
System.out.println("输入的类型有误");
System.out.println("请再次输入");
scanner = new Scanner(System.in);
}
}
return i;
}
}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = ScannerUtils.geiNum(scanner);
}
}
运行结果:
请输入数据1
h
输入的类型有误
请再次输入
g
输入的类型有误
请再次输入
f
输入的类型有误
请再次输入
d
输入的类型有误
请再次输入
s
输入的类型有误
请再次输入
d
输入的类型有误
请再次输入
5
5
进程已结束,退出代码0
String类
-
定义 字符串 就是由一个或者多个字符组成的序列
-
字符串可以看做是字符数组 每一个字符从左往右编有索引 从0开始
-
String类代表字符串
-
Java程序中所有的字符串字面值都作为此类的实例实现
"abc".length();//获取字符串长度
-
字符串是常量 它们的值在创建后不能更改
public class Chang { public static void main(String[] args) { String s="hello"; s="world"+"java"; System.out.println(s); } } 运行结果: worldjava 进程已结束,退出代码0
-
+ 理解是 字符串创建后便存在一个独立的地址空间 进行字符串的变换其实是重新创建一个新地址空间存放新字符串 然后对象指向新地址空间 原地址空间内的字符串并没有被改变
-
String()初始化一个新创建的String对象 使其表示一个空字符序列
-
String类重写了父类的toString方法 打印的是字符串字面值
public class Str { public static void main(String[] args) { String s = new String("asdfdg"); System.out.println(s); } } 运行结果: asdfdg 进程已结束,退出代码0
-
public String(byte[] bytes);把字节数组转换string字符串
import java.lang.reflect.Array; public class Str { public static void main(String[] args) { byte[] bytes={-26,-120,-111,97,99,103,105,65}; String s1 = new String(bytes); System.out.println(s1); String s3 = new String(bytes,0,3); System.out.println(s3); byte[] bytesx="我".getBytes(); byte[] bytesxx="爱".getBytes(); byte[] bytesxxx="你".getBytes(); String s2 = new String(bytesx); System.out.println(Array.getByte(bytesx,0)); System.out.println(Array.getByte(bytesxx,0)); System.out.println(Array.getByte(bytesxxx,0)); } } 运行结果: 我acgiA 我 -26 -25 -28 进程已结束,退出代码0
-
把字符数组转换成字符串
public class Cha { public static void main(String[] args) { char[] charx={'我','爱','你'}; String s1 = new String(charx); System.out.println(s1); String s2 = new String(charx,0,1); System.out.println(s2); } } 运行结果: 我爱你 我 进程已结束,退出代码0
-
面试题解析 有何区别
public class Chang { public static void main(String[] args) { String s = new String("abc"); String s1="abc";}} 1. 创建了两个对象 s--2--1:abc 2. 创建了一个对象s1---1:abc public class Chang { public static void main(String[] args) { String s = new String("abc"); String s1="abc"; String s2="abc"; System.out.println(s==s1); System.out.println(s1==s2);}} 1. false 两者地址值不同 2. true 优化 abc在字符串常量池中不会再次创建 占用内存 直接引用
-
string类已经重写了equals()方法 不再比较地址值 而是比较字符串值
-
intern() 取出这个字符串常量的在内存池的地址值
String 方法
- equals()方法 判断两个字符串字面上内容是否相等 区分大小写
public class Chang {
public static void main(String[] args) {
String s = new String("abc");
String s1="abc";
String s2="Abc";
System.out.println(s.equals(s1));
System.out.println(s2.equals(s1));
}
}
运行结果:
true
false
进程已结束,退出代码0
- equalsIgnoreCase()
public class Chang {
public static void main(String[] args) {
System.out.println("abc".equals("abc"));
System.out.println("Abc".equalsIgnoreCase("abc"));
}
}
运行结果:
true
true
进程已结束,退出代码0
- isEmpty()
public class Chang {
public static void main(String[] args) {
String s="";
System.out.println(s.isEmpty());
}
}
运行结果:
true
进程已结束,退出代码0
-
public class Chang { public static void main(String[] args) { String s="弎屲"; System.out.println(s.startsWith("弎")); System.out.println(s.endsWith("弎")); System.out.println(s.contains("屲")); } } 运行结果: true false true 进程已结束,退出代码0
-
import java.util.Scanner; public class X { public static void main(String[] args) { String name = "yuexi"; int pas = 6548231; Scanner sc = new Scanner(System.in); System.out.println("请输入用户名"); for (int i = 0; i < 99; i++) { String ad = sc.nextLine(); sc = new Scanner(System.in); if (ad.equals(name)) { System.out.println("用户名输入正确"); System.out.println("请输入密码"); break; } else { System.out.println("用户名输入错误"); System.out.println("请重新输入"); } } Scanner scx = new Scanner(System.in); for (int i = 0; i < 3; i++) { int nu = scx.nextInt(); scx = new Scanner(System.in); if (nu == pas) { System.out.println("密码输入正确"); System.out.println("登录成功"); break; } else { if (i < 2) { System.out.println("密码输入错误"); System.out.println("您还剩" + (3 - i) + "次机会,请重新输入"); } else { System.out.println("您已被冻结"); } } } } } 运行结果: 请输入用户名 yue 用户名输入错误 请重新输入 yie 用户名输入错误 请重新输入 yuexi 用户名输入正确 请输入密码 5648231 密码输入错误 您还剩3次机会,请重新输入 6548231 密码输入正确 登录成功 进程已结束,退出代码0
-
charAt() 获取字符串的单个字符
public class Cd {
public static void main(String[] args) {
System.out.println("abc".length());
String d="我爱你";
System.out.println(d);
System.out.println(d.charAt(0));
System.out.println(d.charAt(1));
System.out.println(d.charAt(2));
}
}
运行结果:
3
我爱你
我
爱
你
进程已结束,退出代码0
- indexof() 获取字符在字符串的索引
public class Cd {
public static void main(String[] args) {
System.out.println("abc".length());
String d="我爱你";
System.out.println(d);
System.out.println(d.indexOf('我'));
System.out.println(d.indexOf('爱'));
System.out.println(d.indexOf('你'));
}
}
运行结果:
3
我爱你
0
1
2
进程已结束,退出代码0
从指定索引处查找
public class Cd {
public static void main(String[] args) {
String d="我爱你我爱你我爱你";
System.out.println(d);
System.out.println(d.indexOf('我',d.indexOf("我")+1));
}
}
运行结果:
我爱你我爱你我爱你
3
进程已结束,退出代码0
- substring() 截取字符串
public class Cd {
public static void main(String[] args) {
String d="我爱你一生一世";
System.out.println(d);
System.out.println(d.substring(3,7));
}
}
运行结果:
我爱你一生一世
一生一世
进程已结束,退出代码0
- 遍历字符串
public class Cd {
public static void main(String[] args) {
String d="姐姐,山有木兮木有枝";
System.out.println(d);
for (int i = 0; i <d.length() ; i++) {
System.out.print(d.charAt(i)+"\t\t");
}
}
}
运行结果:
姐姐,山有木兮木有枝
姐 姐 , 山 有 木 兮 木 有 枝
进程已结束,退出代码0
- 大小写字母统计
public class Tj {
public static void main(String[] args) {
String str="gyfgagfuwhufhuAAEDDDFFDS";
int m=0,n=0;
for (int i = 0; i < str.length(); i++) {
char ch=str.charAt(i);
if(ch>='a'&&ch<='z'){
m++;
}else if(ch>='A'&&ch<='Z'){
n++;
}
}
System.out.println("大写字母"+m);
System.out.println("小写字母"+n);
}
}
运行结果:
大写字母14
小写字母10
进程已结束,退出代码0
- toUpperCase()
- toLowerCase()
- 数组转换
public class Cd {
public static void main(String[] args) {
String d="山有木兮木有枝";
byte[] b=d.getBytes();
System.out.println(d);
for (int i = 0; i <d.length() ; i++) {
System.out.print(b[i]+"\t\t");
}
System.out.println();
String s=new String(b);
System.out.println(s);
String dd="我爱你";
char[] c = dd.toCharArray();
for (int i = 0; i <dd.length() ; i++) {
System.out.print(c[i]+"\t\t");
}
System.out.println();
String s1=new String(c);
System.out.println(s1);
}
}
运行结果:
山有木兮木有枝
-27 -79 -79 -26 -100 -119 -26
山有木兮木有枝
我 爱 你
我爱你
进程已结束,退出代码0
- valueof() 把很多种类型转换成字符串
- concat() 拼接字符串
- 首字母大写 其余小写
public class Tj {
public static void main(String[] args) {
String str="gyDDfgagfEDuFFDSfhuAA";
System.out.println(str);
System.out.println(str.substring(0, 1).toUpperCase().concat(str.substring(1).toLowerCase()));
}
}
运行结果:
gyDDfgagfEDuFFDSfhuAA
Gyddfgagfeduffdsfhuaa
进程已结束,退出代码0
-
replace() 替换
public class Th { public static void main(String[] args) { String s="弎屲与海"; String s1=s.replace("弎屲", "月习").replace("海", "山"); System.out.println(s); System.out.println(s1); } } 运行结果: 弎屲与海 月习与山 进程已结束,退出代码0
-
trim() 去除字符串的两端空格
public class Th {
public static void main(String[] args) {
String s=" 弎屲 与海 ";
System.out.println(s.trim());
}
}
运行结果:
弎屲 与海
进程已结束,退出代码0