java 基础复习

4-29号

专题 java 大数处理和精度外理方法整理

java中整数有四个类型,byte short int long.

java中byte 1个字节,short 2个字节,int 4个字节,long8个字节

以long为例,long会占8*8=64个位,转成10进制就是19位。如果想表达更大的数字就需要用biglnteger

以下内容专业针对大数处理方法讲解笔记 ,这儿要用到一个类 Biginteger,

 

常用方法:

1) public BigInteger(int unm,Random rnd) 获取随机最大整数。备注第一个参数是多少次数,第二参数是随机产生0-2的基数,

2)public BigInteger(String val ) 获取指定大整数

3)public BigInteger(String val, int readix)获取指定进制的大整数,第一个参数必须是进制吻合,比如“100100100” 第二个参数是时制,如果第一个参数不能进制无关,会报错,比如“153”这个数字

示例代码:

BigInteger bd1 = new BigInteger(4,new Random()), //生成随机数的4次方

示例三,(new BigInteger和静态构造valueOf 的区别)

1)使用BigInteget静态方法将一个普通数转换成BigInteger类型,这个方法最大参数类型为long,

优化-16 - 16 数字也提前创建在内部,所以BigInteger.valueOf(16) == BigInteger.valueOf(16)

BigInteger d5 = BigInteger.valueOf(100); System.out.println("d5")

其他相关知识,打印Long.max_value 最大值 ,System.out.println(Long.MAX_VALUE)

2)使用new BigInteger(“888888888888888888888”)可以不受Long 影响

常用方法名:(BigInteger 本身不可变,所以fooa.add(foob))fooa的值并不会变,产生的值作皇返回到另一个值

image-20230429173720520

以上结果仍返回1,说明a没有变,

注意说明,如果我们要的值没有超出long范围,可能用静态方法获取,如果超出long范围,可能用构造方法获取。对象一旦创建,就在内存中值不可变。

下面关于BigInteget常有方法介绍介绍:

image-20230429174722342

关于数字不精确问题

new BigDecimal(0.01) 小数位很大,不精确,将值改为字符串可以更精确,示例代码

new BigDecimal("0.4")

通过静态获取对象 BigDecimal.valueOf(10);

细节,如果表示的数字不大,没有超出doble 建议命用静态方法,如果数值太大,请使用new方法

正则表达式之java实现

示例一,非正则表达式编写检查一个字符是否是一个QQ号

思路:先判断长度,再判断不否0开头,再判断是全是数字。判断字符长度可能用len.length(), 判断是是全是字符可能用charAt(i)是否是在0-9之间的acsll码

代码如下:以下方法只是示例,感觉代码又长又不看,工作中用正则完成,

 

正则实现检查的的代码只有二句,

String qq = "309657788";

System.out.println(qq.matches("[1-9]\d{5-19}"))

示例二,区配一个字符串“ab”的正则 “ab.matches(abc)”

image-20230429203350815

 

特殊字符&& 并且 一个& 只能代表一个字符,【^】取反,排除的意思,大致和前端的正则一样,纯属复习,预定义字符 \d 代表数字 \D非数字 \s 空白字符, \S非空白 \w 字符 \W非字符

image-20230429204624976

 

 

正则示例

判断邮箱正则和24小时间 格式 ,写法参考,本没有什么技术量,主要复习[01]括号中限定字符段一般是有一个下划线,[0-9]这样的写法,但是只有二个数的话不用这样写[01]就可以了,一下子容易感觉陌生的写法,复习记录一下。

image-20230429211215444

 

验证用户名是否合则 ,用户名是要求大小写字母,可以有下划线,长度为4-16,

String regx = "//w{4-16}"

身份证正则,第一位不能是0 长度16 后面可以是x或X

String regd = “[1-9]\d{16}(\d|x|X)” 实际还要考虑中间的年月日区配,完整的身份证区配如下

image-20230429212510251

实战部份

学习爬虫基础,本示例编写一个最简单的爬虫示例,这儿功能主要通过要求获取指定的数据,在编写爬虫前先来复习怎么截取字符串,假设有一串字符串如下:

String str = xsy,rs java8 java9 ""

编写一个正则:

Pattern p = Pattern.compile("java\d{0,2}")

正则的matcher 指定区配

Mather m = p.matcher(str)

find方法如果没有找返回false 如果找到了底层开始记录索引起始和结索+1

boolena b= m.find();

String s1 = m.group();根据索引获取字符。

while(m.find()){

String s = m.group();

System.out.pringln(s)

}

通过以上的核心的代码演示了正则怎么区配和获取字符串,现在来编写一个简单的爬虫,首页第一步我们要网络读取网络内容,需要用到网络技术,假设一个网站叫润生网站,里面有一个页面内容是很多人的身份信息,这儿关健是网上的内容,我们需要一行一行的读取,会用到行读取器,幸好java帮我们写好了行读取器的方法,这儿核心代码主要三句,在上面有先预习,其它部份代码为行读取器和网络发送请求,每周复习一次,就可以深刻记住。

image-20230429215824787

这儿默认是就是贪婪区配,如果不贪婪需要在后面加一个问号,比如 String regs = "ab+?"

以下 代码是没有加 ?,所以获取取了多个b

image-20230429235856955

分组与组号,,正则如果需要对某些字段单独设正则是要加括号,否则会变成全局,分组可以加序号引用,,可以省写法,例如:以下第四项image-20230430074513048

分组引用,可以用于判断二串相同的字符串是否一样。正则中//1可以引用分组,在正则外面用$引用

