Java基础(四) 面试题整理
目录
算法题:100个数,存在重复数据,求出现次数最多的数,如果数据量很大的情况下,时间复杂度
final和static的区别,static串数据问题
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)
1. 修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值
这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象
2. 修饰方法,被final修饰的方法代表不能重写
3. 修饰类,被final修饰的类,不能够被继承
static可以修饰成员变量、成员方法、代码块、内部类
1. 被static修饰的变量被是静态变量,静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
static成员变量的初始化顺序按照定义的顺序进行初始化。
2. 被static修饰的方法是静态方法,静态方法不依赖于任何对象就可以进行访问,对于静态方法来说,是没有this的,因为它不依附于任何对象。由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法。
3. 用static代码块以优化程序性能,可以置于类中的任何地方,类中可以有多个static块。在类被初次加载时,会按照static块的顺序来执行每一个static块,并且只会执行一次。
4. 在定义内部类的时候,可以在其前面加上一个权限修饰符static,此时这个内部类就变成了静态内部类。静态内部类不需要有指向外部类的引用,并且只能访问外部类的静态和非静态成员。
静态变量:线程非安全和串数据问题
案例(一)
/**
* 测试静态变量的线程安全性
* @author 75736
*
*/
public class Demo_1 implements Runnable{
public static int num = 50;
@Override
public void run() {
while(num>0) {
System.out.println(Thread.currentThread().getName() + "抢到了第" + num-- + "张票");
}
}
public static void main(String[] args) {
Demo_1 demo_1 = new Demo_1();
Thread thread_1 = new Thread(demo_1);
Thread thread_2 = new Thread(demo_1);
Thread thread_3 = new Thread(demo_1);
thread_1.start();
thread_2.start();
thread_3.start();
}
}
案例(二)
/**
* static串数据问题
* @author 75736
*
*/
public class Demo_2 implements Runnable{
private static int a = 0;
private static int b = 0;
private static int c = 0;
@Override
public void run() {
while(true) {
System.out.println("a="+ a++ + ",b=" + b++ + ",c=" + c++);
}
}
public static void main(String[] args) {
Demo_2 demo_2 = new Demo_2();
Thread thread_1 = new Thread(demo_2);
Thread thread_2 = new Thread(demo_2);
Thread thread_3 = new Thread(demo_2);
thread_1.start();
thread_2.start();
thread_3.start();
}
}
算法题:100个数,存在重复数据,求出现次数最多的数,如果数据量很大的情况下,时间复杂度