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

目录

Q1:currentTimeMillis是什么?

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时起的毫秒数。

语句:

 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修饰静态代码块

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:

public class Test2 {
    int x = 10;
    static { x += 5; }

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

{x /= 3; }
}

报错:无法执行:

static { x += 5; }

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

修改2:

public class Test2 {
    int x = 10;
     { x += 5; }

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

{x /= 3; }
}

报错:

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

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

修改3:

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函数

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

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

修改1:

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:

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:

public Cat(String name, String color) {
        super(name);
        this.color = color;
    }

继承中的构造方法

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

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

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

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

上一篇:文章八:并发性能优化技巧


下一篇:普中51单片机:LED点阵屏组成结构及实现方法详解(九)