Java学习day15-16-常用类2(String,正则,StringBuffer,Math,Date,数字类)

今日目标

  • String
  • 正则
  • String和StringBuffer,StringBuilder
  • Math,Random
  • 日期:Date,Calendar,SimpleDateFormat

一.String常用方法

  1. 长度 length()
  2. 拼接 str.concat(str2)
  3. 格式化
 //方式一
System.out.printf("大家好,我的名字叫:%s,我今年:%d岁了,我的存款有:%f %n","曹操",36,999.99);
//方式二
String s = String.format("大家好,我的名字叫:%s,我今年:%d岁了,我的存款有:%f","曹操",36,999.99);
System.out.println(s);
  1. charAt(index)返回指定索引处的字符
  2. indexOf(str)返回指定字符串在此字符串中第一次出现处的索引
  3. compareTo(str2)比较两个字符串
  4. equals()和equalsIgnoreCase()
  5. getBytes()使用默认字符集将字符串变为字节数组,IO流中会用到
  6. toCharArray() 字符串转换为字符数组
  7. 截取:subString()
  8. 转换成大小写toLowerCase() toUpperCase()
  9. 截取前后空白 trim()
  10. 替换:replace()
  11. 分割:split()
  12. 正则匹配 matches(String reg) 返回boolean

1.编写一个程序,让用户输入一个字符串,随即在控制台输出这个字符串中的 英文字母个数,数字个数。
在这里插入图片描述
在这里插入图片描述

2.编写一个程序,让用户先后输入两个字符串,一个长的,一个短的,例如:“how do you do”和“do”;然后输出短的那个字符串在长的字符串中出现的次数。
在这里插入图片描述

二.正则

1.概念

正则表达式,又称规则表达式。(英语:Regular Expression,常简写为regex)。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。支持正则表达式的有:PHP、Java、Python、JavaScript等。有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的。

2.规则

1. 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。
2. []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。
3. -在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。
4. ^在中括号里面和外面含义不同,如在外时,就表示开头,如^7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[^abc]表示匹配出去abc之外的其他任一字符。

5. .表示匹配任意的字符。
6. \d表示数字。
7. \D表示非数字。
8. \w表示字母、数字、下划线,[a-zA-Z0-9_]。
9. \W表示不是由字母、数字、下划线组成。
10.	[\u4e00-\u9fa5]匹配汉字

11. ?: 表示出现0次或1次。
12. +表示出现1次或多次。
13. *表示出现0次、1次或多次。
14. {n}表示出现n次。
15. {n,m}表示出现n~m次。
16. {n,}表示出现n次或n次以上。

3.用法

在java中调用正则表达式的类是java.util.regex.Matcher和java.util.regex.Pattern
  • 代码
//要匹配的字符
	String str = "8";
//正则表达式
	String regex = "[0-9]";
// 方式一
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(str);
    System.out.println(m.matches());
//方式二
	System.out.println(Pattern.matches(regex, str));
//方式三
	System.out.println(str.matches(regex));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 练习
 @Test
public void test4(){
    //qq邮箱:6-11数字@qq.com  过滤: 163.com  .cn
    String s="1071461302@qq.com";
    System.out.println(s.matches("\\d{6,11}@qq\\.com"));
    System.out.println(s.matches("\\d{6,11}@[a-z]{2}\\.[a-z]{3}"));

}
 String s="1071461302@qq.com";
        System.out.println(s.matches("\\d{6,11}@qq.\\w{1,3}"));
  • 扩展:断言,预测,排除
 //某网站要求注册的账号只能是:字母和数字,不能都是字母,不能都是数字,且要求字母开头,长度在6-12之间,
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //断言 ,预测 (?!正则 ) 排除 正则匹配的情况
        String s="";
        while (!s.matches("^[a-zA-Z](?![a-zA-Z]{5,11}$)[a-zA-Z0-9]{5,11}")){
            System.out.println("请输入注册账号:");
            s = sc.next();
        }
        System.out.println("注册成功!");
    }
  • 案例(作业)
