第十一次课的下篇主要讲到了StringBuffer、StringBuilder、Randomlei和BigDecimal类,以及几个综合性交强的作业,挑战作业的过程收获颇丰。
一、StringBuffer
1、用于表示字符串,内存使用优于String
2、字符串处理时,不生成新的对象,而是改变对象自身
3、适合字符串修改、插入、删除等操作
连接字符串的方法:append()
删除字符串的方法:deleteCharAt()
插入字符串的方法:insert()
字符串翻转的方法:reverse()
4、适合在多线程中使用,因为它是线程安全的
二、StringBuilder
1、使用与StringBuider兼容的API
2、线程不安全,适合在单线程的程序下使用,这种情况很普遍
3、性能优于StringBuffer
三、Random类
1、用于生成伪随机数,具有两个构造器
2、Random():使用默认的种子,以当前时间作为种子
3、Random(long seed): 需要显式传入种子
实现3位数的100个不重复数字的输出的例子:
package javaleiku_11th;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class TestRandom {
public static void main(String[] args) {
List<Integer> integers = new ArrayList<Integer>();
int count = 0;
int c = 0;
int num = 0;
for (int i = 0; i < 150; i++) {
num = (int)(Math.random() * 900 + 100);
c++;
if (!integers.contains(num)) {
integers.add(num);
count++;
//看循环了多少次
if (integers.size() == 100) {
System.out.println("循环次数 = " + c);
break;
}
}
}
for (Integer integer : integers) {
System.out.print(integer + " ");
}
System.out.println();
System.out.println("共" + count + "个100~1000范围内的不重复的3位数");
}
}
四、BigDecimal类
1、用于解决精度丢失的问题
2、BigDecimal提供了大量构造器用于创建对象
//三种构造对象的方式
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = BigDecimal.valueOf(0.01);
//不建议使用以下
BigDecimal b3 = new BigDecimal(0.05);
加减乘除运算:
System.out.println("0.05+0.01 = " +b1.add(b2) );
System.out.println("0.05-0.01 = " +b1.subtract(b2));
System.out.println("0.05*0.01 = " +b1.multiply(b2) );
System.out.println("0.05/0.01 = " +b1.divide(b2) );
3、创建BigDecimal对象时,不要直接使用double浮点数作为构造参数来调用BigDecimal构造器,否则同样会发生精度丢失的问题
五、作业(以下类均可作为工具类):
1、按照office word的标准字数统计方式,计算含有中文的字符串的实际长度。
ps:字符串里面可能包含数字,汉字,特殊字符
package homework;
import java.util.Arrays;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 按照office word的标准字数统计方式,计算含有中文的字符串的实际长度.
* ps:字符串里面可能包含数字,汉字,特殊字符
*
* 如:
* “Ab想cd ef”在word文档里面字数算4个
* “a啊啊”:3个
* “123qq”:2个
* “1,1.”:4个
* @author Administrator
*
*/
public class CountWordNumber {
public static void main(String[] args) {
System.out.print("请输入:");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
input = input.trim();
char [] chars = input.toCharArray();
// 法二:byte [] bytes = input.getBytes();
int inputStrLen = 0;
CountWordNumber CountWordNumber = new CountWordNumber();
// System.out.println(chars[0]);
// 法二:System.out.println(Byte.toString(bytes[0]));//acsii表中的对应int值
for (int i = 0; i < chars.length; i++) {
if (CountWordNumber.stringType(String.valueOf(chars[i])).equals(new String("en"))) {
//如word判断到"wor",即判断了一部分
if (i + 1 <= chars.length - 1 && CountWordNumber.stringType(String.valueOf(chars[i + 1])).equals(new String("en"))) {
continue;
}
//一个字母或如word判断到"d",即末尾
else {
inputStrLen++;
}
}
else if(CountWordNumber.stringType(String.valueOf(chars[i])).equals(new String("cn"))){
inputStrLen++;
}
else if(CountWordNumber.stringType(String.valueOf(chars[i])).equals(new String("num"))){
//如123判断到"12",即判断了一部分
if (i + 1 <= chars.length - 1 && CountWordNumber.stringType(String.valueOf(chars[i + 1])).equals(new String("num"))) {
continue;
}
//一个数字或如123判断到"3",即末尾
else {
inputStrLen++;
}
}
else if(CountWordNumber.stringType(String.valueOf(chars[i])).equals(new String("oth"))){
inputStrLen++;
}
//英文空格
else if(CountWordNumber.stringType(String.valueOf(chars[i])).equals(new String("sp"))){
continue;
}
}
if (inputStrLen != 0) {
System.out.println("字数为:" + inputStrLen);
}
}
public String stringType(String string) {
Pattern numPattern = Pattern.compile("^\\d$");
Pattern EnPattern = Pattern.compile("^[a-zA-Z]$");
Pattern CNPattern = Pattern.compile("^[\\u4e00-\\u9fa5]$");
Pattern othersPattern = Pattern.compile("[`~!!@#$¥%^&*()()_+-=\\[\\]{}\\|【】、;:;:\'\"“”,<《,>》。.??/]");
Pattern spacePattern = Pattern.compile("^\\s$");
// Pattern othersPattern = Pattern.compile("((?=[\\x21-\\x7e]+)[^A-Za-z0-9])");
Matcher numMatcher = numPattern.matcher(string);
Matcher EnMatcher = EnPattern.matcher(string);
Matcher CNMatcher = CNPattern.matcher(string);
Matcher othersMatcher = othersPattern.matcher(string);
Matcher spaceMatcher = spacePattern.matcher(string);
if (numMatcher.matches()) {
return "num";
}
else if (CNMatcher.matches()) {
return "cn";
}
else if (EnMatcher.matches()) {
return "en";
}
else if (othersMatcher.matches()) {
return "oth";
}
else if (spaceMatcher.matches()) {
return "sp";
}
return null;
}
}
2、设计一个工具类(通用),实现两个double类型数据的加减乘除运算。
要求:传入double类型数据,返回结果也是精确的double
ps:对于除法运算,需要考虑四舍五入问题
package homework;
import java.math.BigDecimal;
import java.util.Scanner;
public class ArithUtils {
public static void main(String[] args) {
System.out.println("请输入两个double类型的数字,中间以运算符号分隔,三者以空格相互分隔:");
Scanner scanner = new Scanner(System.in);
double d1 = scanner.nextDouble();
String operator = scanner.next();
double d2 = scanner.nextDouble();
ArithUtils arithUtils = new ArithUtils();
System.out.println("结果:"+arithUtils.bigDecimalArith(d1, d2, operator));
}
public double bigDecimalArith(double d1,double d2 ,String op) {
BigDecimal b1 = BigDecimal.valueOf(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
BigDecimal result = null;
switch (op) {
case "+":
result = b1.add(b2);
return result.doubleValue();
case "-":
result = b1.subtract(b2);
return result.doubleValue();
case "*":
result = b1.multiply(b2);
return result.doubleValue();
case "/":
result = b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
return result.doubleValue();
default:
break;
}
return 0;
}
}
3、随机生成n位数的实现代码:
package homework;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class GenerateAnyDigits {
public static void main(String[] args) {
System.out.println("请问你想生成几位数:");
Scanner scanner = new Scanner(System.in);
int pow = scanner.nextInt();
GenerateAnyDigits generateAnyDigits = new GenerateAnyDigits();
System.out.println("结果:" + generateAnyDigits.generateAnyDigits(pow));
}
public long generateAnyDigits(int pow) {
long result = 0;
result = (long)(Math.random() * 9 * Math.pow(10, pow - 1) + Math.pow(10, pow - 1));
if (result != 0) {
return result;
}
return 0;
}
}