文章目录
- 零、java八股文指什么
- 一、java基础
- 1.1 java简介
- 1.2 java语言有哪些特点
- 1.3 关于JVM,JDK,JRE的解答
- 1.4 java和C++的区别
- 1.5 面向对象
- 1.6 java中类、方法、对象的关系
- 1.7 java基本数据类型
- 1.8 final,finally,finalize的区别
- 1.9 int和integer的区别
- 1.10 重载和重写的区别
- 1.11 抽象类和接口有什么区别
- 1.12 ==和equals的区别
- 1.23 两个对象的hashCode()相同,则equals()也一定为true,对么?
- 1.24 String属于基础数据类型么
- 1.25 java中操作字符串有哪些类型?他们之间有什么区别?
- 1.26 `String str = 'i'`与String str = new String("i")一样吗?
- 容器
零、java八股文指什么
java八股文,是指(1)Java 基础知识,(2)java几何框架,(3)java多线程,(4)java虚拟机,(5)MySql,(6)Spring相关,(7)计算机网络;(8)MQ消息队列,(9)Redis,(10)Ngnix 等一系列相关知识。很多很杂。
一、java基础
1.1 java简介
java是什么:
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
java的创立者:
任职于Sun公司(Stanford University Network斯坦福网络公司)的詹姆斯·高斯林和麦克·舍林丹等人于1990年代初开发Java语言的雏形,最初被命名为Oak,Oak的目标是作为家用电器等小型系统的编程语言,用于电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展,Sun公司发现Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。伴随着互联网的迅猛发展,Java逐渐成为重要的网络编程语言。
java的三大版本:
Java SE(J2SE,Java 2 Platform Standard Edition,标准版)
Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为Java EE和Java ME提供基础。
Java EE(J2EE,Java 2 Platform Enterprise Edition,企业版)
Java EE 以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web2.0应用程序。2018年2月,Eclipse 宣布正式将 JavaEE 更名为 JakartaEE
Java ME(J2ME,Java 2 Platform Micro Edition,微型版)
Java ME 以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。
语言特点与应用场景
Java语言具有简单性、面向对象、分布式、健壮性、安全性、跨平台性、可移植性、多线程与动态性等特点。Java语言可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统等 。Java 快速、安全、可靠。从笔记本电脑到数据中心,从游戏控制台到超级计算机,从手机到互联网,Java 无处不在。
1.2 java语言有哪些特点
(1)简单易学;
(2)面向对象(封装,继承,多态);
(3)平台无关性( Java 虚拟机实现平台无关性);
(4)可靠性;
(5)安全性;
(6)支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
(7)支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
编译与解释并存;
1.3 关于JVM,JDK,JRE的解答
JRE和JDK的区别
JDK(java development kit):JDK是java开发工具包,基本上每个学java的人都会先在机器上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包含JVM。bin:最主要的是编译器(javac.exe)include:java和JVM交互用的头文件lib:类库jre:java运行环境(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的)
JRE(java runtime environment):java运行环境JRE相当于JVM+lib(lib里面有JVM运行需要的类库)。光有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写程序了。(jre里有运行.class的java.exe)
JVM(java virtual machine):java虚拟机。它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java
语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java
程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
1.4 java和C++的区别
- 都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
1.5 面向对象
(0)面向对象和面向过程。
面向过程的开发方法也称结构化开发方法,基本思想是软件功能的分解和抽象。把系统功能进一步分解为若干子模块,自顶向下地对系统进行分析和设计,逐步求精。
面向对象的开发方法是一种把面向对象的思想应用于软件开发过程中,代码和数据被合并成一个不可拆分的单元,也就是一个对象。
面向对象技术包括面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三部分。面向对象方法有几个需要遵循的基本原则:即抽象、封装、继承和多态。
(1)封装
封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。其目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
在java中,有3种修饰符:public,private,protected,每一种修饰符给其他的位于同一个包或者不同包下面赋予了不同的访问权限。
封装的优点
- 通过隐藏对象的属性来保护对象内部的状态。
- 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
- 禁止对象之间的不良交互提高模块化
(2)继承
子类继承父类,增强系统的可重用,减少重复。
(3)多态
同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。
多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次。
(4)抽象
抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。 Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
1.6 java中类、方法、对象的关系
类:一类事务的抽象,猫这类动物
对象:类产生的功能相似的实体,某一只猫
方法:对象的某一功能属性,猫会爬树
类:
1.7 java基本数据类型
整型:byte(8),short(16),int(32),long(64)
浮点型:float(32),double(64)
布尔型:boolean(8)
字符型:char(16)
1.8 final,finally,finalize的区别
(1)final
修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写。
(2)finally
在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch 子句就会执行,然后控制就会进入 finally 块(如果有的)。
(3)finalize
方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
1.9 int和integer的区别
int 是基本数据类型
Integer是其包装类,注意是一个类。
这里是引用为什么要提供包装类呢???
一是为了在各种类型间转化,通过各种方法的调用。否则你无法直接通过变量转化。
比如,现在int要转为String
int a=0;
String result=Integer.toString(a);
1.10 重载和重写的区别
重载和重写的区别
重载(overload):发生在一个类中。
- 参数类型、个数、顺序至少有一个不相同。
- 不能重载只有返回值不同的方法名。
- 存在于父类和子类、同类中。
重写(overwrite):针对继承的。子类对分类的方法进行重新编写,外壳不变,核心重写。 - 方法名、参数、返回值相同。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
- 存在于父类和子类之间。
- 方法被定义为final不能被重写。
1.11 抽象类和接口有什么区别
接口:接口是公开的,里面不能有私有方法或变量,是用于让别人使用的。而抽象类是可以私有方法或私有变量的。
另外,实现接口的一定要实现接口里定义的所有方法,二实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后耨是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享里面的变量全是常量)的作用。
1.12 ==和equals的区别
(1)对象类型不同
equals()
:是超类Object中的方法。
==
: 是操作符
(2)比较的对象不同
equals()
:用来监测两个对象是否相等,即两个对象的内容是否相等。
==
:用于比较引用和比较基本数据类型时具有不同的功能。
基础数据类型如int,引用数据类型如字符串等。
(3)运行速度不同
==
运行速度比equals()
快,因为==
只是引用。
1.23 两个对象的hashCode()相同,则equals()也一定为true,对么?
不对,两个对象的 hashCode()相同,equals()不一定 true。
hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象
1.24 String属于基础数据类型么
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
1.25 java中操作字符串有哪些类型?他们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
1.26 String str = 'i'
与String str = new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str= “i” 的方式,java虚拟机会将其分配到常量池中;而String str = new String(“i”)则会被分配到堆内存中。