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