面试题(二)—Java基础(下)

一、进程和线程

进程

(1)正在运行的程序,是系统进行资源分配和调用的独立单位。

(2)每一个进程都有它自己的内存空间和系统资源。

线程

(1)是进程中的一条执行路径。

(2)一个进程如果只有一条执行路径,则称为单线程程序。

(3)一个进程如果有多条执行路径,则称为多线程程序。

二、线程的两种调度模型

分时调度模型

   所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片。

抢占式调度模型

   优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些。

三、实现多线程的两种方式

1.继承Thread类

A: 自定义类MyThread继承Thread类。

B: 在MyThread类中重写run()方法。

C: 创建MyThread类的对象。

D: 启动线程对象。

public class MyThread extends Thread {

	@Override
	public void run() {
		
		for (int x = 0; x < 200; x++) {
			System.out.println(x);
		}
	}

}
public class MyThreadDemo {
	public static void main(String[] args) {
		
		// 创建两个线程对象
		MyThread m1 = new MyThread();
		MyThread m2 = new MyThread();
		
		// 启动线程
		m1.start();
		m2.start();
	}
}

2.实现Runnable接口

A: 自定义类Myrunnable实现Runnable接口。

B: 在MyRunnable里面重写run()方法。

C: 创建MyRunnable类的对象。

D:创建Thread类的对象并把C步骤的对象作为参数传递。

public class MyRunnable implements Runnable {

	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}

}
public class MyRunnableDemo {
	public static void main(String[] args) {
		// 创建MyRunnable类的对象
		MyRunnable m = new MyRunnable();

		// 创建Thread类的对象,并把Runnable对象作为构造参数传递
		Thread t1 = new Thread(my, "AAA");
		Thread t2 = new Thread(my, "BBB");

		t1.start();
		t2.start();
	}
}

问题1: run()与start()方法的区别

run()方法直接调用仅仅是普通方法。 

start()方法先启动线程,然后再由JVM调用run()方法。

问题2:实现Runnable接口的优点

A:可以避免Java单继承的局限性。

B:适合相同程序程序处理同一资源的情况。

四、线程的生命周期

image

五、sleep()和wait()区别

(1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。

(2)sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际

上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。而wait()是Object类的非静态方法。

(3)sleep()释放资源不释放锁,而wait()释放资源释放锁;

(4)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

六、throw和throws区别

throw
        (1)在方法体中,后面跟的是异常对象名,并且只能是一个。
        (2)throw抛出的是一个异常对象,说明这里肯定有一个异常产生了。

throws
         (1)在方法声明上,后面跟的是异常的类名,可以是多个。
         (2)throws是声明方法有异常,是一种可能性,这个异常并不一定会产生。

七、三种获取Class对象的方式

A: getClass()方法

    Person p = new Person();

    Class clzz = p.getClass();

B: 类名.class

    Class clazz = Person.class;

C: Class.forName("");

    Class clazz = Class.forName("Person");

八、二分查找

(1)算法概念。

二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法请注意这种算法是建立在有序数组基础上的。

(2)算法思想。

①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;

②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

③如果在某一步骤数组为空,则代表找不到。

	public static int binarySearch(int[] arr,int key){
		int low = 0;
		int high = arr.length - 1;
		
		while(low <= high){
			
			//防止溢出,移位也更高效,同时每次循环都要更新
			int middle = low + ((high - low)>>1);
		
			if(key == arr[middle]){
				return middle;
			}
			else if(key > arr[middle]){
				low = middle + 1;
			}
			else{
				high = middle -1;
			}
		}
		return -1;
	}
原文地址:https://www.cnblogs.com/yangang2013/p/5707709.html