浅拷贝与深拷贝的区别
基本数据类型:直接存储在栈中数据
引用型数据类型:存储的是该对象在栈中引用,真实数据存放在堆内存中
浅拷贝:只复制某个对象的指针,不复制对象本身,新旧对象还是共存同一块内存(分支)
按位拷贝对象,会创建一个新的对象
深拷贝:会创造一个完全一模一样的对象,新旧对象不共享内存,修改新数据不会影响到旧数据
赋值:其实就是把一个对象在栈中的内存地址赋值给它,无论哪个对象发生改变,其实都是改变的存储空间的内容
sleep和wait区别
sleep:释放cpu给其他线程使用,不释放锁资源,属于Thread类中的方法
wait:释放cpu给其他线程使用,同时释放锁资源,属于Object类中方法,wait() 一直等待需要通过notify或者notifyAll进行唤醒,需要配合synchronized 一起使用
==和equals区别
1.==
如果是基本数据类型,比较的是俩个变量的值
如果是引用数据类型,比较的是地址值(俩个对象是否指向同一个地址)
2.equals
如果没重写equals方法,比较的是俩个对象的地址值
如果重写了equals方法,比较的是对象中属性的值,equals在object类继承的,默认实现方式就是==
final、finally、finalize
final:修饰类/方法/变量,
修饰类后,不能被继承;修饰方法,不能被重写;修饰变量,不能被改变;
finally:通常放在try…catch的后面构造最终执行代码块
finalize:Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作
线程的创建方式
1.继承Thread类创建线程
ThreadClass thread = new ThreadClass();
thread.start();
Thread.sleep(100);
System.out.println("#####################");
2.实现Runnable接口创建线程
RunnableClass runnable = new RunnableClass();
new Thread(runnable).start();
Thread.sleep(100);
System.out.println("#####################");
3.使用Callable和Future创建线程,有返回值
FutureTask futureTask = new FutureTask(new CallableClass());
futureTask.run();
System.out.println("callable返回值:" + futureTask.get());
Thread.sleep(100);
System.out.println("#####################");
4.使用线程池创建线程
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 2,TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
threadPoolExecutor.execute(thread);
threadPoolExecutor.shutdown();
Thread.sleep(100);
System.out.println("#####################");