断言assert
assert x == 10 : "Our assertion failed";
等价于if (x!=10) throw new AssertionError("Our assertion failed") ;
- 错误Error会直接停止程序无法捕捉。
- assert仅用于关键数据的检验
字符编码
编码集
一个字符编码成对应字节
ASCII表示最基础的256个字符
西欧:ISO-8859-1(单字节单字符)----window12525
国内:GB2312--GBK--Big5--GB18030
字符集
一个字符对应unicode字符集里的数字编号,用这个数字编号编码成对应字节
UTF-32 统一编码成4字节(web常用)
UTF-16 常用2字节,不常用4字节 (java默认编码)
UTF-8 根据数字编号大小,分别1,2,3,4字节
java的clone
- 自定义对象要实现接口Cloneable才可以使用clone,String类自带实现。
- clone本身是超类里的protected方法,所以需要重写覆盖后用super.clone()调用
- 浅克隆:直接使用super.clone(),新对象复制值和引用(数组地址)
- 深克隆:在super.clone的基础上对引用(数组)重新定义。新对象复制值,重新生成新的引用(数组)
java的多线程实现
- extends Thread 继承类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法启动。
- implements Runnable 实现类必须重写 run() 方法,该方法是新线程的入口点。它也必须调用 start() 方法启动。
- implements Callable<Integer> 实现类,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。返回值必须放到FutureTask 对象获取。
fianl与static
- final修饰的变量,会定死无法改变,无论是引用类型的地址,还是基本类型的数值。
- final修饰的变量,在编译期间会对final变量替换成fianl变量修饰的值(或引用地址)。
- final关键字不会影响到变量在jvm的存储位置,static才会影响。(注意部分博客会说final有影响,其实本质是static有影响)
- 匿名内部类只能使用外部的final变量
- 因为内部类获取的外部变量是外部变量的副本,如果副本变量改变值,原本没有改变,这违反数据的一致性,所以必须使用fianl保证变量不可变,保证数据一致性。
static的用途 (跟前面的final同个大佬)
重载与重写:
重载:(overloading),同一个类中,方法名相同,参数不同,返回值可以相同可以不同。(参数唯一确定方法)
重写:(override),子类覆盖父类的方法,方法名和返回值和参数全部必须相同。
重写时,子类的返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。
String与StirngBulider:
string里final绑定是char【】数组。
stringbuilder绑定的是char【】数组。
string改变时,在char数组里可以改变,且添加字符时,如果不超过数组大小也可以不用重新生成新的对象?
同理stringbulider如果添加新的字符时,超过数组大小也要生成新数组吧?
String里的封装的操作方法是生成新的strign对象操作后返回,
Stringbulider的操作方法是在char[]数组对象上操作,然后返回这个数组对象。
char[]对象是私有变量,其他类无法操作。
答1:string已经封装好了,只要你用它的方法就返回新String对象,无法操作char数组对象,与final无关。
答2:stringbuilder更换了char数组。当添加字符大于16字符时,更换char数组对象,并且每次操作返回的是同一个stringbuilder对象。
java注解的继承性
1.基于类的注解的继承性,由@Inherited元注解决定。
如果注解有@Inherited,那这个注解作用与类时可以被子类继承,
子类注解可以覆盖父类注解。
2.基于方法或者属性的注解的继承性,完全由方法或者属性自身的继承性决定。
如果子类方法覆盖父类方法,由子类方法决定是否有注解,不依靠父类方法。
没有覆盖时,父类方法有注解就有注解,没有就没有。