本篇文章为本人在学习Java基础过程中对各个杂项知识点的记录

目录

  • 1. Java基础
  • 2. 面向对象编程
  • 3. Java核心类

参考: <----------------------------------廖雪峰学Java----------------------------------->

1. Java基础

  • 一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致;

  • 使用javac可以将.java源码编译成.class字节码;

  • 使用java可以运行一个已编译的Java程序,参数是类名。

  • java只定义了有符号的整数

  • char类型使用单引号’,且仅有一个字符,要和双引号"的字符串类型区分开

  • 如果加上final修饰符,变量就变成了常量

  • 使用var定义变量,仅仅是少写了变量类型而已,编译器会根据赋值语句自动推断出var变量的类型替换var关键字

  • 无符号的右移运算,使用>>>,它的特点是不管符号位,右移后高位总是补0

  • 强制类型转换时,舍弃高位,保留低位

  • 浮点数有个非常重要的特点,就是浮点数常常无法精确表示

  • 正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数

  • 浮点数运算在除数为0时,不会报错,但会返回几个特殊值:NaN,Infinity,-Infinity

  • Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型;如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串

  • int i = char(显示char的Unicode);char a = i(返回i对应的Unicode字符)

  • 字符串不可变:当我们修改一个字符串类型变量的值时,修改的不是内存中字符串本身,而是修改了字符串变量的指向。

  • 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false

  • 数组一旦创建后,大小就不可改变

  • 要判断引用类型的变量内容是否相等,必须使用equals()方法

  • Java标准库提供了Arrays.toString(),可以快速打印数组内容

  • Java的标准库内置排序功能,只需要调用JDK提供的Arrays.sort()

  • 对引用数据类型进行排序时(如字符串),字符串本身在内存中的位置不会改变,是各索引的指向发生了改变

  • 二维数组的每个数组元素的长度并不要求相同

  • 使用Java标准库的Arrays.deepToString()输出多维数组

  • 在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换

