暑期JavaSE 第一次测试复盘

Java的参数传递在参数为基本数据类型时是值传递,在参数为对象时传递的是参数的引用

在Java中,参数传递是按值传递,而不是按引用传递。这是一个常见的误解。

在Java中,当你调用一个方法并将参数传递给它时,实际上是将参数的值传递给了方法。这意味着在方法内部,对参数进行任何修改都不会改变原始引用所指向的对象。然而,如果传递的是引用类型,则可以修改该引用所指向的对象的属性。

传递基本数据类型的例子

比如:

public class Main {
    public static void main(String[] args) {
        int x = 10;
        modify(x);
        System.out.println(x); 
    }

    public static void modify(int value) {
        value = 20;
    }
}

输出:

传递引用类型的例子:

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        modify(arr);
        System.out.println(arr[0]);
    }

    public static void modify(int[] array) {
        array[0] = 100;
    }
}

 总结:Java中的参数传递是按值传递,对于引用类型参数,传递的是引用的值,这使得我们可以修改对象的属性,但不能改变原始引用所指向的对象。

Java中创建String对象主要方式

 
答案解析: 当常量池中没有”xyz"时,在堆中创建一个object,在常量池中创建一个object,共两个object,当常量池中存在"xyz"时,仅在堆中创建一个object

在Java中,创建String对象主要有两种方式:

1. 使用字面量

Java中的字符串字面量都被存储在字符串常量池中。这是Java为了减少相同内容的字符串对象的创建而特意设计的,它可以极大地节省内存空间。

String s1 = "hello";

在这种方式下,当我们写`String s1 = "hello"`的时候,Java会首先查看字符串常量池中是否存在内容为"hello"的String对象。如果存在,那么s1就直接引用这个已存在的对象;如果不存在,那么Java就会在字符串常量池中创建一个新的String对象,然后s1引用这个新创建的对象。

2. 使用关键字`new`

通过使用`new`关键字,我们可以在Java堆内存中创建一个新的String对象。

String s2 = new String("hello");

当我们写`String s2 = new String("hello")`的时候,Java会在堆内存中创建一个新的String对象,无论字符串常量池中是否存在内容为"hello"的String对象。

需要注意的是,使用`new`关键字创建String对象的方式会造成一定的内存浪费。因为每次使用`new`都会在堆内存中创建一个新的对象,即使这个对象的内容与字符串常量池中已有的对象相同。

ThreadPoolExecutor 的五种状态

 答案解析:

ThreadPoolExecutor 的五种状态

1.RUNNING : 线程池创建之后的初始状态,在该状态下可以执行任务

2.SHUTDOWN 该状态下线程池不再接收新任务,但是会将工作队列中的任务执行完毕3.STOP:该状态下线程池不再接收新任务,也不会处理工作队列中的剩余任务,并且将会中断所有工作进程
4.TIDYING:该状态下所有任务都已终止或处理完成,将会执行terminated0钩子方法5.TERMINATED :执行完terminated方法之后的状态

ArrayList和Vector

ArrayList和Vector都是Java中常用的列表类型,它们都实现了`List`接口,可以动态地增加和减少元素。以下是它们的一些相同点和不同点:

相同点:

1. 数据结构: `ArrayList`和`Vector`底层都使用数组来存储数据。当列表的元素数量超过数组的容量时,都需要将数组扩容(通常是扩大到原来的两倍)。

2. 有序性: 两者都保证元素的顺序,即元素插入的顺序和实际存储的顺序一致。

3. 支持随机访问: 由于底层都是使用数组存储,所以都支持通过索引直接访问元素,时间复杂度为O(1)。

不同点:

1. 同步性: `Vector`是线程安全的,它的大部分方法都是同步的,可以在多线程环境下使用。而`ArrayList`则是线程不安全的,如果在多线程环境下使用,需要自己处理同步问题。

2. 性能: 由于`Vector`需要处理同步问题,所以在单线程环境下,`ArrayList`的性能通常会优于`Vector`。

3. 增长策略:当需要扩容时,`ArrayList`通常扩大到原来的1.5倍,而`Vector`通常扩大到原来的2倍。这会影响到内存的使用。

equals()方法,hashCode()方法

1. equals()方法

`equals()`方法主要用于比较两个对象的内容是否相等。默认情况下,Object类的`equals()`方法是比较两个对象的引用是否相等,即两个引用是否指向内存中的同一个对象实例。但在许多情况下,我们希望比较对象的内容是否相等,这时就需要重写`equals()`方法。

2. hashCode()方法

在Java中,同一个对象多次调用`hashCode()`方法应该返回相同的值。并且,如果两个对象通过`equals()`方法比较相等,那么这两个对象的`hashCode()`方法应该返回相同的值

但是,如果两个对象的`hashCode()`方法返回相同的值,这并不一定意味着这两个对象是相等的,也就是说,hashCode冲突是可能的。

详解    有道云笔记

静态初始化块

解释:

A. 静态初始化块在类加载时执行,并且在创建第一个实例之前自动调用。这保证了在类的静态成员被使用之前,它们已经被初始化。

B. 静态初始化块没有直接的调用语法。它在类加载时自动执行,不需要通过代码来显式地调用。

C. 用户无法直接控制何时执行静态初始化块。它在类加载时执行,并且只会执行一次。

D. 静态初始化块没有访问修饰符和参数。它的语法是用`static`关键字定义的代码块,它没有方法的名称和参数列表,因此没有访问修饰符和参数。

总结:静态初始化块在类加载时自动执行,无需用户调用。它没有访问修饰符和参数,只需使用`static`关键字定义即可。静态初始化块的目的是在类加载时对静态成员进行初始化,保证它们在使用前已经被初始化

1. 静态初始化块是用关键字`static`定义的代码块,它在类被加载时执行,并且只会执行一次。它的作用是对静态成员进行初始化操作,以确保类的静态成员在使用之前已经被初始化。

2. 静态初始化块在类的加载阶段执行,而不是在对象实例化阶段执行。这意味着即使没有创建类的实例,静态初始化块仍然会执行。

3. 静态初始化块的执行顺序是按照代码中定义的顺序进行的,即先定义的静态初始化块先执行。

4. 如果一个类中有多个静态初始化块,它们按照代码中定义的顺序依次执行。
 

public class MyClass {
    static int staticVar;

    static {
        // 静态初始化块,在类加载时执行,对静态成员进行初始化
        staticVar = 10;
        System.out.println("执行静态初始化块");
    }

    public static void main(String[] args) {
        // 不需要实例化类,静态初始化块已经在类加载时执行过
        System.out.println("静态变量值: " + MyClass.staticVar);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值