一、重点知识
new string(byte[],offset,length)
offset表示的是偏移量,length表示的是截取长度
正则表达式,有自己的规则,需要去记
一维数组里面存的是数据
二维数组里面存的是一维数组得地址,没有给内层数组分配空间就调用内层数组操作,会空指针异常
Charsequence是一个接口表示字符序列
只有调用一个方法,返回类型是一个对象才能用方法链
Stringbuffer调用append方法连接一个对象,实际上链接的是对象调用tostring结果
StringBuffer里的insert也可以实现append的功能
insert(offset,data),插入数据是从offset下标那个位置插入,不是它之前,也不是它之后,就是正好那个位置,如果当前位置有元素,则当前元素后移,所以想实现末尾插入,不用length-1直接length就好了,因为stringbuffer底层存储得数组是可变长度的,不用考虑数组角标越界
StringBuffer里的setlength(data)设置字符串的长度,如果原字符串够长的话起到的是截取的作用,如果不够的话,会补充空字符到你设置的长度
一般工具类中的方法都是静态的
Math.ceil方法向上取整,不论后面小数部分为多大,都向上进一位,Math.floor为向下取整,规则和ceil一样,但是是向下减一位round不一样,他是四舍五入
double--->int 强转为int时是把小数后面的都抛弃了,只保留整数
IEE754是一种计算标准,但是用于计算浮点数不准确,所以引入了Bigdecimal这个类,且这个类重写了tostring
Bigdecimal构造方法一般用字符串,就可以限制他的精度和你输入字符串一致了
Random里面的方法用参数时
nextInt(n)------>[0,n),也遵循左包右不包
日期里模板如果加毫秒一般用.SSS
二、重点问题
1、随机数的问题
随机数有两种方式获取,一种是Math.random,一种是创建Random的对象,调用对应的方法
[10,99]随机数 公式:
(int)(Math.random() * (99 - 10 + 1) + 10)
取[m,n]之间的随机整数
(int)(Math.random() * (n - m + 1) + m)
Math里面的random里面的底层就是new了个Random得对象调用了Random类中的方法
它们两者的区别就是Math里面调用随机数方法是静态的,可以直接调用,但是Random用的话要创建它的对象,Random创建其对象时用的种子数一样,后面计算的结果也都一样
关于Random类中的种子的说明
https://www.cnblogs.com/huiAlex/p/8057737.html
2、关于Scanner进行读入的过程
使用scanner流进行读入的时候他的过程是,把键盘读入的数据放在缓冲区,然后把这个值赋给变量,如果用nextint();出现异常后,键盘读入的数值就会一直在缓冲区,而不会被刷新,所以赋值一直不成功,想解决这个问题,可以把nextint()改成next();,这样就不会再接收得时候报异常,数据能正常存入内存,在转换时候报异常,但是此时缓冲区已经被刷新了,所以可以重新读入了,而不会出现都不进来得情况
正确写法:
while (true) {
try {
scanner_a = Integer.parseInt(a.next());
break;
} catch (Exception e) {
System.out.println("数据有误请重新输入");
}
三、课堂知识
3.1、StringBuffer类
自带了一块缓冲区的字符串,叫StringBuffer类。可以修改字符串的内容。和String完全不同。
理解为:带了一块空间的字符串对象。
3.1.1 构建一个StringBuffer对象
//构造方法:
newStringBuffer();//默认的缓冲区大小16个字符
newStringBuffer(intcapacity);//也可以自己指定容量大小
newStringBuffer(Strings);//StringBuffer对象创建好,并且里面还存储了字符串
3.1.2 StringBuffer的常用方法
//1.添加
append(data)-->StringBuffer,末尾追加。生活中的排队,都是默认排在队伍末尾
insert(offset,data)-->StringBuffer,插入数据。生活中的插队,在哪插入。
//2.删除
delete(start,end)-->StringBuffer,删除,从start下标开始,删除到end下标之前。包含start,但是不包含end。 一般这种范围都是左开右闭。
deleteCharAt(index)-->StringBuffer,删除指定下标对应的字符。
//3.更改
reverse()-->StringBuffer,翻转一个字符串。
setCharAt(index,char)-->void,设置指定下标对应的字符。字符替换。
setLength(newLength)-->void,设置StringBuffer的字符串的长度。截取/用空字符填充
replace(start,end,str)-->StringBuffer,替换指定区间的内容:[start,end)
toString()-->从StringBuffer类型,变为String类型。
//4.同String类相同
length()-->int,获取长度
charAt(index)-->char,
indexOf(String)
indexOf(String,fromIndex)
lastIndexOf(String)
lastIndexOf(String,fromIndex)
substring(begin)
substring(begin,end)
3.2、StringBuilder类
StringBuilder类提供的方法,和StringBuffer功能相同。
StringBuffer和StringBuilder的使用方式几乎相同:
step1:创建StringBuffer或StringBuilder对象。
step2:执行方法:同StringBuffer
它们的区别:
StringBuffer是线程安全的,效率比StringBuilder低一些。JDK1.0就有了
StringBuilder线程不安全。效率比StringBuffer高一些。JDK1.5发布的
3.3、Math类
Math.abs(100);//绝对值
Math.ceil(3.00001) //向上取整
Math.floor(4.1)//向下取整
Math.round(3.49)//四舍五入
Math.pow(a, b)//a的b次方
Math.sqrt()//开平方根
Math.random()//随机数,取值范围:[0,1),随机小数-----就是new Random对象,调用nextDouble()方法。
3.4、BigDecimal类
BigDecimal,构造BigDecimal对象时候,如果直接使用double类型作为参数,存在精度
BigDecimal bd3 = new BigDecimal("0.05");//直接用字符串的形式存储
BigDecimal res1 = bd3.add(bd4);////加法
BigDecimal res2 = bd3.subtract(bd4)//减法
BigDecimal res3 = bd3.multiply(bd4)//乘法
//除不尽的情况,必须明确2个信息:(小数点后保留几位,是否使用四舍五入)
BigDecimal res4 = bd5.divide(bd6);
BigDecimal res5 = bd5.divide(bd6, 2, BigDecimal.ROUND_HALF_UP);
2代表了保留几位,BigDecimal.ROUND_HALF_UP代表了进位规则
3.5、Random类
//step1:创建Random类的对象
Random r1 = new Random();
//step2:通过r1调用方法,就能够生成各种各样的随机数
boolean b1 = r1.nextBoolean();//产生一个boolean类型的随机数
System.out.println(b1);
double d1 = r1.nextDouble();//产生一个随机double类型,取值范围:[0,1)
System.out.println(d1);
int i1 = r1.nextInt();//产生一个int类型的随机数
System.out.println(i1);
int i2 = r1.nextInt(3);//产生一个int类型的随机数:[0,3)
System.out.println(i2);
3.6、日期操作
Date,结合SimpleDateFormat类。
Calendar类。
3.6.1 Date类
java.util.Date类:(区别于java.sql.Date)
表示特定时间的Date对象:年月日时分秒时区
Date类中的很多获取日期,时间等等的方法, 都被Calendar类所提供替代。
3.6.2 SimpleDateFormat类
专门用于日期和文本之间的转换。
* SimpleDateFormat类:
* Date-->String:日期格式化,就是将一个日期Date对象,按照指定的字符串格式去显示。
* format(),根据模板,将date日期,转为String字符串类型
* 1.创建SimpleDateFormat对象。可以通过构造方法指定模板(格式):"yyyy-MM-dd"
* 如果没有指定模板,使用系统默认:20-4-16 上午11:09
* 2.sdf.format(date)-->String
* String-->Date:解析?就是将一个文本字符串,解析成一个Date对象。
* parse(),根据模板,将字符串解析为对应的日期对象,异常。
* 2.sdf.parse(String)-->date
*/
3.6.3 Calendar类
Calendar类是抽象的。GregorianCalendar子类。
获取日期时间,也可以设置日期时间。
//step1:创建Calendar类的对象。
Calendarcalendar=newGregorianCalendar();//方式一
CalendarrightNow=Calendar.getInstance();//方式二
//step2:
//获取类
calender.get(YEAR,MONTH,DAY_OF_MONTH,DAY_OF_WEEK,HOUE,MINUTE....);
//设置
calendar.set();
calendar显示是用get方法拼接出来的