String的操作
基础操作
String类的构造方法很多。可以通过初始化一个字符串,或者字符数组,或者字节数组等等来创建一个String对象
常见方法
1、length()2、substring(int)/(int,int)3、charAt(int index):char4、indexOf(int ch) 和 indexOf(int ch, int fromIndex) 方法5、equals(String):boolean 比较两个字符串的内容是否相等6、split(String regex)指定分割
package com.yan1;
public class Test2 {
public static void main(String[] args) {
String s1 = "问到了jzkjcadxk";
System.out.println(s1.length()); // 获取字符个数,不区分中英文
System.out.println(s1.charAt(0)); // 获取指定下标位置上的字符
for (int i = 0; i < s1.length(); i++) {
char cc = s1.charAt(i);
System.out.println(cc + "----" + (int) cc);
}
}
}
package com.yan2;
public class Test1 {
public static void main(String[] args) {
String ss = "TODO Auto-generated method stub";
// 获取字符串中的一部分内容
String tmp = ss.substring(2);
System.out.println(tmp);
tmp = ss.substring(2, 8);
System.out.println(tmp);
// tmp = ss.substring(2, 100);
// System.out.println(tmp);//语法错误
}
}
package com.yan2;
public class Test2 {
public static void main(String[] args) {
String ss = "TODO Auto-generated menethod steneub";
int pos = ss.indexOf("ene"); // 从原始串中查找ene第一次出现的下标位置
System.out.println(pos);
pos = ss.indexOf("ene", pos + 1); // 查找下一个
System.out.println(pos);
pos = ss.lastIndexOf("ene"); // 从后向前找
System.out.println(pos);
pos = ss.indexOf("abc");
System.out.println(pos); // 如果查找不到则返回-1
}
}
package com.yan2;
public class Test5 {
public static void main(String[] args) {
String ss = "TODO Auto-generated menethod steneub";
String[] arr = ss.split("ene");// 指定分割
for (String temp : arr) {
System.out.println(temp);
}
// System.out.println(Arrays.toString(arr));
}
}
字符串常量拼接,在方法区的常量池中完成
String类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果。是在堆中的新对象
字符串转数字
使用Scanner读取键盘录入数据
next():String 当光标扫描到第一个分隔符(默认是空格)停止扫描,会创建一个 String 类的对象,里面存储的就是扫描的内容(不包含空格分隔符)返回创建的String 对象的引用给 n
nextLine(): 读取输入,包括单词之间的空格和除回车以外的所有符号 ( 即。它读到行尾 ) 。读取输入后, nextLine() 将光标定位在下一行。所以它和 next() 的区别就是它没有分隔符,直接扫描全部的键盘输入内容,并创建对象进行将其引用返回
目标类型名 .parse 类型 (String)Integer.parsetInt(String):intDouble.parsetDouble(String):double
public class Test1{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int kk=1;
String ss=sc.nextLine();
kk=Integer.parseInt(ss);
}
}
数字转字符串
""+任意类型数据
字符串新方法
String.repeat(int) 根据 int 参数的值重复 StringString.lines() 拆分由其行终止符在其上调用的 String ,并返回由这些行终止符划分的String.strip() 、 String.stripLeading() 和 String.stripTrailing() 去除字符串的空格String.isBlank() 判断 String 是否为空或仅包含空格字符
具体实现原理
在
JDK1.8
以前采用
char[]
实现,现在采用
byte[]
的方式实现。可以减少字符串占用的内存,同时减少垃圾回收次数。
实际开发中单字节的字符使用频率远高于双字节的。在
JDK8+
版本中
Java
会根据字符串内容自动设置为相应的编码,要么 Latin-1
要么
UTF16
,中文是两个字节,纯英文是一个字节。
不使用
UTF-8
编码字符集是因为
UTF-8
是变长编码的,有
1
、
2
、
3
、
4
字节的不同情况,所以对于
String
随机访问操作很不方便
UTF-16
也是变长编码,是使用
2
或者
4
个字节存储字符。对于
Unicode
编码在
0-FFFF
之间的字符使用两个字节存储,而10000-10FFFF
之间的字符使用
4
个字节。但是
Java
中一个
char
就是
2
个字节,同时
String
的各种操作都是以Java
字符为单位的,所以
UTF-16
在
Java
中可以看作一个定长的编码
例题一:打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。
package com.yan3;
public class Test2 {
public static void main(String[] args) {
// 打印5位数的回文数 1234321 124421,每行打印10个,总共多少个回文数
int ccc = 0;
for (int k = 10000; k < 100000; k++) {
String ss = "" + k;
String s2 = "";
for (int i = 0; i < ss.length(); i++) {
char cc = ss.charAt(i);
s2 = cc + s2;
// s2+=cc; //语法错误?
}
if (ss.equals(s2)) {
System.out.print(k + "\t");
ccc++;
if (ccc % 10 == 0)
System.out.println();
}
}
System.out.println("回文数一共有" + ccc + "个");
}
}
例题二:根据键盘录入的数值1、2、3、4,…7输出对应的星期一、星期二、星期三…星期日
package com.yan3;
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
// 根据键盘录入的数值1、2、3、4,…7输出对应的星期一、星期二、星期三…星期日
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字:");
int kk = 1;
while (true) {
String ss = sc.nextLine();
kk = Integer.parseInt(ss);
if (kk < 1 || kk > 7)
System.out.println("输入的数据不合法!");
else
break;
}
String ss = "";
switch (kk) {
case 1:
ss = "星期一";
break;
case 2:
ss = "星期二";
break;
case 3:
ss = "星期三";
break;
case 4:
ss = "星期四";
break;
case 5:
ss = "星期五";
break;
case 6:
ss = "星期六";
break;
default:
ss = "星期天";
break;
}
System.out.println(ss);
}
}
或者也可用String类型来输出对应
package com.yan3;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
// 根据键盘录入的数值1、2、3、4,…7输出对应的星期一、星期二、星期三…星期日
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字:");
int kk = 1;
while (true) {
String ss = sc.nextLine();
kk = Integer.parseInt(ss);
if (kk < 1 || kk > 7)
System.out.println("输入的数据不合法!");
else
break;
}
String tt = "一二三四五六天";
String ss = "星期" + tt.charAt(kk - 1);
System.out.println(ss);
}
}
例题三:键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。学生的分数取值范围[0,100]
package com.yan1;
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
// 3、键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。学生的分数取值范围[0,100]
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生成绩:");
int score = sc.nextInt();
if (score < 0 || score > 100) {
System.out.println("输入的数据不合法!");
} else {
if (score >= 90)
System.out.println("优秀");
else if (score >= 80)
System.out.println("良好");
else if (score >= 70)
System.out.println("中等");
else if (score >= 60)
System.out.println("及格");
else
System.out.println("不及格");
}
sc.close();
}
}
例题四:输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。
延伸题:输出菱形,菱形空心
package com.yan1;
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
// 4、输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。
Scanner sc = new Scanner(System.in);
System.out.println("请输入行数:");
int k = sc.nextInt();
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k - i; j++) {
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
sc.close();
}
}
package com.yan2;
import java.util.Scanner;
public class check1 {
public static void main(String[] args) {
// 菱形
Scanner sc = new Scanner(System.in);
System.out.println("请输入行数:");
int k;
while (true) {
k = sc.nextInt();
if (k >= 1 && k < (Integer.MAX_VALUE / 2))
break;
else
System.out.println("输入的数据不合法");
}
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k - i; j++)
System.out.print(" ");
for (int j = 1; j <= 2 * i - 1; j++)
System.out.print("*");
System.out.println();
}
for (int i = k - 1; i >= 1; i--) {
for (int j = 1; j <= k - i; j++)
System.out.print(" ");
for (int j = 1; j <= 2 * i - 1; j++)
System.out.print("*");
System.out.println();
}
// System.out.println(Integer.MAX_VALUE);
}
}
package com.yan2;
import java.util.Scanner;
public class check2 {
public static void main(String[] args) {
// 菱形空心
Scanner sc = new Scanner(System.in);
System.out.println("请输入行号:");
int k = sc.nextInt();
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= k - i; j++)
System.out.print(" ");
System.out.print("*");
int kk = 2 * (i - 1) - 1;
if (kk > 0) {
for (int j = 1; j <= kk; j++)
System.out.print(" ");
System.out.print("*");
}
System.out.println();
}
for (int i = k - 1; i >= 1; i--) {
for (int j = 1; j <= k - i; j++)
System.out.print(" ");
System.out.print("*");
int kk = 2 * (i - 1) - 1;
if (kk > 0) {
for (int j = 1; j <= kk; j++)
System.out.print(" ");
System.out.print("*");
}
System.out.println();
}
}
}