第十一次课总结(下篇)

第十一次课的下篇主要讲到了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;
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值