琐碎的java知识点

java程序入口

java应用程序的主类必为public类,包含了main方法,是操作整个应用程序的入口

java与c++区别

java和c++区别:1、java是单继承的,只能同时继承一个父类,但可以同时实现多个接口;2、java有自动内存管理机制,gc垃圾回收器;3、c++在不同平台生成的机器代码不相同,不可以跨平台运行,但java生成的字节码可以在针对不同平台定制的JVM上运行,实现了跨平台。

Oracle JDK还是Open JDK

选Oracle JDK还是OpenJDK?选前者吧,前者更新频率低,但更稳定,JVM性能也更好

java数据类型

数据类型:基础数据类型(整型1/2/4/8+浮点型4/8+字符型2+布尔型1)+引用类型(类+接口+数组)

switch

switch不可用在long上,可以是byte、short、int、char、枚举类型、String

Math.round

Math.round是四舍五入,对于负数参数,+0.5后向下取整

java中的double字面量

小数字面量常数默认是double类型,所以赋值语句float num = 2.4;可能导致截断,应该强制转换来保证正确性:float num = (float)2.4;

short字面量

short s1 = 1; s1 = s1 + 1;中, 1 默认是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short(s1 + 1);其中有隐含的强制类型转换。

万国码

Java语言采用Unicode编码标准,Unicode也称万国码,为每个字符制订了一个唯一的数值,因此在任何的语言,平台,程序都可以放心的使用。

goto

goto是java的保留字,但不能使用

this/super

this的不熟用法:代表本类的构造器

扫描二维码关注公众号,回复: 14854817 查看本文章
class Person{
    
    
    private String name;
    private int age;
    public Person() {
    
    
    }
    public Person(String name) {
    
    
        this.name = name;
    }
    public Person(String name, int age) {
    
    
        this(name);
        this.age = age;
    }
}

super是离自己最近的一个父类(直接父类),用法与this相似,super(成员变量);代表父类相应的成员变量,super(参数)代表调用父类的相应构造函数。

一次break跳出多重循环

一次性(使用一个break)跳出多重循环:

ok: // 标号
    for (int i = 0; i < 10; i++) {
    
    
        for (int j = 0; j < 10; j++) {
    
    
            System.out.println("i=" + i + ",j=" + j);
            if (j == 5) {
    
    
                break ok;
            }
        }
    }

面向对象

面向过程编程的性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。但没有面向对象编程易维护、易复用、易扩展。

面向对象编程易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护,缺点就是性能比面向过程低。

面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。

面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。

面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。

继承

继承如下 3 点请记住:

  • 子类拥有父类非 private 的属性和方法。
  • 子类可以对父类进行扩展。
  • 子类可以对父类非静态、非private、非final方法的实现过程进行重写

多态

多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

多态好处就是:父类或接口类型的引用变量可以指向子类或具体实现类的实例,提高了程序的拓展性。实现多态需要做3件事:1、继承或实现;2、方法重写;3、向上转型:用一个父类型引用多个子类型对象,然后调用父类方法就会根据子类对象的不同而实际调用子类的不同方法。

设计原则

面向对象应用系统设计的基本原则是什么?
1、单一职责:尽量减少单一模块功能,有利于降低模块之间的耦合度
2、开放封闭:对拓展开放,对修改封闭,即可增加新功能,但不能修改旧功能
3、里式替换:子类可以替换父类出现在父类能够出现的任何地方
4、依赖倒置:面向接口编程思想,尽量不继承任何的具体类,声明变量时也尽量使用抽象类或接口,目的是降低耦合度,提升并发开发效率,提升系统稳定性
5、接口分离:接口也尽量按照不同功能分离开来

接口/抽象类

优先选用接口去定义子类行为,尽量少用抽象类。

既需要定义子类的行为,又要为子类提供通用的功能时,再用抽象类。

抽象类可有构造器,接口不能有。

接口的成员变量必须是不可变的,且是加载时声明好的,既static又final

接口中可以有:
1、成员变量,但其实是常量,static和final修饰;
2、抽象方法;
3、1.8开始可定义默认方法,default修饰;
4、1.8开始,可定义静态方法;
5、1.9开始,可定义私有方法,可静态或非静态

equals与==

equals方法是Object类的一个方法,Object里面它的含义等价于==,当继承Object的类重写equals方法后,会发生变化,例如String就重写了equals方法,含义变成两个字符串内容是否相等,而非单纯的地址相等。

一般来说,重写equals和重写hashCode必须同时进行,或都不进行。拿HashSet举例,两个对象的equals重写后,内容相同,但地址不同,即hashCode不同,但HashSet内部的add方法就是根据hashCode判断元素是否重复,所以equals和hashCode的结果必须匹配才行

JDK 中常用的包:

  • java.lang:这个是系统的基础类;
  • java.io:这里面是所有输入输出有关的类,比如文件操作等;
  • java.nio:为了完善 io 包中的功能,提高 io 包中性能而写的一个新包;
  • java.net:这里面是与网络有关的类;
  • java.util:这个是系统辅助类,特别是集合类;
  • java.sql:这个是数据库操作的类。

import java和import javax有什么区别?
最早 JavaAPI 所必需的包是 java 包,javax 是个补充的包,现在javax 逐渐成为了 Java API 不可缺少的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部分。

字符串

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

String 类是 final 类,不可以被继承。

StringBuilder 或者 stringBuffer 的 reverse() 方法可以将字符串内容反转。如果字符串很少修改,使用String;如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder,当数据量较大时,StringBuilder效率更高。(但StringBuffer线程安全,StringBuilder非线程安全)

String类中使用final的字符数组保存字符串:private final char value[],所以string对象是不可变的。
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

String中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

String str="i"String str=new String(“i”)不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而String str=new String(“i”)则会被分到堆内存中。

String s = new String(“xyz”);创建了两个字符串对象,一个是常量池中的"xyz",一个是用new创建在堆上的对象。

在使用 HashMap 的时候,用 String 做 key 有什么好处?HashMap 通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。

自动装箱

Integer num = 20;就是个自动装箱过程,相当于调用Integer num = Integer.valueOf(20);看一下源码:

public static Integer valueOf(int i) {
    
    
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

发现当 i > 127 i>127 i>127 i < − 128 i<-128 i<128时,才会在堆内创建一个新的Integer对象并返回,不然就直接在Integer的成员变量static final Integer cache[]中取出对应数值的Integer对象,返回

char的装箱也是这样,更简单了,缓存了两个Character对象,分别对应true和false,需要哪个valueOf就返回哪个

但Double和Float就没有缓存,而是直接创建新对象返回,因为数据范围太大了,保存太大的缓存不值当

猜你喜欢

转载自blog.csdn.net/weixin_48288539/article/details/125910555