image-20230430081451025

String result = str.replaceAll("(.)\1+","$1")非捕获分组,就是只为分组不捕获(?:)(?=)

 

 

4-30号继续

java时间总结 jdk7t jdk8

jdk7 低版本相关知识点: (Date SimpleDateFormat Calendar)

jdk8版本新功能知识点:(ZoneId Instant ZoneDateTime DateTimeFormatter LocalDate LocalTime LocalDateTime Duration period ChronoUnit )

基本理伦,全世界的时间有一个统一标准计算叫格林尼时间简称MGT,根据地球自转子午线来区分区

但是由于误差太多,不在作为标准时间。2012年以取消用了一百多年的格林时间,使用原子钟算法。简称(UTC)

常用方法 本包位于java.ulit

public Date() 这个方法可以直接调用,或者加一个数字,这个数字表过过了多久,比如new Date(10L) 表示1970年的基本时间加上10毫秒

Public Date(long date)

public void setTime(long time) 这个方法是从原点过了多少时间,

public lone getTime()

编写获取一年后的时间
       Date d1 = new Date(0L);   //写0L表示从1970开始
       long time = d1.getTime();
       time = time*1000L*365*24*60*60;  //一年360天,每分60秒,每小时60分
       d1.setTime(time);

创建随机时间

//创建随机时间
    Random r  = new Random();
    Date d1 = new Date(Math.abs(r.nextInt()));

由于java获取的时间格式格式不容易看,例示获取的格式为Thu Jan 01 08:00:00 CST 1970

所以需要格式化显示才容易观看,需要引用simpleDateFormat,SimpleDateFormat 主要有二个功能,第一就是格式化,第二就是解析。

解析,就是给一字符串,会解析成日期

格式化就是给一个日期,可以格式成字符串 默认格式为:

年月日上午还是下午几点 2023/10/1 上午08:30

更改格式方法:new simpleDateFormat("yyyy年MM月dd日 HH:mm:ss")

关于更多参数,官方文档核心参数如下:

image-20230430092928260

//     示例将一个表示出生年有字符转成另一种格式的,
//     比如2001-10-12 转成2001年10月,要实现这程或功能方法很多。
//     这儿要求用日格类完成
       String str = "2002-11-11";
       //定义二个不同格式
       SimpleDateFormat d1 = new SimpleDateFormat("yyyy-MM-dd");
       SimpleDateFormat d2 = new SimpleDateFormat("yyyy年MM月dd日");
//       将str通过格式转成日期  
       Date date = d1.parse(str);
//       通过d2的格式化将日期转成另一种格式
       String result = d2.format(date);
//       打印输出
       System.out.println(result);

 

第三部份 Calendar常用方法,Calendar功能很多和date一样,都 可以获取时间毫秒,多了增加日期年月日 的增加或减少,它是一个抽象类,不能直接naw 只能通过静态方获取到子类对象。

底层原理,根据系统时区获取不同的日历对象。会把时间中的纪元年月日放到一个数组之 中,

数组中月份范围是-0-11 也就是0月其实是1月,11其实是12

关于星期,1表示星期天,2表示星期一,给中国有点不一样,在我中国周末是属于上一星期,

可能通过数组索引来获取对象比如获取年用c.get(1),也可能用c.get(Calendar.YEAR) Calendar还提供set 和add 对于日历对象的修改和增加数值 , ,

Calendar c = Calendar.getInstance();
System.out.println(c);

image-20230430101542626

jdk8新方法,

新方法解决线程安全和性能更快,提供更多的方法,比如计算时间比较时间,更细化的方法,

ZoneId 时区,(用于获取时区,设置时区,)

Instant 时间戳

(获取当前时间)Instant.now()

根据毫秒获取毫秒 Instant.ofEpochMilli()

根据秒获取 Instant.ofEpochSecond(1L),

根据秒加纳秒 Instant.ofEPochSecond(1,1000);

指定时区:由于zoneid的获取时间方法次是静态,所以需要用

Instant.now().atZone(ZoneId.of("Asia/Shanghtai"))

instant.isAfter() 是否在前

instant.isBefore()是否在后

 

 

ZoneDateTime 带时区时间

DateTimeFormatter 新版本格式化和解析

LocalDate 年月日

LocalTime 时分秒

LocalDateTime 年月日 时分秒

Duratin 时间间隔秒

Period 时间间隔年月日

ChronoUnit 时间间隔所有单位

以下根据功能分类,分为四个类,

image-20230430111415334

 

修改时间年月日,备注日期对象是不可变的所谓修改其实是内部返回一个对对象

Instant instant = Instant.ofEpochMilli(0l)

Zoneid zoneid = ZoneId.of("Asia/Shanghai")

ZonedDateTime time2 = ZonedDateTime.ofinstant(insant,zoneid)

ZonedDateTime time3 = time2.withYear(2000);

System.out.pritnt(time3)

关于更多修改年月日 小时的方法见以下图

image-20230430133951763

日历类 Calender 在jdk8的日历类为localDate LocalTime LocalDateTime其中LocalDate获取年月日星期几,

image-20230430134628523

MonthDay是一个新类,可能传入月日生成一个几月几日的对象,

image-20230430135102368

LocalTime是一个针对时分秒外理的类。它的方法几乎和LocalDate一样,只是外理的单位不一样

image-20230430135458454

最后一个类间隔,主要功能是根据二个对象算出间隔年月日

image-20230430135731456

关于年月日间隔的方法很多,以下复制一些常用方法

 

posted @   稷下元歌  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示