牛客0718B——Arraylist 和LinkedList static修饰变量和方法

目录

Q1:currentTimeMillis是什么?

[Q2:比较Arraylist 和LinkedList的查找时间](#Q2:比较Arraylist 和LinkedList的查找时间)

3、相关对比Vector和Arraylist

底层扩容的原理:

Q4:static修饰静态代码块

修改1:

修改2:

修改3:

修改1:

修改2:

Q5:super和this

继承中的构造方法


Q1:currentTimeMillis是什么?

java中System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数。

语句:

java 复制代码
 long t1=System.currentTimeMillis();
//执行程序
 long t2=System.currentTimeMillis()-t1;//t2就是程序执行的时间

Q2:比较Arraylist 和LinkedList的查找时间

LinkedList每次增加的时候,会new 一个Node对象来存新增加的元素,所以当数据量小的时候,这个时间并不明显,而ArrayList需要扩容,所以LinkedList的效率就会比较高,但当ArrayList不需要扩容的时候它的效率应该是比LinkedList高的,当数据量很大达到千万级别的时候,new对象的时间大于扩容的时间,那么就会出现ArrayList的效率比Linkedlist高的情况了。

3、相关对比Vector和Arraylist

Arraylist------ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。

ArrayList 类提供了很多有用的方法,添加元素到 ArrayList 可以使用 add() 方法 。 添加并遍历元素如下:

Vector------这也是List接口实现类,它和Arraylist一样,底层使用数组来实现,区别在于Vector是线程同步,效率稍低,ArrayList线程不同步,效率稍高

底层扩容的原理:

ArrayList底层数组如果满了,就扩容:创建一个新数组,长度是原数组的1.5倍,将原数组拷贝到新数组,使用新数组

Vector 底层也是数组,如果满了就就扩容:创建一个新数组,根据指定的扩容量进行创建,如果没有指定扩容量,那么新数组的长度就是旧数组的两倍,将原数组拷贝到新数组,使用新数组

Q4:static修饰静态代码块

java 复制代码
public class Test2 {
    static int x = 10;
    static { x += 5; }
    
public static void main(String[] args) {
        
System.out.println("x =" + Test2 .x);
        
    }
static
{x /= 3; }
}

求输出结果:考察的是代码执行的顺序。 第5、12行属于static修饰的静态代码块。所以A、B说法错误。 静态代码块以及静态变量自上而下的顺序依次随着类加载而执行,所以依据题目的变量初始化: x初始为10 x+5赋值x,结果为15 x/3赋值给x,结果为5

几种修改:

修改1:

java 复制代码
public class Test2 {
    int x = 10;
    static { x += 5; }

    public static void main(String[] args) {
        System.out.println("x =" + Test2 .x);
    }

{x /= 3; }
}

报错:无法执行:

java 复制代码
static { x += 5; }

java: 无法从静态上下文中引用非静态 变量 x

修改2:

java 复制代码
public class Test2 {
    int x = 10;
     { x += 5; }

    public static void main(String[] args) {
        System.out.println("x =" + Test2 .x);
    }

{x /= 3; }
}

报错:

java 复制代码
 public static void main(String[] args) {
        System.out.println("x =" + Test2 .x);
    }

java: 无法从静态上下文中引用非静态 变量 x

修改3:

java 复制代码
public class Test2 {
   static int x = 10;
     { x += 5; }

    public static void main(String[] args) {
        System.out.println("x =" + Test2 .x);
    }

{x /= 3; }
}

结果:10会跳过:没有用static修饰的两个代码块

Q5:还是静态变量修饰的问题

静态方法内要调用方法外的变量,变量必须是静态的,如static方法内不能调用random函数

java 复制代码
public class Arraytest{
    int a[] = new int[6];
    public static void main ( String arg[] ) {
        System.out.println ( a[0] );
    }
}

报错:java: 无法从静态上下文中引用非静态 变量 a

修改1:

java 复制代码
public class Arraytest{
  //  int a[] = new int[6];
    public static void main ( String arg[] ) {
        int a[] = new int[6];
        System.out.println ( a[0] );
    }
}

输出0

修改2:

java 复制代码
public class Arraytest{
  static   int a[] = new int[6];
    public static void main ( String arg[] ) {
       
        System.out.println ( a[0] );
    }
}

输出0

Q5:super和this

在使用super和this关键字时,以下描述错误的是()

A、在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过

B、super()和this()不一定要放在构造方法内第一行

C、this()和super()可以同时出现在一个构造函数中

D、this()和super()可以在static环境中使用,包括static方法和static语句块

答案:BCD

C:

java 复制代码
public Cat(String name, String color) {
        super(name);
        this.color = color;
    }

继承中的构造方法

①在子类对象构造的过程中,必须先构造其父类对象

②在子类的构造方法中,自动调用父类的构造方法,然后才会继续往下执执行构造子类对象

④如果写了super(参数列表),则必须写在子类构造方法 的第一行,否则报错

⑤如果子类中没有写super(参数列表),而父类中又没有无参的构造方法,则编译报错

相关推荐
黄卷青灯771 分钟前
c++ vector类 和 eigen库 处理向量的区别 列出代码举例
开发语言·c++·vector·eigen
闲人编程5 分钟前
Python 实现 LM 算法(Levenberg-Marquardt)
开发语言·python·算法·优化·梯度下降·拟合·lm
cwywsx6 分钟前
C++:二叉搜索树
开发语言·c++·算法
神奇夜光杯15 分钟前
Python酷库之旅-第三方库Pandas(117)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
小丑西瓜66626 分钟前
c++智能指针
开发语言·c++·学习·基础语法·智能指针
码农探知27 分钟前
黑马程序员Java笔记整理(day01)
java
爱是小小的癌33 分钟前
C语言自定义类型-联合与枚举
c语言·开发语言
Flying_Fish_roe36 分钟前
Spring Boot-Swagger相关问题
java·spring boot·后端
hac132239 分钟前
HashMap线程不安全|Hashtable|ConcurrentHashMap
java·开发语言·安全
前端李易安1 小时前
javascript中的数据类型以及存储上的区别
开发语言·javascript·ecmascript