2017秋招面试整理(4)

本文深入讲解了Java中的关键概念和技术,包括内存管理、运算优化、循环控制、对象平等性判断、static关键字用法、字符串类型差异、JVM加载机制、抽象类与接口的区别以及内存泄露等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10月4日 中秋节
一:内存中堆,栈,方法区的用法
栈空间:变量,对象的引用,函数调用的现场保护。
堆空间:new关键字和构造器创建的对象。是垃圾回收管理的主要区域。
方法区:和堆空间都是各个线程共享的内存系统,用于存储已经被JVM加载的类信息,常量,静态变量;程序中的字面量如直接书写的100,“hello”和常量都是都是放在常量池中,常量池是方法区的一部分
栈用完会发生StackOverFlowError,堆和常量池空间不足会发生OutOfMemoryError。
二:用最有效率的方法计算2乘以8
2<<3(左移三位是乘以2的3次方,右移三位是除以2的3次方)
如何跳出当前的多重嵌套循环:
在最外层循环加一个标记如A,然后用break A;可以跳出多重循环。
三:Hash code 和equals的理解
(1)如果说俩个对象相同(equals方法返回true),那么,它们的hashCode值一定要相同。
(2)如果俩个对象的HashCode相同,他们俩个对象不一定相同。
对于equals方法,必须满足自反性(x.equals(x)必须返回true),对称性,传递性,一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到相同的返回值,对于任何非Null值的引用x.equals(null)必须返回false)
编写完equals方法总是要编写hashcode????
四:static关键字的特征及注意事项?
特征:
A:随着类的加载而加载
B:优先于对象存在
C:被类的所有对象共享
D:可以通过类名调用
静态变量:类变量
非静态变量:实例变量,对象变量
非静态的:创建对象访问
静态的:可以通过类名,也可以通过对象访问。
static关键字注意事项:
A:在静态方法中是没有this关键字的
原因:静态的内容随着类的加载而加载,this是随着对象的创建而存在,所以,static中不能有this。
B:静态方法只能访问静态的成员变量和静态的成员方法,静态方法只能访问静态的成员。
五:String和StringBuffer和StringBuilder的区别
(注意:再讲区别时先说共性,再说个性)
Java平台提供了俩种类型的字符串:String和StringBuffer|StringBuilder,它们都可以存储和操作字符串。
其中String是只读字符串,这就意味着String引用的字符串内容是不能改变的。而StringBuffer和StringBuilder类表示的字符串对象可以可以直接进行修改。而它们二者的区别是StringBuilder是在单线程下使用的,线程安全,效率低。而StringBuffer是线程不安全,但是效率高。

      String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        System.out.println(s3 == s1 + s2); //false
        System.out.println(s3.equals(s1 + s2)); //true

        System.out.println(s3 == "hello" + "world"); //true
        System.out.println(s3.equals("hello" + "world")); //true
    结论:
    看程序写结果
    变量相加,先开空间,在加。
    常量相加,先加,找是否有这样的数据空间,如果没有才开空间。
       String s1="programming";
        String s2=new String("programming");
        String s3="program";
        String s4="ming";
        String s5="program"+"ming";
        String s6=s3+s4;
System.out.println(s1==s2);//false       System.out.println(s1==s5);//true
       System.out.println(s1==s6);//false
        System.out.println(s1==s6.intern());//true
      System.out.println(s2==s2.intern());//false

原因:(1)String对象的intern方法会得到字符串对象在常量池中字符串的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用,如果常量池中有一个字符串与String对象的equals结果为true。(同上面的理论)
(2)字符串的+操作其实是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理为String对象。(因为New?)
六:JVM加载class文件的原理
类的加载是指把类的.Class文件中的数据读到内存中通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的.class对象。加载完成后,class对象还不完整。所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证,准备和解析三个步骤,最后jvm对类进行初始化,包括:(1)如果类存在直接的父类,并且这个类还没有被初始化,那么就先初始化父类(2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是有类加载器实现的,类加载器包括:根加载器(BootStrap,负责Jvm核心类库),扩展类加载器(ExtenSion,系统属性所指定目录加载类库),系统类加载器(System)和用户自定义加载器,其中使用了父亲委托机制(PDM),意思就是加载类时,首先请求父类加载器加载,父类加载器无能为力时才由子类加载器自行加载。
七:抽象类和接口的异同
抽象类和接口都不能被实例化,但都可以由具体的子类实例化,这也是多态的一种,被称为抽象类多态和接口多态,而多态的前提就是 (1):有继承或者实现关系(2):有方法重写(3):有父类引用或者父接口引用指向子类或者实现类对象
A:成员区别
抽象类:
成员变量:可以是变量,也可以是常量
构造方法:有构造方法
成员方法:可以是抽象方法,也可以是非抽象方法
有抽象方法的类一定是抽象类,而抽象类不一定有抽象方法。
接口:
成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象方法。默认修饰符 public abstract
B:关系区别
类与类:
继承关系。只能单继承,可以多层(重)继承。
类与接口:
实现关系。可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系。可以单继承,也可以多继承。
C:设计理念区别
抽象类被继承体现的是:”is a”的关系。抽象类定义的是共性功能。
接口被实现体现的是:”like a”的关系。接口定义的是扩展功能。
10月5日
10月6日
八:Java中存在内存泄露吗?请简单阐述
理论上来说Java有垃圾回收机制,不会存在内存泄露问题;然而在实际开发中可能会存在无用但可达的对象,这些对象不能被GC回收,所以会导致内存泄漏的发生。例如hibernate的session(一级缓存)中的对象处于持久态,垃圾回收器是不回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭或者清空,就会导致内存泄漏。
常见的HTTP状态码?
200:ok;一切正常,对Get和Post请求的应答文档跟在后面。
301:Moved Permanently;客户请求的文档在其他地方,新的URL在location头中给出,浏览器应自动的访问新的URL。
302:Found;类似于301,但是新的URL应该被视为临时的替代,而不是永久性的。
304:Not Modified服务器告诉客户,原来缓冲的文档还可以继续使用。
400:Bad Reauest;请求出现语法错误。
401:
403:Forbidden;资源不可用
404:Not Found;无法找到指定位置的资源
500:SeverError;服务器遇到了意料不到的情况,不能完成客户的请求。
501:Not implemented;客户端发出了一个服务器不支持的PUT请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值