1.接收用户输入的一个字符串,判断是否是 hellokitty
2.接收用户输出的一个字符串,判断是否由3个字母组成,第一个字母范围是a-c,第二个字母范围是e-g,第三个字母范围是x-z
3.判断由5个小写字母组成的字符串
4.判断由至少5个小写字母组成的字符串
5.判断由8-12个小写字母组成的字符串
6.密码校验:8-20位,小写字母/大写字母/数字中的至少两种
7.写出“大家好666”的正则匹配
  String s="hellokitty";
        System.out.println(s.matches("hellokitty"));
        System.out.println("2----------");
        String a="zxv";
        String a1="bfy";
        System.out.println(a.matches("[a-c][e-g][x-z]"));
        System.out.println(a1.matches("[a-c][e-g][x-z]"));
        System.out.println("3----------");
        String a2="abcde";
        String a3="abc";
        System.out.println(a2.matches("[a-z]{5}"));
        System.out.println(a3.matches("[a-z]{5}"));
        System.out.println("4----------");
        String a4="abcdef";
        String a5="abcd";
        System.out.println(a4.matches("[a-z]{5,}"));
        System.out.println(a5.matches("[a-z]{5,}"));
        System.out.println("5----------");
        String a6="abcdefgh";
        System.out.println(a6.matches("[a-z]{8,12}"));
        System.out.println("6----------");
      Scanner sc=new Scanner(System.in);
        System.out.println("请输入:");
        String a7=sc.next();
if (a7.matches("(?![a-z]{8,20}$)(?![A-Z]{8,20}$)(?!\\d{8,20}$)[a-zA-Z\\d]{8,20}")){
    System.out.println("输入正确");
}else {
    System.out.println("输入错误");
}
        System.out.println("7----------");
        String a8="大家好666";
        System.out.println(a8.matches("大家好666"));
        System.out.println(a8.matches("[\\u4e00-\\u9fa5]{3}[0-9]{3}"));

在这里插入图片描述

三.StringBuffer和StringBuilder

1.区别

1.1 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。

1.2 当对字符串进行修改的时候,特别是字符串对象经常改变的情况下,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

在这里插入图片描述

  • 继承结构图

在这里插入图片描述

2.相同

StringBuffer和StringBuilder用法一样,

测试:循环1W次,两个常量的连接操作和两个变量的连接操作,StringBuffer的拼接操作,对比耗时。

3.常用方法

//1.追加
	append()
//2.插入
    insert()
//3.倒置
    reverse()

insert()用法

  StringBuilder sb=new StringBuilder("hello");
        sb.insert(3,"word");
        System.out.println(sb);

在这里插入图片描述
reverse()用法

 StringBuilder sb=new StringBuilder("hello");
        sb.reverse();
        System.out.println(sb);

在这里插入图片描述
append()用法
在这里插入图片描述

public class one {
    public static void main(String[] args) {
        String s1="hello";
        StringBuffer sf=new StringBuffer("hello");
        sf.append("word");
        System.out.println(sf);
        StringBuilder sb=new StringBuilder("hello");
        long l1=System.currentTimeMillis();//当前时间
        for (int i = 0; i <100000 ; i++) {
            s1+="word";
        }
        long l2=System.currentTimeMillis();
        for (int i = 0; i <100000 ; i++) {
            sf.append("word");
        }
        long l3=System.currentTimeMillis();
        for (int i = 0; i <100000 ; i++) {
            sb.append("word");
        }
        long l4=System.currentTimeMillis();
        System.out.println(l2-l1);
        System.out.println(l3-l2);
        System.out.println(l4-l3);
    }
}

在这里插入图片描述

四.Math和Random

