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的值并不会变,产生的值作皇返回到另一个值
以上结果仍返回1,说明a没有变,
注意说明,如果我们要的值没有超出long范围,可能用静态方法获取,如果超出long范围,可能用构造方法获取。对象一旦创建,就在内存中值不可变。
下面关于BigInteget常有方法介绍介绍:
关于数字不精确问题
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)”
特殊字符&& 并且 一个& 只能代表一个字符,【^】取反,排除的意思,大致和前端的正则一样,纯属复习,预定义字符 \d 代表数字 \D非数字 \s 空白字符, \S非空白 \w 字符 \W非字符
正则示例
判断邮箱正则和24小时间 格式 ,写法参考,本没有什么技术量,主要复习[01]括号中限定字符段一般是有一个下划线,[0-9]这样的写法,但是只有二个数的话不用这样写[01]就可以了,一下子容易感觉陌生的写法,复习记录一下。
验证用户名是否合则 ,用户名是要求大小写字母,可以有下划线,长度为4-16,
String regx = "//w{4-16}"
身份证正则,第一位不能是0 长度16 后面可以是x或X
String regd = “[1-9]\d{16}(\d|x|X)” 实际还要考虑中间的年月日区配,完整的身份证区配如下
实战部份
学习爬虫基础,本示例编写一个最简单的爬虫示例,这儿功能主要通过要求获取指定的数据,在编写爬虫前先来复习怎么截取字符串,假设有一串字符串如下:
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帮我们写好了行读取器的方法,这儿核心代码主要三句,在上面有先预习,其它部份代码为行读取器和网络发送请求,每周复习一次,就可以深刻记住。
这儿默认是就是贪婪区配,如果不贪婪需要在后面加一个问号,比如 String regs = "ab+?"
以下 代码是没有加 ?,所以获取取了多个b
分组与组号,,正则如果需要对某些字段单独设正则是要加括号,否则会变成全局,分组可以加序号引用,,可以省写法,例如:以下第四项
分组引用,可以用于判断二串相同的字符串是否一样。正则中//1可以引用分组,在正则外面用$引用
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")
关于更多参数,官方文档核心参数如下:
// 示例将一个表示出生年有字符转成另一种格式的,
// 比如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);
星
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 时间间隔所有单位
以下根据功能分类,分为四个类,
修改时间年月日,备注日期对象是不可变的所谓修改其实是内部返回一个对对象
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)
关于更多修改年月日 小时的方法见以下图
日历类 Calender 在jdk8的日历类为localDate LocalTime LocalDateTime其中LocalDate获取年月日星期几,
MonthDay是一个新类,可能传入月日生成一个几月几日的对象,
LocalTime是一个针对时分秒外理的类。它的方法几乎和LocalDate一样,只是外理的单位不一样
最后一个类间隔,主要功能是根据二个对象算出间隔年月日
关于年月日间隔的方法很多,以下复制一些常用方法
标签:BigInteger,java,复习,基础,获取,正则,new,String From: https://www.cnblogs.com/fgxwan/p/17365219.html