【Java】String的操作以及知识点回顾

String的操作以及知识点回顾

基础操作,后续在面向对象章节细讲
String 类的构造方法很多。可以通过初始化一个字符串,或者字符数组,或者字节数组等等来创建一个String 对象

常见方法
  • length()
  • substring(int)/(int,int)
  • charAt(int index):char
  • indexOf(int ch) 和 indexOf(int ch, int fromIndex) 方法
  • equals(String):boolean比较两个字符串的内容是否相等
  • split(String regex)
考试常见方法:intern() 方法
String s1="ab"+"c";
String s2="abc";
System.out.println(s1==s2); //true

字符串常量拼接,在方法区的常量池中完成

String s0="ab";
String s1=s0+"c";
String s2="abc";
System.out.println(s1==s2); //false

String类型的拼接是通过StringBuilder类中的append方法实现的,然后返回toString的结果。是在堆中
的新对象

字符串转数字

使用Scanner读取键盘录入数据

  • next():String 当光标扫描到第一个分隔符(默认是空格)停止扫描,会创建一个String类的对象,里面存储的就是扫描的内容(不包含空格分隔符)返回创建的String对象的引用给n
Scanner cin=new Scanner(System.in);
while (true) {
String n = cin.next();
if("exit".equals(n))
break;
System.out.println(n + 'A');
}
cin.close();
  • nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号(即。它读到行尾)。读取输入后,nextLine()将光标定位在下一行。所以它和next()的区别就是它没有分隔符,直接扫描全部的键盘输入内容,并创建对象进行将其引用返回

  • 目标类型名.parse类型(String)

  • Integer.parsetInt(String):int
  • Double.parsetDouble(String):double
数字转字符串

“”+任意类型数据

字符串新方法
  • String.repeat(int) 根据 int 参数的值重复 String
  • String.lines() 拆分由其行终止符在其上调用的 String ,并返回由这些行终止符划分的Strings Stream 。具体使用以后再说
  • 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中可以看作一个定长的编码

练习题(往期知识点回顾)

1、打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。

		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;
			}
			for (int i = 0; i < ss.length(); i++) {
				char cc = ss.charAt(i);
				s2 = cc + s2;
			}
			if (ss.equals(s2)) {
				System.out.print(k + "\t");
				ccc++;
				if (ccc % 10 == 0)
					System.out.println();
			}
		}
		System.out.println("\n共总有" + ccc + "个回文数!");

注:回文数即正反读都是一个数,5位数的话,只要个位与万位相同,十位与千位相同就是一个回文数。
2、根据键盘录入的数值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 riqi = "一二三四五六日";
		String cc = "星期"+riqi.charAt(kk-1);
		System.out.println(cc);

3、键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。学生的分数取值范围[0,100]
分数大于等于90的,评级"优秀";
分数大于等于80,小于90的,评级"良好";
分数大于等于70,小于80的,评级"中等";
分数大于等于60,小于70的,评级"及格";
分数小于60的,评级"不及格";

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入成绩:");
		int score = sc.nextInt();
		if (score > 100 && score <= 0) {
			System.out.println("输入不合法");
		} else {
			switch (score / 10) {
			case 10:
				System.out.println("优秀");
				break;
			case 9:
				System.out.println("优秀");
				break;
			case 8:
				System.out.println("良好");
				break;
			case 7:
				System.out.println("中等");
				break;
			case 6:
				System.out.println("及格");
				break;

			default:
				System.out.println("不及格");
				break;
			}
		}

4、输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。

public static void main(String[] args) {
		
		//杨辉三角
		
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入行数:");
		int num = sc.nextInt();

		for (int i = 1; i <= num; i++) {
			for (int j = 1; j <= num - i; j++) {
				System.out.print(" ");
			}
			for (int m = 1; m <= i * 2 - 1; m++)
				System.out.print("·");
			System.out.println();
		}
	}

5、求完数。一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完
数"。请编程求出1000 以内的所有完数。

public class test11 {

	public static void main(String[] args) {
		// 完数
		for (int k = 1; k < 1000; k++) {
			int cc = 0;
			String ss="";
			for (int i = 1; i < k; i++) {
				if (k % i == 0) {				
					cc += i;
				}

			}
			if (k == cc)
				System.out.println(k + "是完数");
		}
	}
}

6、有1、2、3、4一共四个数字,能组成多少个不相等且无重复数字的三位数?都是多少?
注:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的就可以了。

public class test12 {

	public static void main(String[] args) {
		//
		int cc=0;
		String ss="";
		int sum = 0;
		for (int i = 1; i <= 4; i++) {
			for (int j = 1; j <= 4; j++) {
				for (int k = 1; k <= 1; k++) {
					if (i != j && j != k && k != i) {					
							System.out.print(i + "" + j + "" + k+"\t");
							ss+=(i+""+j+""+k+"+");
							sum+=(i%100+j*10+k);
							cc++;
							if(cc%3==0)
								System.out.println();
						}
					}
				}
			}
		ss=ss.substring(0,ss.length()-1)+"="+sum;
		System.out.println(ss);
		}

	}

7、键盘录入一个正整数,请求:1.它是几位数?2.逆序打印出各位数字。

public class test13 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入一个正整数:");

		int num = sc.nextInt();
		String ss = "" + num;
		String cc = "";
		for (int i = ss.length() - 1; i >= 0; i--) {
			cc += ss.charAt(i);
		}
		System.out.println(ss + "有" + ss.length() + "位数");
		System.out.println(ss + "的逆序为" + cc);
	}
}

8、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13。求出这个数列的前20项之和。
注:提前告诉答案是32.66026079864164

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n1 = 2, n2 = 3, n3 = 1, n4 = 2;
		int n = 0, m = 0;
		double sum = 1. * n1 / n3 + 1. * n2 / n4;
		for (int i = 1; i < 21; i++) {
			n = n1 + n2;
			m = n3 + n4;
			System.out.println(n + "/" + m);
			sum += 1. * n / m;
			n1 = n2;			
			n3 = n4;
			n2 = n;
			n4 = m;
		}
		System.out.println(sum);
	}

9、一个整数,它加上100或者268后都是一个完全平在这里插入代码片方数,请问在1万以内,这样的数有几个,分别是多少?

public class Test9 {
	public static void main(String[] args) {
		for (int k = 1; k < 10000; k++) {
			
			int k1=k+100;
			boolean bb1=false;
			int dd = (int) Math.sqrt(k1);
			if (dd * dd == k1) {
				bb1=true;
			}
			
			int k2=k+268;
			dd = (int) Math.sqrt(k1);
			boolean bb2=false;
			if (dd * dd == k1) {
				bb2=true;
			}
			if(bb1||bb2) {
				System.out.println(k);
			}
		}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值