1.Math常用方法

  • 向上/下取整,四舍五入 ceil() floor() round()
  • 绝对值 abs()
  • 随机数 random() 范围:[0,1) 小数
  • 幂函数 pow(a,b)
  • sqrt()平方根
 double a=1.1,b=1.9,c=1.5;
        System.out.println(Math.ceil(a));
        System.out.println(Math.floor(b));
        System.out.println(Math.round(c));
        System.out.println("---------");
        double a1=-2.3;
        System.out.println(Math.abs(a1));
        System.out.println(Math.random()*10);
        System.out.println(Math.pow(5,3));
        System.out.println(Math.sqrt(25));

在这里插入图片描述

2.Random常用方法

  • 构造方法
    在这里插入图片描述
  • 常用方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
 Random r=new Random();

        int i=r.nextInt();
        int i2=r.nextInt(6);
        System.out.println(i);
        System.out.println(i2);

        Random r2=new Random(66);
        int i1=r2.nextInt();
        int i3=r2.nextInt(10);
        System.out.println(i1);
        System.out.println(i3);

在这里插入图片描述

五.日期类

1.Date

1、创建一个当前时间的Date对象

//创建一个代表系统当前日期的Date对象
  Date d = new Date();

2、创建一个我们指定的时间的Date对象:
使用带参数的构造方法Date(int year, int month, int day) ,可以构造指定日期的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1以后的值。

//创建一个代表2014年6月12号的Date对象
Date d1 = new Date(2014-1900, 6-1, 12); (注意参数的设置)

3、正确获得一个date对象所包含的信息,如:
    Date d2 =  new Date(2014-1900, 6-1, 12);
    //获得年份 (注意年份要加上1900,这样才是日期对象d2所代表的年份)
        int year = d2.getYear() + 1900;
    //获得月份  (注意月份要加1,这样才是日期对象d2所代表的月份)
        int month = d2.getMonth() + 1;
     //获得日期
        int date = d2.getDate();
     //获得小时
        int hour = d2.getHours();//不设置默认为0
     //获得分钟
        int minute = d2.getMinutes();
     //获得秒
        int second = d2.getSeconds();
     //获得星期 
		int day = d2.getDay();

2.Calendar