2. 面向对象编程

  • 一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。如果要定义多个public类,必须拆到多个Java源文件中
  • 用private修饰field,拒绝外部访问
  • 方法内部,可以使用一个隐含的变量this,它始终指向当前实例。因此,通过this.field就可以访问当前实例的字段
  • 可变参数用类型…定义,可变参数相当于数组类型
  • 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方。注意:对于引用类型对象的参数绑定,直接修改引用对象所指向的对象会相互影响,如果是修改指向性,那么不会产生影响。
  • 和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符
  • 通过继承,Student只需要编写额外的功能,不再需要重复代码;子类自动获得了父类的所有字段,严禁定义与父类重名的字段!
  • Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类
  • 为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问
  • super关键字表示父类(超类)。子类引用父类的字段时,可以用super.fieldName
  • 即子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。在子类的构造方法中,如果我们没有显示地实用父类的构造方法,那么编译器会自动在子类构造方法中添加一个父类的无参构造(super()),这时如果父类没有无参构造方法那么就会发生编译错误。
  • 正常情况下,只要某个class没有final修饰符,那么任何类都可以从该class继承。从Java 15开始,允许使用sealed(密封的)修饰class,并通过permits(许可)明确写出能够从该class继承的子类名称。sealed类在Java 15中目前是预览状态,要启用它,必须使用参数–enable-preview和–source 15
  • 把一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)。向上转型实际上是把一个子类型安全地变为更加抽象的父类型。Person p = new Student();(Student类继承自Person类)
  • 不能把父类变为子类,因为子类功能比父类多,多的功能无法凭空变出来。向下转型很可能会失败。失败的时候,Java虚拟机会报ClassCastException
  • instanceof判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为null,那么对任何instanceof的判断都为false
  • Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型
  • 多态:同一个方法可以有不同的实现以及运行方式
  • 多态的特性:运行期才能动态决定调用的子类方法
  • 多态的强大功能:允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码
  • 用final修饰的方法不能被Override
  • 用final修饰的类不能被继承
  • 用final修饰的字段在初始化后不能被修改
  • 把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句;具有抽象方法的类无法被实例化;具有抽象方法的类本身也要声明为abstract
  • 尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程;(定义抽象类A,定义继承类B、C、…,在使用时A a = new B(); a.run();)
  • 如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以把该抽象类改写为接口:interface
  • 接口定义的所有方法默认都是public abstract
  • 当一个具体的class去实现一个interface时,需要使用implements关键字
  • 与单继承不同,一个类可以实现多个interface
  • Java的接口特指interface的定义,表示一个接口类型和一组方法签名,而编程接口泛指接口规范,如方法签名,数据格式,网络协议等
  • 接口可以定义default方法
  • 一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法
  • 合理设计interface和abstract class的继承关系,可以充分复用代码。一般来说,公共逻辑适合放在abstract class中,具体逻辑放到各个子类,而接口层次代表抽象程度
  • 实例化的对象永远只能是某个具体的子类,但总是通过接口去引用它,因为接口比抽象类更抽象
  •   interface Person {  //定义default方法String getName();default void run() {System.out.println(getName() + " run");}}
    
  • default方法的目的:当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
  • 实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段
  • 对于静态字段,无论修改哪个实例的静态字段,效果都是一样的:所有实例的静态字段都被修改了
  • 实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为类名.静态字段来访问静态对象
  • 调用静态方法不需要实例变量,通过类名就可以调用
  • 静态方法内部,无法访问this变量,也无法访问实例字段,它只能访问静态字段
  • Java程序的入口main()是静态方法
  • interface可以有静态字段,并且静态字段必须为final类型;public static final int MALE = 1;其中public static final可以省略
  • Java定义了一种名字空间,称之为包:package。一个类总是属于某个包
  • 在定义class的时候,我们需要在第一行声明这个class属于哪个包
  •   package xxx; // 申明包名xxxpublic class Person {}
    
  • Java虚拟机执行的时候,JVM只看完整类名,只要包名不同,类就不同
  • 包可以是多层结构,用.隔开。例如:java.util;包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系
  • 没有定义包名的class,它使用的是默认包,非常容易引起名字冲突;我们需要按照包结构把上面的Java文件组织起来,即所有Java文件对应的目录层次要和包的层次一致;编译后的.class文件也需要按照包结构存放
  •   // 编译命令,在src目录下javac -d ../bin ming/Person.java hong/Person.java mr/jun/Arrays.java
    
  • 不用public、protected、private修饰的字段和方法就是包作用域
  • 包及其下类引入方法:

一:完整的包路径,xx.xxx.Array a = new xx.xxx.Array()
二:import导入,如 import xx.xxx.Array
三:static import,静态导入可以导入该包下类的静态方法以及静态变量(很少用)

  • Java编译器最终编译出的.class文件只使用完整类名;如果是完整类名,就直接根据完整类名查找这个class;如果是简单类名,按下面的顺序依次查找:查找当前package是否存在这个class;查找import的包是否包含这个class;查找java.lang包是否包含这个class
  • 如果有两个class名称相同,例如,mr.jun.Arrays和java.util.Arrays,那么只能import其中一个,另一个必须写完整类名
  • 使用倒置的域名来确保唯一性:com.liaoxuefeng.sample
  • 不要和java.lang包的类重名
  • 不要和JDK常用类重名
  • 如果一个类内部还定义了嵌套类,那么,嵌套类拥有访问private的权限
  • 定义为protected的字段和方法可以被子类访问,以及子类的子类
  • 包作用域是指一个类允许访问同一个package的没有public、private修饰的class,以及没有public、protected、private修饰的字段和方法
  • public作用域大于package作用域(在另一个包中,对于public类需要import)
  • 内部类与普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例
  • 观察Java编译器编译后的.class文件可以发现,Outer类被编译为Outer.class,而Inner类被编译为Outer$Inner.class
  • 在定义匿名类的时候就必须实例化它
  • 观察Java编译器编译后的.class文件可以发现,Outer类被编译为Outer.class,而匿名类被编译为Outer$1.class
  • Inner Class除了有一个this指向它自己,还隐含地持有一个Outer Class实例,可以用Outer.this访问这个实例(方法内)
  • classpath是JVM用到的一个环境变量,它用来指示JVM如何搜索class
  • JVM依据classpath环境变量搜索所需要编译的类,推荐通过java参数的方式提供classpath(java -classpath/-cp …);JVM依次在指定的classpath下搜索所需要的类;如果没有设置系统环境变量,也没有传入-cp参数,那么JVM默认的classpath为.,即当前目录
  • 在IDE中运行Java程序,IDE自动传入的-cp参数是当前工程的bin目录和引入的jar包
  • 不要把任何Java核心库添加到classpath中!JVM根本不依赖classpath加载核心库!
  • jar包可以把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件;jar包实际上就是一个zip格式的压缩文件,而jar包相当于目录。如果我们要执行一个jar包的class,就可以把jar包放到classpath中
  • 注意:.jar压缩方式与.zip压缩格式相同,直接修改文件后缀即可
  • jar包还可以包含一个特殊的/META-INF/MANIFEST.MF文件,MANIFEST.MF是纯文本,可以指定Main-Class和其它信息。JVM会自动读取这个MANIFEST.MF文件,如果存在Main-Class,我们就不必在命令行指定启动的类名
  • jar包可以包含其它jar包,这时需要在MANIFEST.MF文件里配置classpath
  • jar只是用于存放class的容器,它并不关心class之间的依赖
  • 从Java 9开始引入的模块,主要是为了解决“依赖”这个问题。如果a.jar必须依赖另一个b.jar才能运行,那我们应该给a.jar加点说明啥的,让程序在编译和运行的时候能自动定位到b.jar,这种自带“依赖关系”的class容器就是模块(Module)
  • 从Java 9开始,原有的Java标准库已经由一个单一巨大的rt.jar分拆成了几十个模块,这些模块以**.jmod**扩展名标识,保存在$JAVA_HOME/jmods目录下
  • 把class封装为模块不但需要打包,还需要写入依赖关系,并且还可以包含二进制代码(通常是JNI扩展)。此外,模块支持多版本,即在同一个模块中可以为不同的JVM提供不同的版本
  • 相较普通java程序文件目录,模块化编写仅仅在src目录下多了一个module-info.java文件,这就是模块的描述文件
  • 当我们使用模块声明了依赖关系后,才能使用引入的模块
  • 模块构建流程
  1. src目录下添加module-info.java文件,文件中通过requires以及exports来分别指定该模块需要依赖的模块以及该模块向外界暴露的接口。
  2. 将整个java程序打包为jar包(包含module-info.java文件)
  3. 通过jmod命令将jar包转换为.jmod包
  4. 运行模块
  5. 可以通过jlink基于模块为标准JRE瘦身打造专属的JRE(仅保留标准JRE中需要被使用的模块),其他用户可以直接运行包含JRE的模块
  • 模块进一步隔离了代码的访问权限(必须暴露之后才能进行访问)

3. Java核心类

  • String是一个引用类型,它本身也是一个class。Java编译器对String有特殊处理,即可以直接用"…"来表示一个字符串
  • Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现
  • String.toUpperCase()方法不是改变了原本的字符串值,而是在内存中新建了一个字符串并修改了变量的指向
  • String提供了isEmpty()和isBlank()来判断字符串是否为空是否为空白字符串
  • 字符串提供了formatted()方法(实例对象使用)和format()静态方法(String类使用),可以传入其他参数,替换占位符,然后生成新的字符串
  • 把任意基本类型或引用类型转换为字符串,可以使用静态方法valueOf()
  • 把字符串转换为其他类型,就需要根据情况;int n1 = Integer.parseInt(“123”); // 123;boolean b1 = Boolean.parseBoolean(“true”); // true
  • Integer有个getInteger(String)方法,它把该字符串对应的系统变量转换为Integer;Integer.getInteger(“java.version”); // 版本号,11
  • String和char[]类型可以互相转换
  • 通过new String(char[])创建新的String实例时,它并不会直接引用传入的char[]数组,而是会复制一份,所以,修改外部的char[]数组不会影响String实例内部的char[]数组
  • UTF-8编码是一种变长编码,用来把固定长度的Unicode编码(2字节)变成1~4字节的变长编码;容错能力强。如果传输过程中某些字符出错,不会影响后续字符,因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,它经常用来作为传输编码
  • Java中,char类型实际上就是两个字节的Unicode编码;
  •   // 如何转换编码方式byte[] b1 = "Hello".getBytes(); // 按系统默认编码转换,不推荐byte[] b2 = "Hello".getBytes("UTF-8"); // 按UTF-8编码转换byte[] b2 = "Hello".getBytes("GBK"); // 按GBK编码转换byte[] b3 = "Hello".getBytes(StandardCharsets.UTF_8); // 按UTF-8编码转换String s1 = new String(b, "GBK"); // 按GBK转换String s2 = new String(b, StandardCharsets.UTF_8); // 按UTF-8转换
    
  • Java编译器对String做了特殊处理,使得我们可以直接用+拼接字符串,但是每次拼接会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率
  • Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象
  • StringBuilder还可以进行链式操作;进行链式操作的关键是,定义的append()方法会返回this,这样,就可以不断调用自身的其他方法
  • 对于普通的字符串+操作,并不需要我们将其改写为StringBuilder,因为Java编译器在编译时就自动把多个连续的+操作编码为StringConcatFactory的操作。在运行期,StringConcatFactory会自动把字符串连接操作优化为数组复制或者StringBuilder操作
  • StringBuffer是Java早期的一个StringBuilder的线程安全版本,它通过同步来保证多个线程操作StringBuffer也是安全的,但是同步会带来执行速度的下降;StringBuilder和StringBuffer接口完全相同,现在完全没有必要使用StringBuffer
  • 类似用分隔符拼接数组的需求很常见,所以Java标准库还提供了一个StringJoiner
  • 包装类用于把一个基本类型视为对象(引用类型),只包含一个基本数据类型成员变量
  • 直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)
  • 自动装箱和自动拆箱只发生在编译阶段,目的是为了少写代码
  • 所有的包装类型都是不变类
  • 我们把能创建“新”对象的静态方法称为静态工厂方法。Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存的实例以节省内存
  • 在计算机内存中,只用二进制表示,不存在十进制或十六进制的表示方法。int n = 100在内存中总是以4字节的二进制表示
  • 所有的整数和浮点数的包装类型都继承自Number,因此,可以非常方便地直接通过包装类型获取各种基本类型
  • 无符号整型和有符号整型的转换在Java中就需要借助包装类型的静态方法完成
  • JavaBean是一种符合命名规范的class,它通过getter和setter来定义属性
  • 通常把一组对应的读方法(getter)和写方法(setter)称为属性(property);只有getter的属性称为只读属性(read-only);只有setter的属性称为只写属性(write-only)
  • JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输
  • 枚举一个JavaBean的所有属性,直接使用Java核心库提供的Introspector(参数为ClassName.class,返回BeanInfo)
  • class属性是从Object继承的getClass()方法带来的
  • 使用enum来定义枚举类:让编译器能自动检查某个值在枚举的集合内,并且,不同用途的枚举需要不同的类型来标记
  • enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误
  • 使用enum定义的枚举类是一种引用类型,引用类型比较,要始终使用equals()方法,但enum类型可以例外,因为enum类型的每个常量在JVM中只有一个唯一实例
  • enum和class没有任何区别,继承自Enum类,且定义方法独特;
 public final class Color extends Enum { // 继承自Enum,标记为final class// 每个实例均为全局唯一:public static final Color RED = new Color();public static final Color GREEN = new Color();public static final Color BLUE = new Color();// private构造方法,确保外部无法调用new操作符:private Color() {}
}
  • 判断枚举常量的名字,要始终使用name()方法,绝不能调用toString()(toString方法是为了让输出更具有可读性)
  • 从Java 14开始,引入了新的Record类(用于取代“不变类”,不变类:final class,final field)
