您的位置:首页 > 职场人生

Java基础方面面试总结

2017-09-11 08:56 309 查看
JRE和JDK的区别?

Object有哪些公用方法?

finalize()方法

为什么Object类里面会有wait和notify这两个方法

final

String类为什么是final的

关于String.valueOf()和.toString的区别

Override和Overload的含义以及区别

基本类型大小

默认初始化值

数据类型转换

int类型转换成String类型

Java方法的参数到底是值传递还是引用传递?

线程和进程的区别

JRE和JDK的区别?

百度面试的第一个问题,没注意到这么细没回上来。

JRE: Java Runtime Environment 顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK:Java Development Kit 顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

Object有哪些公用方法?

1.方法equals()测试的是两个对象是否相等

2.方法clone()进行对象拷贝

3.方法getClass()返回和当前对象相关的Class对象

4.hashCode() 返回该对象的哈希码值。

5 finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

6. toString() 返回该对象的字符串表示。

7.方法notify(),notifyall(),wait()都是用来对给定对象进行线程同步的

finalize()方法

finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。

GC在销毁对象之前,会调用finalize()方法。完了之后再销毁对象。finalize()可以使该对象重新变成可达状态,从而使它不被回收

public void finalize(){
ft= this;
}


为什么Object类里面会有wait和notify这两个方法

首先:

Object obj = newObject();
synchronized(obj){
    try{  
      obj.wait();
      }catch(Exception e){}
      obj.notify();
  }


注意:wait(),notify(),notifyAll()都必须使用在同步中,要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。调用wait方法时会释放掉锁

为什么这些操作线程的方法要定义在object类中呢?

简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。

专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。

final

当用在参数上时,表示的该参数对应的应用时不可变更(同时意味着,如果该引用为一个对象,该对象中的值时可以修改的)

当用在方法上时,表示该方法不可被重写

当用在类上时,表示该类不能被继承

String类为什么是final的

String很多实用的特性,比如说“不可变性”,final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。

换言之,如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。

假如String没有声明为final, 那么你的StringChilld就有可能是被复写为“可变的”的,这样就打破了成为共识的基本约定。 要知道,String是几乎每个类都会使用的类,特别是作为Hashmap之类的集合的key值时候,mutable的String有非常大的风险。而且一旦发生,非常难发现。

关于String.valueOf()和.toString的区别

俩个方法都是将对象转换成字符串,两者有何区别呢?

看看valueOf()方法的源码,可知

valueOf()方法做了是否为null的判断,如过是null就返回null,不是就返回toString()后的字符串。

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}


valueOf()做了非空判断,所以就不会报出空指针异常。

Override和Overload的含义以及区别

a.Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。

b.就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

基本类型大小



默认初始化值

类变量,实例变量,数组 都有有默认初始化值 。

而局部变量没有初始化值。

byte 、short、 int 和long类型的 初始化值为 0;

float、double类型的的初始化值为0.0;

char类型的 初始化值为‘\u0000’;

boolean类型的初始化值为false;

应用类型的初始化值为null;

数据类型转换

自动数据类型转换

自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:

低 ———————————————> 高

byte,short,char-> int -> long -> float -> double

强制数据类型转换

大转小需要强转,强制转换的格式是在需要转型的数据前加上 “( )” ,然后在括号内加入需要转化的数据类型。有的数据经过转型运算后,精度会丢失,而有的会更加精确。

public class Test{
public static void main(String[] args){
int a=123123123;
byte b ;
b =(byte)a;
System.out.println(b);   //输出-77
}
}


int类型转换成String类型

方法1

int i=0;
String s=""+i;


这是利用java的toString机制来做的转换,任何类型在和String相加的时候,都会先转换成String

方法2

int i=0;
String s=String.valueOf(i);


这是利用String类提供的方法来做的转换。同样的情况也适用于float, double, byte等类型向String转换的情况。

方法3

Integer a = new Integer(1);
String s = Integer.toString(a);


Java方法的参数到底是值传递还是引用传递?

java中方法参数传递方式是按值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而自己本身不会受到任何影响。

如果参数是基本类型,传递的是基本类型的字面量值的拷贝。

如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

参数传递基本上就是赋值操作(=)。

详细可见:画重点,Java方法的参数到底是值传递还是引用传递?

线程和进程的区别

开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息