JAVA基础

    科技2025-07-06  18

    文章目录

    原理IO流java中IO流有几种? 4 对象和类Java基本数据类型面向对象和面向过程的区别装箱和拆箱==与equals的区别hashCode与equals重写和重载==object类有哪些方法==String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?接口和抽象类的区别面向对象三大特性构造器Constructor是否可以被overide?在Java中定义一个不做事且没有参数的构造方法的作用静态方法内 5 继承多态final、static、this、superString str="i" 与 String str=new String("i")一样吗?hashCode与equals普通类和抽象类的区别接口与抽象类的区别1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?

    原理

    hashmap

    IO流

    java中IO流有几种?

    Java对大小写敏感 源代码的文件名与公共类的名字相同 main函数要是public修饰的,

    // BigIntegerTest.java import java.util.*; public class BigIntegerTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); int k = in.nextInt(); System.out.println(k); //换行输出 System.out.print(k); //不换行 } }

    String是不可变字符串 char [] 是 char*指针而不是字符型数组。 java.math中有两个类BigInteger、BigDecimal,用add multiply等函数表示加 乘之类。

    ==符号不能用来检测两个字符串是否相等,因为它检查的是两个字符串是否放在同一位置上,应用"Hello".equals(greeting); //greeting=“hello”;

    4 对象和类

    对象在堆中,局部变量在栈中 final声明过的变量不会再被改变 只有构造器,没有析构器,因为有自动垃圾回收机制 import java.util.* 导入java.util这个包,一次只能导入一个包

    Java基本数据类型

    1.内置数据类型 6种数字类型(byte 1字节, short 2字节,int 4字节,long 8字节,float 4字节,double8字节)+boolean 1位+char 16位Unicode字符

    2.引用数据类型,指向的一个对象,对象和数组都是引用数据类型。 3 Java常量,用final定义 类型转换:不能对boolean类型进行类型转换;不能把对象类型转换成不想关类的对象; 把容量大的类型转换成容量小的类型时必须使用强制类型转换;类型转换可能会损失精度。 自动类型转换:转化前的数据类型位数低于转换后的数据类型。 强制类型转换:转换的数据类型是兼容的。

    面向对象和面向过程的区别

    面向过程:面向过程的性能比面向对象高。因为面向对象需要类实例化,开销比较大,比较消耗资源。当性能是最重要的考量因素时,比如单片机,嵌入式开发,Linux/Unix等一般是使用面向过程开发。

    面向对象:面向过程没有面向对象易维护、易复用、易拓展。面向对象有封装、继承、多态三大特性,因此可以设计出低耦合的系统,使得系统更加灵活,更加易于维护,但是面向对象比面向过程性能低。

    装箱和拆箱

    装箱:自动将基本数据类型转换成包装类; 拆箱:自动将包装类转换成基本数据类型

    ==与equals的区别

    ==是比较的地址值是否相等,基本数据类型是比较的值,引用数据类型比较的地址equals在没有重写Object里的equals方法时,euqals也等同于==,重写equals后用对象里的内容来判断两个对象是否相等。 String x = "String"; String y = "String"; String z = new String("String"); String h = z; String k = new String("String"); System.out.println(x == y); //true System.out.println(x == z); //false System.out.println(z == k); //false System.out.println(z == h); //true System.out.println(x.equals(z)); //true System.out.println(z.equals(k)); //true

    hashCode与equals

    重写和重载

    重写:方法前加入@overide注解,发生在运行期间的,子类对可以访问的父类方法的实现过程进行改写。 注意形参列表、方法名、返回类型都相同,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类; 用static、final、private修饰的方法不同重写(被static修饰的方法能被再次声明) 构造器不能重写 重载:类中方法名相同,形参的数量、类型或顺序不同时,视为重载。 重写和重载的区别: 重写是运行时的多态,重载是编译时的多态。

    object类有哪些方法

    1.getClass方法 获取运行时类型,返回值为Class对象 2.hashCode方法 返回该对象的哈希码值,是为了提高哈希表的性能(HashTable) 3.equals方法 判断两个对象是否相等,在Object源码中equals就是使用去判断,所以在Object中equals是等价于的,但是在String及某些类对equals进行了重写,实现不同的比较。 4.clone方法 主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这是就需要在类中复写clone方法。 如果在clone方法中调用super.clone()方法需要实现Cloneable接口,否则会抛出CloneNotSupportedException。 此方法只实现了一个浅层拷贝,对于基本类型字段成功拷贝,但是如果是嵌套对象,只做了赋值,也就是只把地址拷贝了,所以没有成功拷贝,需要自己重写clone方法进行深度拷贝。 5.toString方法 返回一个String字符串,用于描述当前对象的信息,可以重写返回对自己有用的信息,默认返回的是当前对象的类名+hashCode的16进制数字。 6.wait方法 多线程时用到的方法,作用是让当前线程进入等待状态,同时也会让当前线程释放它所持有的锁。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,当前线程被唤醒 7.notify方法 多线程时用到的方法,唤醒该对象等待的某个线程 8.notifyAll方法 多线程时用到的方法,唤醒该对象等待的所有线程 9.finalize

    对象在被GC释放之前一定会调用finalize方法,对象被释放前最后的挣扎,因为无法确定该方法什么时候被调用,很少使用。

    String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?

    String里用final修饰字符数组来保存字符串,private final char[],所以内容是不可变的,线程安全的。StringBuffer和StringBuilder都继承于AbstractStringBuilder,AbstractStringBuilder用字符数组char[]来存值,没有用final修饰,所以是可变的。AbstractStringBuilder里定义了一些操作字符串的方法, 如expandCapacity、append、 insert、 indexOf。 StringBuffer里对方法加了同步锁,所以是线程安全的;StringBuilder没对方法加同步锁,所以是非线程安全的。

    每次改变String类型的时候会生成新的对象,指针指向新的对象;StringBuffer和StringBuilder则不用生成新的对象并改变对象引用,StringBuilder相比于StringBuffer有10%~15%的性能提升,但却要冒线程不安全的风险。 String适用于操作少量数据; StringBuilder适用于单线程操作字符串缓冲区下大量数据; StringBuffer适用于多线程操作字符串缓冲区下大量数据。

    接口和抽象类的区别

    抽象对象成员变量可以是各种类型的,接口中的变量只能是public static final类型的。 抽象类中的方法可以有方法体,接口中的方法都是抽象方法。 接口中不能含有静态代码块和静态方法,而抽象类中可以有静态代码块和静态方法。 一个类只能继承一个抽象类,而一个类可以实现多个接口。

    面向对象三大特性

    封装、继承、多态 封装:使用抽象数据类型将数据和对数据的操作封装起来,对外隐匿数据的细节,只保留一些接口供外部操作。 封装的实现是: 属性为private 有set get方法来对属性进行读写 e.g:

    public class People { /* * 对属性的封装一个人的姓名、年龄 */ private String name; private int age; /* * setter()、getter()是该对象对外开发的接口 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

    继承:保持已有类的特性来构造新类,新类的构造复用了父类的代码。 继承的特点是:只允许单继承,多层继承子类的时候不建议超过三层。 多态:引用变量指向的实例对象的类型和该引用对象发出的方法调用在编程时并不能确定,在运行期间才能确定。 实现多态的方法有继承(子类对父类的同一个方法的重写)和接口(实现接口并覆盖接口中同一方法)

    构造器Constructor是否可以被overide?

    overide重写是子类对父类的可访问方法,形参和返回值不变,改变方法内的实现

    Constructor不能被重写,但是可以重载,一个类中可以有多个构造函数。

    在Java中定义一个不做事且没有参数的构造方法的作用

    Java程序再执行子类的构造方法前,如果没有用super()来调用父类特定的构造方法,就会调用父类中没有参数的构造方法。如果父类中只定义了有参数的构造方法,在子类构造器中又没有用super()来调用父类中特定的构造方法,那么编译时会发生错误。所以有必要在父类中定义一个不做事且没有参数的方法。

    静态方法内

    5 继承

    子类中用到超类中放入私有域,super.方法()来调用 子类构造器:要不就第一句显式的调用超类的构造器,否则自动调用超类默认的无参构造器,如果超类没有无参的构造器,java编译器报错。

    多态

    多态:把子类对象引用赋给超类变量

    一个引用类型变量如果声明为父类的类型,但实际引用的子类的对象,那么该变量不能再访问子类中添加的属性和方法。

    子类中定义了与父类同名同参数的方法,在多态情况下,父类的该方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的方法,这样的方法调用在编译器无法确定在运行时才能确定,称为动态绑定。

    Java引用变量有两个类型,编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

    final、static、this、super

    final: final修饰的类不能被继承,且该类中所有的方法都会被隐式指定为final方法; final修饰的方法不能被重写; final修饰的变量,如果是基本数据类型,那么其数值初始化后不能被更改,如果是引用数据类型,那么初始化后就不能再指向别的对象。 static: 修饰成员变量和成员方法:被static修饰的成语属于类而不是类的某个对象,它被类中的所有对象共享,并且通过类名调用。静态变量被方法Java内存区域的方法区; 静态代码块:定义在类中方法外,执行顺序是:静态代码块–>非静态代码块–>构造方法。该类不管创建多少对象,静态代码块只执行一次; 静态内部类,内部类???:https://snailclimb.gitee.io/javaguide/#/docs/java/basic/final,static,this,super 静态导包: this:对当前对象的引用 super:对父类对象的引用 在构造器中用this调用本类的其他构造方法,或者super调用父类的构造方法时,要将此句放在首行。

    String str=“i” 与 String str=new String(“i”)一样吗?

    不一样。内存分配方式不一样,String str="i"被分配在常量池中,String str=new String(“i”)被分配在堆内存中。

    hashCode与equals

    hashCode方法的作用是获取散列码,来确定该对象在哈希表中的索引位置。

    HashSet【分箱】检查重复的过程:

    把对象加入HashSet时,计算hashCode判断加入的位置,并且和该位置其他对象的hashCode比较,如果没有相同的hashCode,HashSet会假设对象没有重复出现,将该对象加入此位置;如果有相同hashCode的对象,则调用equals方法来检查他们是否相同,如果他们相同,加入操作不成功,否则就把对象散列到其他位置。

    相关性质:

    如果两个对象相等,则他们的hashCode相等,并且调用equals方法返回true;

    如果两个对象hashCode相等,他们不一定相等;

    equals方法被覆盖过,hashCode方法也必须被覆盖;

    hashCode()的默认方法是对堆上的对象产生独特值。如果没有重写hashCode(),那么class的两个对象无论如何都不会相等。

    普通类和抽象类的区别

    普通类不能包含抽象方法,抽象类可以包含(也可以不包含)抽象方法; 抽象类不能直接实例化,普通类可以直接实例化。

    接口与抽象类的区别

    实现:接口用implements来实现接口; 抽象类的子类用extends来继承。 构造函数:抽象类可以有构造函数;接口不能有构造函数。 mian方法:抽象类可以有,并且可以运行;接口不能有。 实现数量:类可以实现多个接口;但是只能继承一个抽象类。 访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。

    1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?

    参考:《Java核心技术 卷1》、《Java核心技术 卷1》前两章、 《Java编程思想》

    Processed: 0.017, SQL: 9