Java基础(四) 面试题整理

目录

 

final和static的区别,static串数据问题

算法题: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();
	}
}

Java基础(四) 面试题整理

案例(二)

/**
 * 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();
	}
}

Java基础(四) 面试题整理

 

算法题:100个数,存在重复数据,求出现次数最多的数,如果数据量很大的情况下,时间复杂度