java面试题知识点小结

最近准备下海干活了,再在牛客网和其他途径刷一些面试题。将自己碰到的一些问题进行小结,不定时更新,勉励自己温故知新,也希望可以帮助大家。
由于是个人理解,要是略有偏差,欢迎大家指出,不胜感激。

另给大家推荐一片文章,写的非常好,我有些模糊的知识点也是参考这的

//--------------------------------------------------------------


1.访问修饰符权限:public>protected>default>private
其可访问权限:
修饰符 当前类 同 包 子 类 其他包
public
protected ×
default × ×
private × × ×

2. java中的基本数据类型只有8种:byte,short,int,double,float,char,long,boolean.
很明显不包括String,除了基本类型和enum(枚举类型),java中就剩下引用类型了。

3.String是不可改变常量,StringBuffer是可改变的变量,它的对象是可扩充和修改的。
我们定义一个String类型时,先在字符串池中寻找,找到的话直接地址引用。

4.不管是值传递还是引用传递,本质上都是值传递,方法调用的时候,计算出参数的值,拷贝一份给对应的参数。
只是对于对象类型,传递的是对象的引用(即指针或者地址),虽然参数拿到的是拷贝的引用,考这个就可以操作到原对象的数据。
总结一下:(1)对象就是传引用
(2)原始类型就是传值
(3)String,Integer,Double等immutable类型(不可变类)因为没有提供修改自身的函数,每 次操作都是新生成一个对象,不会改变本身

5.byte占用1个字节,short占用2个字节,int占用4个字节,long占用8个字节。
范围转补码可得,如byte为-128~12

6.数据类型自动 转换原则:从低精度向高精度转换byte 、short、int、long、float、double、char
高到低需强制转换

7.还有一个点就是关于装箱/拆箱机制的,我们知道java是一个面向对象的语言,而且面向的还是比较彻底的,但为了方便还是引入了基本类型,为了让基本类型能像类一样操作,就有了与其对应的包装类型,这都是不可变类型。而Integer字面量的值在-128~127之间,就不会new新的对象,直接引用常量池中的,所以Integer a=100,b=100;a==b尽管是对比引用还是会返回true

8.&和&&,|和||,&&是短逻辑与,||是短逻辑或。

9.解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

String str = new String("hello");

上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。

10.Math类中提供了三个与取整有关的方法:ceil,floor,round  这些方法的作用于它们的英文名称的含义相对应
      例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;
                 floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;
                 最难掌握的是round方法:他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,
                        所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.
      Math.round( )符合这样的规律:小数点后大于5正数和负数全部加1,等于5正数加1,小于5正数和负数全不加1。

11.用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

12.在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。
(类似于C++中goto)

13.关于hashcode()与equal()与==
(1)==从物理上判断两个对象是否相等
(2)equal()判断两个对象是否相同
(3)hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。是用来在散列存储结构中确定对象的存储地址的;hashcode的存在主要是用于查找的快捷性;
!如果两个对象相同,equals方法一定返回true,并且这两个对象的HashCode一定相同;如果对象的equals方法被重写,那么hashcode方法也尽量重写,并且产生hashcode使用的对象,一定要和equals方法中使用的一致。
!两个对象的hashcode相同并不一定表示两个对象就相同。(即碰撞)

14.构造器不能被重写,因为他不可被继承,它可以重载。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。

15.String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

16.描述一下JVM加载class文件的原理机制?
答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

        Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
        Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
        System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。




猜你喜欢

转载自blog.csdn.net/qq_35159818/article/details/79732913