JAVA学习(零碎知识)

java 零碎知识

  • image-20210923133547998
  • 创建子类时会先创建一个父类(调用了父类的构造函数)

  • 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

  • img

关于java中的string pool

字符串池会存储特定形式出现的字符串,通过intern()函数产生的字符串和同直接赋值的字符串。

如果是通过new产生的字符串会被存储在堆当中。

文件IO流的使用

FileOutputStream 是把数据输出到文件的类。

  1. 写入数据的时候如果需要以追加的形式写入,那么需要使用new FileOutputStream(file,true) 这个构造函数。
  2. new FileOutputStream 的时候,如果目标文件不存在,那么会先创建目标文件,然后再写入。(如果目标文件所在的文件夹不存在,则抛出异常)
  3. new FileOutputStream(file) 如果目标文件已经存在,那么会先清空 目标文件的数据,然后再写入新的数据.
  4. 使用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);
  1. 如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取

    for(int i = 0; i < 4; i++)
    {
        if (scan.hasNextInt())
        {
            a[i] = scan.nextInt();
        }
    }
    
  2. 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参数。

如果只写注解,相当于全部使用默认值。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuming先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值