java 零碎知识
-
创建子类时会先创建一个父类(调用了父类的构造函数)
-
static声明的变量和函数被放在静态区,不创建对象也可以直接使用其对象
-
final类不能被继承 ,final的方法可以被子类继承但是不能重定义。final的变量必须在开始时初始化。中途不能改变他的值
-
&&的复合句子中: (x) && (y) 如果x就已经是false.则不会执行y条件的判断
-
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
-
StringBuffer 和StringBuilder类的对象不支持"+"进行连接。通过insert()和append()函数来连接字符串
-
字符串类不能通过下标进行访问,通过charAt()函数访问对应下标的值。修改可变字符串类的字符可以通过函数setCharAt()函数
-
java中的接口是一些函数的抽象(没有函数体),需要被类来继承实现,接口声明的关键字为
intterface
,类继承的关键字为implement
. 继承的类必须实现接口的所有函数 -
Object是java中的顶级类,任何类都是继承object这个类
-
方法覆盖通过super来实现, 覆盖是子类覆盖掉父类的函数,覆盖函数参数列表返回值必须一样,super表示父类的引用。
-
向上类型转换:父类名 变量 = new 子类名(); 这种创建子类对象返回给父类的
java 命名规范
-
方法(c++中的函数)的命名方法为第一个单词小写剩下的单词开头大写,不能用连字符
zheShiFangFa
-
类通常每个单词开头大写,包名字通常是小写 ZheShiLei`
-
常量全部大写
CHANGLIANG
关于java中的string pool
字符串池会存储特定形式出现的字符串,通过intern()函数产生的字符串和同直接赋值的字符串。
如果是通过new产生的字符串会被存储在堆当中。
文件IO流的使用
FileOutputStream 是把数据输出到文件的类。
- 写入数据的时候如果需要以追加的形式写入,那么需要使用new FileOutputStream(file,true) 这个构造函数。
- new FileOutputStream 的时候,如果目标文件不存在,那么会先创建目标文件,然后再写入。(如果目标文件所在的文件夹不存在,则抛出异常)
- new FileOutputStream(file) 如果目标文件已经存在,那么会先清空 目标文件的数据,然后再写入新的数据.
- 使用write(int b)方法的时候,虽然参数接受的一个int类型的数据,但是实际上只会把数据的低八位写出,其他24位丢弃。
00000000-00000000-00000001-10000000
write(byte[] b, int off, int len)
public static void write3() throws IOException{
//找到目标文件
// File file = new File("F:\\a.txt");
//建立数据的输出通道
FileOutputStream fileOutputStream = new FileOutputStream("F:\\a.txt", true);
//
String data = "abcd";
byte[] buf = data.getBytes(); // 97 98 99 100
fileOutputStream.write(buf); // 指定开始的索引值与字节个数写出。
fileOutputStream.close();
}
JAVA中的输入流Scanner
需要引入Scanner的类,java.util.Scanner
创建方法:
Scanner scan = new Scanner(System.in);
-
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取
for(int i = 0; i < 4; i++) { if (scan.hasNextInt()) { a[i] = scan.nextInt(); } }
-
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
java中的超大整数类BigInteger
导入import java.math.BigInteger
一般方法(大整数的内部是采用数组的形式存储,final声明,不可改变),运算都是通过类的方法来实现
BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780
java中的大浮点数类Decimal(完全准确)
对BigDecimal
做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断:
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("23.456789");
BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); // 保留10位小数并四舍五入
BigDecimal d4 = d1.divide(d2); // 报错:ArithmeticException,因为除不尽
JAVA中的真随机数SecureRandom
import java.security.SecureRandom;
SecureRandom
的安全性是通过操作系统提供的安全的随机种子来生成随机数。这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”。
在密码学中,安全的随机数非常重要。如果使用不安全的伪随机数,所有加密体系都将被攻破。因此,时刻牢记必须使用SecureRandom
来产生安全的随机数。
public class Main {
public static void main(String[] args) {
SecureRandom sr = null;
try {
sr = SecureRandom.getInstanceStrong(); // 获取高强度安全随机数生成器
} catch (NoSuchAlgorithmException e) {
sr = new SecureRandom(); // 获取普通的安全随机数生成器
}
byte[] buffer = new byte[16];
sr.nextBytes(buffer); // 用安全随机数填充buffer
System.out.println(Arrays.toString(buffer));
}
}
JAVA中的注解@
注解的作用
从JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。
Java的注解可以分为三类:
第一类是由编译器使用的注解,例如:
@Override
:让编译器检查该方法是否正确地实现了覆写;@SuppressWarnings
:告诉编译器忽略此处代码产生的警告。
这类注解不会被编译进入.class
文件,它们在编译后就被编译器扔掉了。
第二类是由工具处理.class
文件使用的注解,比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入.class
文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。
第三类是在程序运行期能够读取的注解,它们在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了@PostConstruct
的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。
定义一个注解时,还可以定义配置参数。配置参数可以包括:
- 所有基本类型;
- String;
- 枚举类型;
- 基本类型、String、Class以及枚举的数组。
因为配置参数必须是常量,所以,上述限制保证了注解在定义时就已经确定了每个参数的值。
注解的配置参数可以有默认值,缺少某个配置参数时将使用默认值。
此外,大部分注解会有一个名为value
的配置参数,对此参数赋值,可以只写常量,相当于省略了value参数。
ring;
- 枚举类型;
- 基本类型、String、Class以及枚举的数组。
因为配置参数必须是常量,所以,上述限制保证了注解在定义时就已经确定了每个参数的值。
注解的配置参数可以有默认值,缺少某个配置参数时将使用默认值。
此外,大部分注解会有一个名为value
的配置参数,对此参数赋值,可以只写常量,相当于省略了value参数。
如果只写注解,相当于全部使用默认值。