美文网首页
java面试题新

java面试题新

作者: ml66 | 来源:发表于2023-05-09 17:10 被阅读0次

    1. Java中静态方法和实例方法的区别?

    静态方法和实例方法的最大区别在于它们调用的方式不同。静态方法在调用时使用类名访问,而不是实例名访问;实例方法则只能使用实例名访问。
    静态方法是随着类的加载而被加载到方法区中,可以直接通过类名调用。而实例方法必须通过创建对象来进行调用。
    另外,实例方法可以访问非静态成员变量和方法,静态方法只能访问静态成员变量和方法。

    2. Java中的四种访问权限控制关键字是什么?它们的作用分别是什么?

    Java中的四种访问权限控制关键字分别为:public、private、protected和默认(不加任何关键字)。它们的作用分别如下:

    • public:可以被任何类访问
    • private:只能被自己类内部的方法和构造器访问
    • protected:可以被同一个包内的类访问,也可以被不同包的子类访问
    • 默认(不加任何关键字):只能被同一个包内的类访问

    3. Java中抽象类和接口有什么区别?

    Java中抽象类和接口虽然都可以对方法进行抽象,但是它们有以下区别:

    • 抽象类可以有一些已经实现的方法,而接口只能定义抽象方法
    • 抽象类的子类只能继承一个父类,而一个类可以实现多个接口
    • 抽象类可以有构造方法,而接口不能定义构造方法
    • 抽象类可以包含成员变量和静态方法,而接口不能包含成员变量和静态方法

    4. Java中String类为什么是不可变的?

    1)Java中的String类是不可变的,这是为了提高性能和安全性。
    2)字符串常量池是Java中的一个重要概念,如果允许字符串是可变的,那么会给字符串常量池带来很大的安全隐患,因为每次字符串的修改都会导致常量池的变化,而且为了防止出现竞争问题,所有对常量池对象的操作都要使用同步机制。因此,将String类设计为不可变是比较安全的选择。
    3)同时,不可变的字符串也能够带来性能上的优势,因为Java中的字符串常量需要在堆内存中进行存储,如果字符串是不可变的,那么每个线程就能够共享同一个字符串对象,避免了不同线程之间对字符串的重复创建和销毁。

    5. Java中的装箱和拆箱是什么?它们有什么作用?

    1)装箱和拆箱是Java中的两个概念,其中装箱是将基本类型转换为其对应的包装类,而拆箱则是将包装类转换为其对应的基本类型。这两个操作一般是通过自动装箱和自动拆箱来实现的。
    2)装箱和拆箱可以简化代码,提高开发效率。使用包装类可以将基本类型转换为对象类型,使它们能够融入到Java中的面向对象编程中。同时,包装类还提供了一些方便的操作方法,可以对基本类型进行更加灵活、丰富的操作。
    当然,使用装箱和拆箱也可能带来一些性能上的损失,因为这些操作需要进行类型的转换和对象的创建等操作,会产生额外的开销。因此,在编写性能要求较高的程序时,应该尽量避免不必要的装箱和拆箱操作。

    6.String StringBuilder StringBuffer 有什么区别?

    String、StringBuilder和StringBuffer是Java中处理字符串的三种常用方式,它们有以下区别:

    1) 不可变性:String是不可变的,即每个字符串对象都是不可变的。StringBuilder和StringBuffer都是可变的,可以通过其对应的方法在原字符串的基础上进行添加、插入、删除等操作。

    2)线程安全性:String是线程安全的,因为它是不可变的。StringBuilder是非线程安全的,即在多线程环境下使用可能会出现一些意外结果。StringBuffer是线程安全的,即提供了同步机制来保证多线程环境下的安全性。

    3)性能:由于String是不可变的,每次对字符串进行操作都会创建一个新的String对象,因此在频繁操作字符串的场景下,性能可能比较差。StringBuilder和StringBuffer的底层实现都是基于数组来实现的,可以通过数组的扩容机制避免频繁的创建新对象,因此在需要进行大量字符串操作的场景下,StringBuilder和StringBuffer的性能可能比较好。

    总之,如果只需要进行字符串的简单操作,并且不需要在多线程环境下使用,建议使用String;如果需要进行大量字符串的操作,并且不需要考虑线程安全性,建议使用StringBuilder;如果需要在多线程环境下使用,并且需要保证线程安全性,建议使用StringBuffer。

    7.创建多线程有哪几种实现方式?

    Java中创建多线程有以下几种实现方式:

    1) 继承Thread类:创建自定义线程类,继承Thread类,重写run方法来定义线程任务。
    2)实现Runnable接口:创建自定义线程类,实现Runnable接口,重写run方法来定义线程任务。然后将Runnable实例传递给Thread类的构造器中,调用start方法启动线程。
    3)实现Callable接口:创建自定义线程类,实现Callable接口中的call方法来定义线程任务。然后将Callable实例传递给FutureTask类的构造器中,获取FutureTask实例对象;再将FutureTask实例对象传递给Thread类的构造器中,调用start方法启动线程。
    4)使用线程池:使用Executors类中提供的工具方法来创建线程池,然后将任务提交给线程池去执行。
    线程池是Java多线程编程中非常重要的技术,通过线程池,可以复用已经创建的线程,避免频繁创建和销毁线程的开销,提高多线程编程的性能和并发能力。下面是一个简单的线程池示例:

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class ThreadPoolDemo {
        public static void main(String[] args) {
            // 创建一个具有固定线程数(5条)的线程池
            ExecutorService executor = Executors.newFixedThreadPool(5);
            for (int i = 0; i < 20; i++) {
                final int taskId = i;
                // 提交任务到线程池中执行
                executor.execute(new Runnable() {
     @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName() + "处理任务" + taskId);
                    }
                });
            }
            // 关闭线程池
            executor.shutdown();
        }
    }
    

    使用多线程可以提高程序的运行效率,特别是在执行任务强度较大时,如果使用单线程可能会导致线程阻塞或程序崩溃等问题。

    相关文章

      网友评论

          本文标题:java面试题新

          本文链接:https://www.haomeiwen.com/subject/urorsdtx.html