//定义方法,内部不需要用内容,自动生成两个privarte final字段x与y
public record Point(int x, int y) {}
  • 除了用final修饰class以及每个字段外,编译器还自动为我们创建了构造方法,和字段名同名的方法,以及覆写toString()、equals()和hashCode()方法
  • 如果我们要检查参数,我们就需要添加Compact Constructor(契约构造函数,用于检查输入的参数值是否符合要求)
  • 在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。如果我们使用的整数范围超过了long型,就只能用软件来模拟一个大整数。java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数:
  • BigInteger和Integer、Long一样,也是不可变类,并且也继承自Number类
  • BigInteger可以轻松地转换为对应的基本类型(instance.xxxValue();)如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()、longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常
  • 如果BigInteger转换为浮点数时超过了浮点数的最大范围,直接返回Infinity
  • 和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数
  • 对BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断
  • 比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等
  • 总是使用compareTo()比较两个BigDecimal的值,不要使用equals()
  • BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数;BigDecimal也是从Number继承的,也是不可变对象
  • 如果我们要生成一个区间在[MIN, MAX)的随机数,可以借助Math.random()实现(Math.random()生成一个0-1之间的随机数)
  • Java标准库还提供了一个StrictMath,它提供了和Math几乎一模一样的方法。这两个类的区别在于,由于浮点数计算存在误差,不同的平台(例如x86和ARM)计算的结果可能不一致(指误差不同),因此,StrictMath保证所有平台计算结果都是完全相同的,而Math会尽量针对平台优化计算速度;绝大多数情况下使用Math就足够了
  • Random用来创建伪随机数。所谓伪随机数,是指只要给定一个初始的种子,产生的随机数序列是完全一样的
  • 创建Random实例时,如果不给定种子,就使用系统当前时间戳作为种子,因此每次运行时,种子不同,得到的伪随机数序列就不同
  • Math.random()实际上内部调用了Random类,所以它也是伪随机数,只是我们无法指定种子
  • SecureRandom通过量子力学原理来获取一个真随机数;SecureRandom无法指定种子,它使用RNG(random number generator)算法。JDK的SecureRandom实际上有多种不同的底层实现,有的使用安全随机种子加上伪随机数算法来产生安全的随机数,有的使用真正的随机数生成器。实际使用的时候,可以优先获取高强度的安全随机数生成器,如果没有提供,再使用普通等级的安全随机数生成器
  • SecureRandom的安全性是通过操作系统提供的安全的随机种子来生成随机数。这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”

