牛客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(参数列表),而父类中又没有无参的构造方法,则编译报错

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目要求:给定一个二叉树和一个整数target,找出所有从根节点到叶子节点路径之和等于target的路径。 解题思路:可以使用深度优先搜索(DFS)的方法来解决该问题。首先定义一个辅助函数来进行递归搜索,该辅助函数的参数包括当前节点、当前路径、当前路径的和以及目标和。在搜索过程中,需要维护一个数组来保存当前节点到根节点的路径。搜索过程如下: 1. 如果当前节点为空,则返回。 2. 将当前节点的值添加到当前路径中。 3. 将当前节点的值累加到当前路径的和中。 4. 如果当前节点是叶子节点,且当前路径的和等于目标和,则将当前路径添加到结果中。 5. 递归地搜索当前节点的左子树和右子树,并传递更新后的当前路径和当前路径的和。 最后,在主函数中调用辅助函数,并返回结果即可。 以下是题目的完整代码实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def pathSum(root, target): def dfs(node, path, path_sum, target, res): if not node: return path.append(node.val) path_sum += node.val if not node.left and not node.right: # 当前节点是叶子节点 if path_sum == target: res.append(path[:]) # 注意需要复制一份path,否则会出现问题 dfs(node.left, path, path_sum, target, res) dfs(node.right, path, path_sum, target, res) path.pop() # 回溯到父节点,去掉当前节点 path_sum -= node.val res = [] dfs(root, [], 0, target, res) return res ``` 这样就能找出所有满足路径和等于目标和的路径了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值