1.Calendar类的功能要比Date类强大很多,考虑了时区等问题。
2.Calendar类是一个抽象类,提供了getInstance方法用来创建对象。
//1.创建一个代表系统当前日期的Calendar对象
Calendar c = Calendar.getInstance();//默认是当前日期
//2.创建一个指定日期的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2014, 5 - 1, 9)//3.创建一个指定日期的Calendar对象--方式二
c1.set(Calendar.DATE,10);
c1.set(Calendar.YEAR,2015);
//4.获取时间
    // 获得年份
    int year = c1.get(Calendar.YEAR);
    // 获得月份
    int month = c1.get(Calendar.MONTH) + 1;(MONTH+1// 获得日期
    int date = c1.get(Calendar.DATE);
    // 获得小时
    int hour = c1.get(Calendar.HOUR_OF_DAY);
    // 获得分钟
    int minute = c1.get(Calendar.MINUTE);
    // 获得秒
    int second = c1.get(Calendar.SECOND);
    // 获得星期几
    int day = c1.get(Calendar.DAY_OF_WEEK);
//5.和Date关联
setTime(new Date())
 Calendar c=Calendar.getInstance();
        Calendar c1=Calendar.getInstance();
        c1.set(2020,12-1,20);
        c1.set(Calendar.DATE,10);
        c1.set(Calendar.YEAR,2015);
        int year=c1.get(Calendar.YEAR);
        int month=c1.get(Calendar.MONTH)+1;
        // 获得日期
        int date = c1.get(Calendar.DATE);
        // 获得小时
        int hour = c1.get(Calendar.HOUR_OF_DAY);
        // 获得分钟
        int minute = c1.get(Calendar.MINUTE);
        // 获得秒
        int second = c1.get(Calendar.SECOND);
        // 获得星期几
        int day = c1.get(Calendar.DAY_OF_WEEK);
        //c1.setTime(new Date());
        System.out.println(year+"年"+month+"月"+date+"日期"
                +hour+"小时"+minute+"分钟"+second+"秒"+"星期"+day);

在这里插入图片描述

3.SimpleDateFormat

​ 日期格式化

//1.创建格式化对象
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2.调用format或parse方法,可以进行String和Date之间的转换

在这里插入图片描述

 public static void main(String[] args) throws ParseException {
 //Date date=new Date();
        SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d=s.parse("2020-3-20 00:00:01");
        System.out.println(d);
//String s1=s.format(date);
        String s1= s.format(new Date());
        System.out.println(s1);
    }

在这里插入图片描述

六.数字类

1.BigDecimal

  • 猜猜a-b结果是多少?
double a=0.03;
double b=0.02;
System.out.println(a-b);
为什么会这样呢? 因为float和double都是浮点数,都有精度范围.  使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是! double相减会转换成二进制,因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储 小数位数因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal.
  • 常用方法
//BigDecimal对象中的值相加,返回BigDecimal对象
add(BigDecimal)

//BigDecimal对象中的值相减,返回BigDecimal对象
subtract(BigDecimal)

//BigDecimal对象中的值相乘,返回BigDecimal对象
multiply(BigDecimal)

//BigDecimal对象中的值相除,返回BigDecimal对象
divide(BigDecimal)

BigDecimal b1 = new BigDecimal("0.03");
BigDecimal b2 = new BigDecimal("0.02");
System.out.println(b1.subtract(b2));
//对比输出结果
BigDecimal b1 = new BigDecimal(0.03);
BigDecimal b2 = new BigDecimal(0.02);
System.out.println(b1.subtract(b2));

 double a=0.03;
        double b=0.02;
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println("------------");
        BigDecimal b1 = new BigDecimal("0.03");
        BigDecimal b2 = new BigDecimal("0.02");
        System.out.println(b1.add(b2));
        System.out.println(b1.subtract(b2));
        System.out.println(b1.multiply(b2));
        System.out.println(b1.divide(b2));
        System.out.println("-----------");
        BigDecimal b3 = new BigDecimal(0.03);
        BigDecimal b4 = new BigDecimal(0.02);
        System.out.println(b3.add(b4));
        System.out.println(b3.subtract(b4));
        System.out.println(b3.multiply(b4));
      //  System.out.println(b3.divide(b4));

在这里插入图片描述

2.BigInteger

	add()//加
    subtract()//减
    multiply()//乘
    divide()//除

如果操作一个整数已经超过了long的范围,此时可以使用BigInteger。由于不是基本数据类型,所以不能使用±*/,操作方法和上面一致。

long l=999999999999999999l;
BigInteger in1=new BigInteger("999999999999999999999999999999999999999999");
BigInteger in2=new BigInteger("999999999999999999999999999999999999999998");
System.out.println(in1.subtract(in2));
 long d=999999999999999999l;
        BigInteger b1=new BigInteger("999999999999999999999999999999999999999999");
        BigInteger b2=new BigInteger("999999999999999999999999999999999999999998");
        System.out.println(b1.add(b2));
        System.out.println(b1.subtract(b2));
        System.out.println(b1.multiply(b2));
        System.out.println(b1.divide(b2));
- 十进制和二进制之间的转换

在这里插入图片描述

BigInteger in = new BigInteger("10001110",2);
System.out.println(in.intValue());//二进制转换为10进制
System.out.println(in.toString(2));//十进制转换为
System.out.println(in.toString(3));

在这里插入图片描述

3.DecimalFormat

double pi = 3.1415927;//圆周率
//取整数
        System.out.println(new DecimalFormat("0").format(pi));//3
//取整数和两位小数
        System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
        System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整数部分
        System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
        System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
long c =299792458;//光速
//显示为科学计数法,并取五位小数
        System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//显示为两位整数的科学计数法,并取四位小数
        System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗号进行分隔。
        System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//将格式嵌入文本
        System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));//光速大小为每秒299,792,458米。

Java学习顺序

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值