Java杂项基础知识点总结相关推荐

  1. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  2. java重要基础知识点_java基础知识点整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java基础知识点整理1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. ...

  3. Java常用基础知识点总结(最全)

    Java基础知识点总结 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 四.Java虚拟机 五.数据库(Sql. ...

  4. Java入门基础知识点

    java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆斯·高斯林)在Sun Microsystems公司和同事共同研发,Microsystems如今已经被ora ...

  5. Java入门基础知识点整理大放送,推荐保存

    为了方便大家学习Java,理顺Java技术知识点,也可以助您尽快的努力成长起来,小编整理了以下Java入门基础知识,一起来学习吧! 一.概述 1991年Sun公司的James Gosling等人开始开 ...

  6. java 学习基础知识点拾遗 导航页

    每种编程语言的知识点都是很多很杂的,java也是如此 相信很多人学习的过程中都是深一脚浅一脚,最基础的东西可能有些也不是非常确定 整理了最基本的一些知识点,可以说是java入门的-1层级别的,作为自己 ...

  7. Java面试基础知识点简要总结

    目录 Java基础 1. 为什么Java代码可以一次编译,到处运行 2. Java的基本数据类型以及它们的范围 3. 自动装箱和自动拆箱 4. Object类中的方法 5. 说一说hashcode() ...

  8. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承 - 一个子类只能有一个父类 - 一个父类可以派生出多个子类 这里写图片描述 子类继承了父类,就继承了父类的方法和属性. 在子类中,可以使用父类中定义的方 ...

  9. java必备基础知识点

    转载自:  http://www.cnblogs.com/whyhappy/p/5279802.html Java基础 1. 简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其 ...

