最近在备战面试的过程当中,整理一下面试题。大多数题目都是本身手敲的,网上也有不少这样的总结。本身感受老是很乱,因此花了好久把本身以为重要的东西总结了一下。html
面向过程: java
优势:性能比面向对象高,由于类调用时须要实例化,开销比较大,比较消耗资源;好比单片机、嵌入式开发、Linux/Unix等通常采用面向过程开发,性能是最重要的因素。面试
缺点:没有面向对象易维护、易复用、易扩展编程
面向对象: 小程序
优势:易维护、易复用、易扩展,因为面向对象有封装、继承、多态性的特性,能够设计出低耦合的系统,使系统更加灵活、更加易于维护数组
缺点:性能比面向过程低浏览器
1. 简单易学;安全
2. 面向对象(封装,继承,多态);微信
3. 平台无关性(Java虚拟机实现平台无关性);网络
4. 可靠性;
5. 安全性;
6. 支持多线程(C++语言没有内置的多线程机制,所以必须调用操做系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持);
7. 支持网络编程而且很方便(Java语言诞生自己就是为简化网络编程设计的,所以Java语言不只支持网络编程并且很方便);
8. 编译与解释并存;
先看下java中的编译器和解释器:
Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只须要面向虚拟机,生成虚拟机可以理解的代码,而后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫作字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不一样的,可是实现的虚拟机是相同的。Java源程序通过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,而后在特定的机器上运行,这就是上面提到的Java的特色的编译与解释并存的解释。 Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。
采用字节码的好处:
Java语言经过字节码的方式,在必定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特色。因此Java程序运行时比较高效,并且,因为字节码并不专对一种特定的机器,所以,Java程序无须从新编译即可在多种不一样的计算机上运行。
什么是Java虚拟机:
任何一种能够运行Java字节码的软件都可当作是Java的虚拟机(JVM)
一个程序中能够有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不必定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。
JDK: 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其余供开发者使用的工具包。
JRE:普通用户而只须要安装JRE(Java Runtime Environment)来 来运行Java程序。而程序开发者必须安装JDK来编译、调试程序。
Java环境变量PATH和CLASSPATH - 简书 http://www.jianshu.com/p/d63b099cf283
简单说应用程序是从主线程启动(也就是main()方法)。applet小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟flash的小游戏相似。
Java语言采用Unicode编码标准,Unicode(标准码),它为每一个字符制订了一个惟一的数值,所以在任何的语言,平台,程序均可以放心的使用。
在讲继承的时候咱们就知道父类的私有属性和构造方法并不能被继承,因此Constructor也就不能被override,可是能够overload,因此你能够看到一个类中有多个构造函数的状况。
重载:发生在同一个类中,方法名必须相同,参数类型不一样、个数不一样、顺序不一样,方法返回值和访问修饰符能够不一样,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;若是父类方法访问修饰符为private则子类中就不是重写。
可变性
String类中使用字符数组保存字符串,private final char value[],因此string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]value,这两种对象都是可变的。
线程安全性
String中的对象是不可变的,也就能够理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操做,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,因此是线程安全的。StringBuilder并无对方法进行加同步锁,因此是非线程安全的。
性能
每次对String 类型进行改变的时候,都会生成一个新的String对象,而后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象自己进行操做,而不是生成新的对象并改变对象引用。相同状况下使用StirngBuilder 相比使用StringBuffer 仅能得到10%~15% 左右的性能提高,但却要冒多线程不安全的风险。 对于三者使用的总结: 若是要操做少许的数据用 = String 单线程操做字符串缓冲区 下操做大量数据 = StringBuilder 多线程操做字符串缓冲区 下操做大量数据 = StringBuffer
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
Java使用自动装箱和拆箱机制,节省了经常使用数值的内存开销和建立对象的开销,提升了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动做。
因为静态方法能够不经过对象进行调用,所以在静态方法里,不能调用其余非静态变量,也不能够访问非静态变量成员。
Java程序在执行子类的构造方法以前,若是没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。所以,若是父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,由于Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不作事且没有参数的构造方法。
1.接口的方法默认是public,全部方法在接口中不能有实现,抽象类能够有非抽象的方法 2.接口中的实例变量默认是final类型的,而抽象类中则不必定 3.一个类能够实现多个接口,但最多只能实现一个抽象类 4.一个类实现接口的话要实现接口的全部方法,而抽象类不必定 5.接口不能用new实例化,但能够声明,可是必须引用一个实现该接口的对象 从设计层面来讲,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
new运算符,new建立对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用能够指向0个或1个对象(一根绳子能够不系气球,也能够系一个气球);一个对象能够有n个引用指向它(能够用n条绳子系住一个气球)
方法的返回值是指咱们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的做用:接收出结果,使得它能够用于其余的操做!
主要做用是完成对类对象的初始化工做。能够执行。由于一个类即便没有声明构造方法也会有默认的不带参数的构造方法。
1. 名字与类名相同;
2. 没有返回值,但不能用void声明构造函数;
3. 生成类的对象时自动执行,无需调用。
静态方法和实例方法的区别主要体如今两个方面:
对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否相等。
帮助子类作初始化工做。
通俗点讲:==是看看左右是否是一个东西。equals是看看左右是否是长得同样。如何记住嘛。若是单纯是想记住,==:等于。equals:相同。两个长得同样的人,只能说长的相同(equals),可是不等于他们俩是一我的。你只要记住equals,==就不用记了。
术语来说的区别:
1. ==是判断两个变量或实例是否是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是否是相同
2. ==是指对内存地址进行比较 equals()是对字符串的内容进行比较
3. ==指引用是否相同 equals()指的是值是否相同。
我有一个微信公众号,常常会分享一些Java技术相关的干货;
若是你喜欢个人分享,能够用微信搜索“Java团长”或者“javatuanzhang”关注。