当前位置:网站首页 > Java基础 > 正文

java最基础面试



1.3Java 的基本数据类型有哪些?

1.4简述 Java 中的值传递和引用传递?

1.值传递

在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制

一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。 因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

2、引用传递

引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量

的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。

在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象

结论:

基本数据类型传值,对形参的修改不会影响实参;

引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。String, Integer, Double 等 immutable 的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

1.5char 型变量中能不能存储一个中文汉字,为什么?

类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择任何特定的

编码,直接 使用字符在字符集中的编号,这是统一的唯一方法),一个 char 类型占 2 个字节(16 比特),所以放一个中 文是没问题的。

1.6重载和重写的区别?

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类, 访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

1.7==与equals的区别?

对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。

对于equals方法,注意:equals方法不能作用于基本数据类型的变量;

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

1.8String、StringBuffer、StringBuilder 的区别?

String 是不可变的对象,每次对 String 类型进行改变的时候其实是产生了一个新的 String 对象,然后指针指向新的 String 对象;

StringBuffer 是线程安全的可变字符序列,需要同步,则使用。

StringBuilder 线程不安全,速度更快,单线程使用。

(String 是一个类,但却是不可变的,所以 String 创建的算是一个字符串常量, StringBuffer 和 StringBuilder 都是可变的。所以每次修改 String 对象的值都是新建一个对象再指向这个对象。而使用 StringBuffer 则是对 StringBuffer 对象本身进行操作。所以在字符串 j 经常改变的情况下,使用 StringBuffer 要快得多。)

对于三者使用的总结:

1. 操作少量的数据 = String

java最基础面试

2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder

3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffffer

1.9final 关键字的一些用法?

final关键字主要用在三个地方:变量、方法、类。

对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。

使用final方法的原因有两个

第一个原因是把方法锁定,以防任何继承类修改它的含义;

第二个原因是效率。

在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为fianl。

1.10Object类是一个特殊的类,是所有类的父类。

它主要提供了以下11个方法:

public final native Class<?> getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。

public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。

public boolean equals(Object obj)//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。

protected native Object clone() throws CloneNotSupportedException//naitive方法,用于创建并返回当前对象的一份拷贝。一般情况下,对于任何对象 x,表达式 x.clone() != x 为true,x.clone().getClass()

==  x.getClass()  为true。Object本身没有实现Cloneable接口,所以不重写clone方法并且进行调用的话会发生CloneNotSupportedException异常。

public String  toString()//返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的子类都重写这个方法。

public final native void notify()//native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。

public final native void notifyAll()//native方法,并且不能重写。跟notify一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程。

public final native void wait(long timeout) throws InterruptedException//native方法,并且不能重写。暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁 。timeout是等待时间。

public final void wait(long timeout, int nanos) throws InterruptedException//多了nanos参数, 这个参数表示额外时间(以毫微秒为单位,范围是 0-)。 所以超时的时间还需要加上nanos毫秒。

public final void wait() throws InterruptedException//跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念

protected void finalize() throws Throwable { }//实例被垃圾回收器回收的时候触发的操作

1.11接口和抽象类的区别是什么?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

1.12什么是单例模式?有几种?

单例模式:某个类的实例在 多线程环境下只会被创建一次出来。

单例模式有饿汉式单例模式、懒汉式单例模式和双检锁单例模式三种。

饿汉式:线程安全,一开始就初始化。

懒汉式:非线程安全,延迟初始化。

  • 上一篇: java基础教学116
  • 下一篇: java 基础数据结构
  • 版权声明


    相关文章:

  • java基础教学1162025-04-12 13:58:03
  • java循环语句基础2025-04-12 13:58:03
  • java教学基础讲解2025-04-12 13:58:03
  • java程序设计基础知识点2025-04-12 13:58:03
  • java基础课程2025-04-12 13:58:03
  • java 基础数据结构2025-04-12 13:58:03
  • java servlet基础2025-04-12 13:58:03
  • 零基础学java要多长时间2025-04-12 13:58:03
  • java基础教学2672025-04-12 13:58:03
  • java基础语法翻译2025-04-12 13:58:03