最新文章

  1. 从地址字符串获取省市区信息
  2. 第二部分:IDEA 常用设置
  3. javascript工具类(util)-持续更新
  4. Map集合根据key,value排序
  5. 果园机器人作文开头_易学好用的万能开头—热点事件引入式
  6. Egret开发HTML5小游戏代码分享
  7. 蔚来:ET7首批预生产车正式下线
  8. “碰瓷”特斯拉翻船,卡车界明星创企Nikola身陷“骗局”危机
  9. java 返回值给c_Java有陷阱,用时需谨慎——慎用入参做返回值
  10. 使用Visual Studio SDK制作GLSL词法着色插件
  11. “咏刚的家”全新改版
  12. mysql视图的更新 条件_MySQL进阶16 - 视图的创建/修改/删除/更新--可更新性的不适用条件...
  13. centos下修改mysql默认端口
  14. php 裁剪png图片,解决thinkphp裁剪png图片背景不透明的方法
  15. Teemo 子域名收集工具安装
  16. 修改手机状态栏字体的颜色(如:白底黑字)
  17. __attribute__((__aligned__(n)))对结构体对齐的影响
  18. E.Neko and Flashback
  19. 优课联盟 实境英语 Test for Unit 5
  20. MongoDB 中文的全文索引

热门文章

  1. 送一些专属红包封面。
  2. 2020中山大学计算机学院保研,我校举行中山大学2020级研究生招生宣讲会
  3. shipyard管理多HOST
  4. 12306个人敏感信息泄露
  5. 手机怎么设置企业邮箱的服务器,如何在手机上设置网易企业邮箱
  6. 计算机网络需要买什么电脑,教你如何自己配一台专门用来吃鸡的电脑
  7. 酱香科技不在YYDS了,市盈率50倍的白酒,要回调到25倍的市盈率?泡沫要破灭了
  8. Qualcomm MSM8916 将开关机动画放置到指定分区做法
  9. 学计算机高中应该学什么科目,@所有高中生!新高考怎么选科?计算机类专业该怎么选科?...
  10. 经纬度数据计算-JavaScript