JAVA开发基础知识
⼀、面向对象概念
- 面向对象和面向过程的区别?
面向过程 :面向过程性能比面向对象⾼。 因为类调用时需要实例
化,开销比较⼤,比较消耗资源,所以当性能是最重要的考量因素的时
候,比如单片机、嵌⼊式开发、Linux/Unix等⼀般采用面向过程开发。但
是,面向过程没有面向对象易维护、易复用、易扩展。
面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封
装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵
活、更加易于维护。但是,面向对象性能比面向过程低。
参考问题 :面向过程性能⼀定比面向对象⾼?
不⼀定,面向过程也需要分配内存,计算内存偏移量,Java性能差的
主要原因并不是因为它是面向对象语⾔,⽽是Java是半编译语⾔,最终的
执⾏代码并不是可以直接被CPU执⾏的⼆进制机器码。
⽽面向过程语⾔⼤多都是直接编译成机械码在电脑上执⾏,并且其它
⼀些面向过程的脚本语⾔性能也并不⼀定比Java好。 - 对象和类的关系?举例说明
类是对象的模版,对象是类的实例。
举例:猫是⼀个类,你养的那只猫是⼀个对象;汽车是⼀个类,你开
的那辆车是⼀个对象。 - 类里面包含什么?
属性和⽅法。
4.
类的特性?
封装性
将数据和操作封装为⼀个有机的整体,由于类中私有成员都是隐藏
的,只向外部提供有限的接⼝,所以能够保证内部的⾼内聚性和与外部的
低耦合性。用者不必了解具体的实现细节,⽽只是要通过外部接⼝,以特
定的访问权限来使用类的成员,能够增强安全性和简化编程。
继承性
继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复
代码。
多态性
同⼀操作作用于不同对象,可以有不同的解释,产⽣不同的执⾏结
果。在运⾏时,可以通过指向基类的指针,来调用实现派⽣类中的⽅法。
⼆、⽹络基础
5. DNS是什么?
域名系统(英⽂:Domain Name System,缩写:DNS)是互联⽹的
⼀项服务。它作为将域名和IP地址相互映射的⼀个分布式数据库,能够使
⼈更⽅便地访问互联⽹。
- 域名和端⼝?
域名(英语:Domain Name),又称⽹域,是由⼀串用点分隔的名字
组成的Internet上某⼀台计算机或计算机组的名称,用于在数据传输时对
计算机的定位标识(有时也指地理位置)。
由于IP地址具有不⽅便记忆并且不能显示地址组织的名称和性质等缺
点,⼈们设计出了域名,并通过⽹域名称系统(DNS,Domain Name
System)来将域名和IP地址相互映射,使⼈更⽅便地访问互联⽹,⽽不用
去记住能够被机器直接读取的IP地址数串。
“端⼝”是英⽂port的意译,可以认为是设备与外界通讯交流的出⼝。
端⼝可分为虚拟端⼝和物理端⼝,其中虚拟端⼝指计算机内部或交换机路
由器内的端⼝,不可见。例如计算机中的80端⼝、21端⼝、23端⼝等。物
理端⼝又称为接⼝,是可见端⼝,计算机背板的RJ45⽹⼝,交换机路由器
集线器等RJ45端⼝。电话使用RJ11插⼝也属于物理端⼝的范畴。 - CDN是什么?
CDN的全称是Content Delivery Network,即内容分发⽹络。CDN是
构建在现有⽹络基础之上的智能虚拟⽹络,依靠部署在各地的边缘服务
器,通过中⼼平台的负载均衡、内容分发、调度等功能模块,使用户就近
获取所需内容,降低⽹络拥塞,提⾼用户访问响应速度和命中率。CDN的
关键技术主要有内容存储和分发技术。 - 外⽹IP和内⽹IP区别?内⽹IP⽹段?
外⽹IP就是互联⽹的IP,内⽹IP就是内部⽹的IP。
内⽹IP⽹段如下:
10.0.0.0/8———————10.0.0.0~10.255.255.255(A类)
172.16.0.0/12————-172.16.0.0~172.31.255.255(B类)
192.168.0.0/16 ———192.168.0.0~192.168.255.255(C类) - VPN是什么?
虚拟专用⽹络(VPN)的功能是:在公用⽹络上建立专用⽹络,进⾏加
密通讯。在企业⽹络中有⼴泛应用。VPN⽹关通过对数据包的加密和数据
包目标地址的转换实现远程访问。VPN可通过服务器、硬件、软件等多种
⽅式实现。 - Https和Http区别?默认端⼝号?
HTTP和HTTPS的基本概念
HTTP:是互联⽹上应用最为⼴泛的⼀种⽹络协议,是⼀个客户端和
服务器端请求和应答的标准(TCP),用于从WWW服务器传输超⽂本到
本地浏览器的传输协议,它可以使浏览器更加⾼效,使⽹络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,
即HTTP下加⼊SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就
需要SSL。
HTTPS协议的主要作用可以分为两种:
⼀种是建立⼀个信息安全通道,来保证数据传输的安全;
另⼀种就是确认⽹站的真实性。
HTTP与HTTPS有什么区别?
HTTP协议传输的数据都是未加密的,也就是明⽂的,因此使用
HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传
输,于是⽹景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协
议传输的数据进⾏加密,从⽽就诞⽣了HTTPS。简单来说,HTTPS协议是
由SSL+HTTP协议构建的可进⾏加密传输、身份认证的⽹络协议,要比
http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,⼀般免费证书较少,因⽽需要⼀定
费用。
2、http是超⽂本传输协议,信息是明⽂传输,https则是具有安全性
的ssl加密传输协议。
3、http和https使用的是完全不同的连接⽅式,用的端⼝也不⼀样,
前者是80,后者是443。
4、http的连接很简单,是⽆状态的;HTTPS协议是由SSL+HTTP协
议构建的可进⾏加密传输、身份认证的⽹络协议,比http协议安全。
- get 和 post 请求有哪些区别?
GET在浏览器回退时是⽆害的,⽽POST会再次提交请求。
GET产⽣的URL地址可以被Bookmark,⽽POST不可以。
GET请求会被浏览器主动cache,⽽POST不会,除非⼿动设置。
GET请求只能进⾏url编码,⽽POST支持多种编码⽅式。
GET请求参数会被完整保留在浏览器历史记录里,⽽POST中的参数
不会被保留。
GET请求在URL中传送的参数是有长度限制的,⽽POST么有。
对参数的数据类型,GET只接受ASCII字符,⽽POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来
传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
三、计算机原理和操作系统
12. 内存、CPU、硬盘?
内存是计算机的重要部件之⼀。
它是外存与CPU进⾏沟通的桥梁,计算机中所有程序的运⾏都在内存
中进⾏。
内存性能的强弱影响计算机整体发挥的⽔平。
内存(Memory)也称内存储器和主存储器,它用于暂时存放CPU中的运
算数据,与硬盘等外部存储器交换的数据。
只要计算机开始运⾏,操作系统就会把需要运算的数据从内存调到
CPU中进⾏运算。当运算完成,CPU将结果传送出来。
内存的运⾏也决定计算机整体运⾏快慢的程度。
内存条由内存芯片、电路板、⾦⼿指等部分组成。
电脑硬盘是计算机最主要的存储设备。硬盘(港台称之为硬碟,英⽂
名:Hard Disk Drive, 简称HDD 全名温彻斯特式硬盘)由⼀个或者多个
铝制或者玻璃制的碟片组成。这些碟片外覆盖有铁磁性材料。
绝⼤多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。
早期的硬盘存储媒介是可替换的,不过今日典型的硬盘是固定的存储媒
介,被封在硬盘里 (除了⼀个过滤孔,用来平衡空⽓压⼒)。随着发
展,可移动硬盘也出现了,⽽且越来越普及,种类也越来越多.⼤多数微
机上安装的硬盘,由于都采用温切斯特(winchester)技术⽽被称之为“温切
斯特硬盘”,或简称“温盘”。
中央处理器(CPU),是电⼦计算机的主要设备之⼀,电脑中的核⼼
配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU
是计算机中负责读取指令,对指令译码并执⾏指令的核⼼部件。中央处理
器主要包括两个部分,即控制器、运算器,其中还包括⾼速缓冲存储器及
实现它们之间联系的数据、控制的总线。电⼦计算机三⼤核⼼部件就是
CPU、内部存储器、输⼊/输出设备。中央处理器的功效主要为处理指
令、执⾏操作、控制时间、处理数据。
13. Linux基本命令?
10个Linux基本命令。
1.sudo
这个SuperUserDo是Linux新⼿要使用的最重要的命令。需要根权限的
每⼀个命令都需要这个sudo命令。你可以在需要根权限的每个命令之前使
用sudo。
$ sudo su
2.ls(list)
借助list命令,终端就会显示你正在处理的那个目录里面的所有⽂件
和⽂件夹。假设我在/home⽂件夹里面,想查看/home里面的目录和⽂
件。
/home$ ls
/home中的ls返回下列结果:
imad lost+found
3.cd
更改目录(cd)是始终在终端中使用的主要命令。它是最基本的Linux命
令之⼀。使用这个命令很简单。只要输⼊你想要从当前目录进⼊到的那个
⽂件夹的名称。如果想要返回上⼀级,只要将双圆点(..)作为参数。
假设我在/home目录中,想进⼊到始终在/home里面的usr目录。下面
是我可以使用cd命令的⽅法:
/home $ cd usr
/home/usr mkdir folderName
5.cp
拷贝粘贴是我们为了组织整理⽂件⽽需要完成的重要任务。使用cp将
帮助你从终端拷贝粘贴⽂件。首先,你确定想要拷贝的那个⽂件,然后输
⼊目的地位置,即可粘贴⽂件。
$ cp src des
注意:如果你将⽂件拷贝到任何新⽂件都需要根权限的目录,那么你
就需要使用sudo命令。
6.rm
rm这个命令可以移除你的⽂件,甚⾄移除你的目录。如果⽂件需要根
权限才能移除,可以使用-f。你还可以使用-r来进⾏递归移除,从⽽移除
你的⽂件夹。
$ rm myfile.txt
7.apt-get
就不同的发⾏版⽽⾔,这个命令各不相同。在基于Debian的Linux发
⾏版中,想安装、移除和升级任何软件包,我们可以使用⾼级包装⼯具
(APT)软件包管理器。apt-get命令可帮助你安装需要在Linux中运⾏的软
件。这是个功能强⼤的命令⾏⼯具,可以执⾏安装、升级、甚⾄移除软件
这类任务。
在其他发⾏版(比如Fedora和Centos)中,有不同的软件包管理器。
Fedora过去有yum,但现在它有dnf。
$ sudo apt-get update
grep user /etc/passwd
9.cat
作为用户,你常常需要查看来自脚本的⼀些⽂档或代码。同样,其中
⼀个Linux基本命令是cat命令。它会为你显示⽂件里面的⽂本。
$ cat CMakeLists.txt
10.poweroff
有时候,你需要直接从终端来关机。这个命令就能完成这项任务。别
忘了在命令的开头添加sudo,因为它需要根权限才能执⾏poweroff。
$ sudo poweroff
14. 线程和进程的区别?
进程和线程的根本区别是进程是操作系统资源分配的基本单位,⽽线
程是处理器任务调度和执⾏的基本单位。另外区别还有资源开销、包含关
系、内存分配、影响关系、执⾏过程等。
资源开销:每个进程都有独立的代码和数据空间(程序上下⽂),程
序之间的切换会有较⼤的开销;线程可以看做轻量级的进程,同⼀类线程
共享代码和数据空间,每个线程都有自⼰独立的运⾏栈和程序计数器
(PC),线程之间切换的开销小。
包含关系:如果⼀个进程内有多个线程,则执⾏过程不是⼀条线的,
⽽是多条线(线程)共同完成的;线程是进程的⼀部分,所以线程也被称
为轻权进程或者轻量级进程。
内存分配:同⼀进程的线程共享本进程的地址空间和资源,⽽进程之
间的地址空间和资源是相互独立的。
影响关系:⼀个进程崩溃后,在保护模式下不会对其他进程产⽣影
响,但是⼀个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执⾏过程:每个独立的进程有程序运⾏的⼊⼝、顺序执⾏序列和程序
出⼝。但是线程不能独立执⾏,必须依存在应用程序中,由应用程序提供
多个线程执⾏控制,两者均可并发执⾏。
进程和线程的根本区别是进程是操作系统资源分配的基本单位,⽽线
程是处理器任务调度和执⾏的基本单位。
四、数据库基础
15. 关系型数据库和非关系型数据库有哪些区别?举例说
明
关系型数据库,是指采用了关系模型来组织数据的数据库,其以⾏和
列的形式存储数据,以便于用户理解,关系型数据库这⼀系列的⾏和列被
称为表,⼀组表组成了数据库。用户通过查询来检索数据库中的数据,⽽
查询是⼀个用于限定数据库中某些区域的执⾏代码。关系模型可以简单理
解为⼆维表格模型,⽽⼀个关系型数据库就是由⼆维表及其之间的关系组
成的⼀个数据组织。例如:mysql、oracle、sql server
NoSQL,泛指非关系型的数据库。随着互联⽹web2.0⽹站的兴起,传
统的关系数据库在处理web2.0⽹站,特别是超⼤规模和⾼并发的SNS类型
的web2.0纯动态⽹站已经显得⼒不从⼼,出现了很多难以克服的问题,⽽
非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数
抖音/公众号:老猿说开发
15JAVA开发基础知识
V5.3
据库的产⽣就是为了解决⼤规模数据集合多重数据种类带来的挑战,尤其
是⼤数据应用难题。例如:redis
16. 数据库索引是做什么用的?
在关系数据库中,索引是⼀种单独的、物理的对数据库表中⼀列或多
列的值进⾏排序的⼀种存储结构,它是某个表中⼀列或若⼲列值的集合和
相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相
当于图书的目录,可以根据目录中的页码快速找到所需的内容。
17. 什么情况需要给字段建立索引?
表的主键、外键必须有索引;
数据量超过300的表应该有索引;
经常与其他表进连接的表,在连接字段上应该建索引;
经常出现在Where句 order by中的字段,特别是表的字段,应该建索
引;
索引应该建在选择性的字段上;
索引应该建在字段上,对于的本字段甚超字段,不要建索引;
18. 什么情况下索引会失效?
1.单独引用复合索引里非第⼀位置的索引列
假如有INDEX(a,b,c),
当条件为a或a,b或a,b,c时都可以使用索引,
但是当条件为b,c时将不会使用索引。
复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第
⼀个字段,索引才会被使用。因此,在复合索引中索引列的顺序⾄关重
要。如果不是按照索引的最左列开始查找,则⽆法使用索引。
2.对索引列运算,运算包括(+、-、、/、!、、%、like’%_’(%放
在前面)、or、in、exist等),导致索引失效。
错误的例⼦:select from test where id-1=9;
正确的例⼦:select from test where id=10;
注意!!
mysql sql 中如果使用了 not in , not exists , (
不等于 !=) 这些不
⾛
< 小于 > ⼤于 = 这个根据实际查询数据来判断,如果全盘扫描速度
比索引速度要快则不⾛索引 。
3.对索引应用内部函数,这种情况下应该建立基于函数的索引。
select from template t where ROUND(t.logicdb_id) = 1
此时应该建ROUND(t.logicdb_id)为索引。
4、类型错误,如字段类型为varchar,where条件用number。
例:template_id字段是varchar类型。
错误写法:select from template t where t.template_id = 1
正确写法:select from template t where t.template_id = ‘1’
5.如果MySQL预计使用全表扫描要比使用索引快,则不使用索引
6.like的模糊查询以%开头,索引失效
7.索引列没有限制 not null,索引不存储空值,如果不限制索引列是
not null,oracle会认为索引列有可能存在空值,所以不会按照索引计算
19. 慢查询是什么?
分析MySQL语句查询性能的⽅法除了使用 EXPLAIN 输出执⾏计划,
还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间
的SQL语句查询称为“慢查询”。
20. 主从库是什么?
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切
换到从数据库继续⼯作,避免数据丢失。
2、架构的扩展。业务量越来越⼤,I/O访问频率过⾼,单机⽆法满
⾜,此时做多库的存储,降低磁盘I/O访问的频率,提⾼单个机器的I/O
性能。
3、读写分离,使数据库能支撑更⼤的并发。在报表中尤其重要。由
于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用
master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速
度。
五、Java开发相关基础
21. MVC框架?
MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界
面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从⽽使
同⼀个程序可以使用不同的表现形式。比如⼀批统计数据可以分别用柱状
图、饼图来表示。C存在的目的则是确保M和V的同步,⼀旦M改变,V应
该同步更新。 [1-2]
模型-视图-控制器(MVC)是Xerox PARC在⼆⼗世纪⼋⼗年代为
编程语⾔Smalltalk-80发明的⼀种软件设计模式,已被⼴泛使用。后来被
推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的
使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是⼀个
有用的⼯具箱,它有很多好处,但也有⼀些缺点。
22. js跨域请求是什么意思?
跨域访问,简单来说就是 A ⽹站的 javascript 代码试图访问 B ⽹站,
包括提交内容和获取内容。由于安全原因,跨域访问是被各⼤浏览器所默
认禁⽌的。
23. 服务器500、502、503、504、505错误是什么?
HTTP 500 - 内部服务器错误
HTTP 502 - ⽹关错误
503 服务器目前⽆法使用(由于超载或停机维护)。通常,这只是暂
时状态。(服务不可用)
504 表示超时,也就是客户端所发出的请求没有到达⽹关
505 服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受
支持)
24. 负载均衡是什么?
负载均衡建立在现有⽹络结构之上,它提供了⼀种廉价有效透明的⽅
法扩展⽹络设备和服务器的带宽、增加吞吐量、加强⽹络数据处理能⼒、
提⾼⽹络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进⾏执
⾏,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务
服务器等,从⽽共同完成⼯作任务。
25. Cookie和Session分别是什么?Cookie的容量限制是多
少?说⼀下 Session 的⼯作原理?
Cookie是⼀段不超过4KB的小型⽂本数据,由⼀个名称(Name)、
⼀个值(Value)和其它⼏个用于控制Cookie有效期、安全性、使用范围
的可选属性组成。
Session:在计算机中,尤其是在⽹络应用中,称为“会话控制”。
Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应
用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,⽽
是在整个用户会话中⼀直存在下去。当用户请求来自应用程序的 Web页
时,如果该用户还没有会话,则Web服务器将自动创建⼀个 Session对象。
当会话过期或被放弃后,服务器将终⽌该会话。Session 对象最常见的⼀
个用法就是存储用户的首选项。
26. 如果客户端禁⽌ Cookie 能实现 Session 还能用吗?
能用。需要特殊处理。
27. Session共享原理是什么?怎么实现?
应用服务器间的session复制共享
基于cache DB缓存的session共享
基于redis缓存的session共享目的是实现单点登录
28. java的历史
1991 年Sun公司的James Gosling等⼈开始开发名称为 Oak 的语⾔,希
望用于控制嵌⼊在有线电视交换盒、PDA等的微处理器;
抖音/公众号:老猿说开发
20JAVA开发基础知识
V5.3
1994年将Oak语⾔更名为Java;
Java的三种技术架构:
JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用
程序,主要针对web程序开发;
JAVASE:Java Platform Standard Edition,完成桌面应用程序的开
发,是其它两者的基础;
JAVAME:Java Platform Micro Edition,开发电⼦消费产品和嵌⼊式
设备,如⼿机中的程序;
29. 正则表达式?
好处:正则的出现,对字符串的复杂操作变得更为简单。
特点:将对字符串操作的代码用⼀些符号来表示。只要使用了指定符
号,就可以调用底层的代码对字符串进⾏操作。符号的出现,简化了代码
的书写。
弊端:符号的出现虽然简化了书写,但是却降低了阅读性。
其实更多是用正则解决字符串操作的问题。
组:用小括号标示,每定义⼀个小括号,就是⼀个组,⽽且有自动编
号,从1开始。
只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加
\。
(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有⼏个左括号就
是⼏组。
常见操作:
1,匹配:其实用的就是String类中的matches⽅法。
String reg = “[1—9][0—9]{4,14}”;
boolean b = qq.matches(reg);//将正则和字符串关联对字符串进⾏匹配。
抖音/公众号:老猿说开发
21JAVA开发基础知识
V5.3
2,切割:其实用的就是String类中的split⽅法。
3,替换:其实用的就是String类中的replaceAll();
4,获取:
1),先要将正则表达式编译成正则对象。使用的是Pattern中静态⽅
法 compile(regex);
2),通过Pattern对象获取Matcher对象。
Pattern用于描述正则表达式,可以对正则表达式进⾏解析。
⽽将规则操作字符串,需要从新封装到匹配器对象Matcher中。
然后使用Matcher对象的⽅法来操作字符串。
如何获取匹配器对象呢?
通过Pattern对象中的matcher⽅法。该⽅法可以正则规则和字符串想
关联。并返回匹配器对象。
3),使用Matcher对象中的⽅法即可对字符串进⾏各种正则操作。
30. 反射技术?
就是动态加载⼀个指定的类,并获取该类中的所有的内容。⽽且将字
节码⽂件封装成对象,并将字节码⽂件中的内容都封装成对象,这样便于
操作这些成员。简单说:反射技术可以对⼀个类进⾏解剖。
反射的好处:⼤⼤的增强了程序的扩展性。
反射的基本步骤:
1、获得Class对象,就是获取到指定的名称的字节码⽂件对象。
2、实例化对象,获得类的属性、⽅法或构造函数。
3、访问属性、调用⽅法、调用构造函数创建对象。
31. Java 语⾔有哪些特点?
简单易学;
面向对象(封装,继承,多态);
抖音/公众号:老猿说开发
22JAVA开发基础知识
V5.3
平台⽆关性( Java 虚拟机实现平台⽆关性);
可靠性;
安全性;
支持多线程( C++ 语⾔没有内置的多线程机制,因此必须调用操作
系统的多线程功能来进⾏多线程程序设计,⽽ Java 语⾔却提供了多线程
支持);
支持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程
设计的,因此 Java 语⾔不仅支持⽹络编程⽽且很⽅便);
32. 重载和重写的区别?
重载: 发⽣在同⼀个类中,⽅法名必须相同,参数类型不同、个数
不同、顺序不同,⽅法返回值和访问修饰符可以不同,发⽣在编译时。
重写: 发⽣在⽗⼦类中,⽅法名、参数列表必须相同,返回值范围
小于等于⽗类,抛出的异常范围小于等于⽗类,访问修饰符范围⼤于等于
⽗类;如果⽗类⽅法访问修饰符为 private 则⼦类就不能重写该⽅法。
33. 接⼝和抽象类的区别是什么?
接⼝的⽅法默认是 public,所有⽅法在接⼝中不能有实现(Java 8 开始
接⼝⽅法可以有默认实现),⽽抽象类可以有非抽象的⽅法。
接⼝中除了static、final变量,不能有其他变量,⽽抽象类中则不⼀
定。
⼀个类可以实现多个接⼝,但只能实现⼀个抽象类。接⼝自⼰本身可
以通过extends关键字扩展多个接⼝。
接⼝⽅法默认修饰符是public,抽象⽅法可以有public、protected和
default这些修饰符(抽象⽅法就是为了被重写所以不能使用private关键字
修饰!)。
抖音/公众号:老猿说开发
23JAVA开发基础知识
V5.3
从设计层面来说,抽象是对类的抽象,是⼀种模板设计,⽽接⼝是对
⾏为的抽象,是⼀种⾏为的规范。
备注:在JDK8中,接⼝也可以定义静态⽅法,可以直接用接⼝名调
用。实现类和实现是不可以调用的。如果同时实现两个接⼝,接⼝中定义
了⼀样的默认⽅法,则必须重写,不然会报错。
34. 成员变量与局部变量的区别有哪些?
从语法形式上看:成员变量是属于类的,⽽局部变量是在⽅法中定义
的变量或是⽅法的参数;成员变量可以被 public,private,static 等修饰符所
修饰,⽽局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变
量和局部变量都能被 final 所修饰。
从变量在内存中的存储⽅式来看:如果成员变量是使用static修饰的,
那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量
是属于实例的。⽽对象存在于堆内存,局部变量则存在于栈内存。
从变量在内存中的⽣存时间上看:成员变量是对象的⼀部分,它随着
对象的创建⽽存在,⽽局部变量随着⽅法的调用⽽自动消失。
成员变量如果没有被赋初值:则会自动以类型的默认值⽽赋值(⼀种
情况例外:被 final 修饰的成员变量也必须显式地赋值),⽽局部变量则不
会自动赋值。
35. == 与 equals?
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象
是不是同⼀个对象(基本数据类型比较的是值,引用数据类型比较的
是内存地址)。
equals() : 它的作用也是判断两个对象是否相等。但它⼀般有两种使用
情况:
抖音/公众号:老猿说开发
24JAVA开发基础知识
V5.3
情况1:类没有覆盖 equals() ⽅法。则通过 equals() 比较该类的两个对
象时,等价于通过“”比较这两个对象。
情况2:类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来比
较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为
这两个对象相等)。
举个例⼦:
java
public class test1 {
public static void main(String[] args) {
String a = new String(“ab”); // a 为⼀个引用
String b = new String(“ab”); // b为另⼀个引用,对象的内容⼀样
String aa = “ab”; // 放在常量池中
String bb = “ab”; // 从常量池中查找
if (aa == bb) // true
System.out.println(“aabb”);
if (a == b) // false,非同⼀对象
System.out.println(“a==b”);
if (a.equals(b)) // true
System.out.println(“aEQb”);
if (42 == 42.0) { // true
System.out.println(“true”);
}
}
抖音/公众号:老猿说开发
25JAVA开发基础知识
V5.3
}
说明:
String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是比
较的对象的内存地址,⽽ String 的 equals ⽅法比较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存
在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有
就在常量池中重新创建⼀个 String 对象。
36. hashCode 与 equals ?
hashCode()介绍
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回⼀
个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包
含有hashCode() 函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的
检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的
对象)
为什么要有 hashCode
我们先以“HashSet 如何检查重复”为例⼦来说明为什么要有
hashCode: 当你把对象加⼊ HashSet 时,HashSet 会先计算对象的
hashcode 值来判断对象加⼊的位置,同时也会与其他已经加⼊的对象的
hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有
重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()
⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet
就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。
抖音/公众号:老猿说开发
26JAVA开发基础知识
V5.3
(摘自我的Java启蒙书《Head first java》第⼆版)。这样我们就⼤⼤减少
了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。
通过我们可以看出:hashCode() 的作用就是获取哈希码,也称为散列
码;它实际上是返回⼀个int整数。这个哈希码的作用是确定该对象在哈希
表中的索引位置。hashCode()在散列表中才有用,在其它情况下没用。在
散列表中hashCode() 的作用是获取对象的散列码,进⽽确定该对象在散列
表中的位置。
hashCode()与equals()的相关规定
如果两个对象相等,则hashcode⼀定也是相同的
两个对象相等,对两个对象分别调用equals⽅法都返回true
两个对象有相同的hashcode值,它们也不⼀定是相等的
因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖
hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有重写
hashCode(),则该 class 的两个对象⽆论如何都不会相等(即使这两个对象
指向相同的数据)
37. 关于 JVM JDK 和 JRE
JVM
Java虚拟机(JVM)是运⾏ Java 字节码的虚拟机。JVM有针对不同系
统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,
它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM可以理解的代码就叫做字节码(即扩展名为 .class 的
⽂件),它不面向任何特定的处理器,只面向虚拟机。Java 语⾔通过字节
抖音/公众号:老猿说开发
27JAVA开发基础知识
V5.3
码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时
又保留了解释型语⾔可移植的特点。所以 Java 程序运⾏时比较⾼效,⽽
且,由于字节码并不针对⼀种特定的机器,因此,Java程序⽆须重新编译
便可在多种不同操作系统的计算机上运⾏。
Java 程序从源代码到运⾏⼀般有下面3步:
Java程序运⾏过程
Java程序运⾏过程
我们需要格外注意的是 .class->机器码 这⼀步。在这⼀步 JVM 类加载
器首先加载字节码⽂件,然后通过解释器逐⾏解释执⾏,这种⽅式的执⾏
速度会相对比较慢。⽽且,有些⽅法和代码块是经常需要被调用的(也就
是所谓的热点代码),所以后面引进了 JIT 编译器,⽽JIT 属于运⾏时编
译。当 JIT 编译器完成第⼀次编译后,其会将字节码对应的机器码保存下
来,下次可以直接使用。⽽我们知道,机器码的运⾏效率肯定是⾼于 Java
解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语
⾔。
HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据⼆⼋定律,消
耗⼤部分系统资源的只有那⼀小部分的代码(热点代码),⽽这也就是
JIT所需要编译的部分。JVM会根据代码每次被执⾏的情况收集信息并相
应地做出⼀些优化,因此执⾏的次数越多,它的速度就越快。JDK 9引⼊
了⼀种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节
码编译成机器码,这样就避免了JIT预热等各⽅面的开销。JDK支持分层编
译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编
译器的。
总结:
Java虚拟机(JVM)是运⾏ Java 字节码的虚拟机。JVM有针对不同系
统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,
抖音/公众号:老猿说开发
28JAVA开发基础知识
V5.3
它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语⾔“⼀
次编译,随处可以运⾏”的关键所在。
JDK 和 JRE
JDK是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE
所拥有的⼀切,还有编译器(javac)和⼯具(如javadoc和jdb)。它能够
创建和编译程序。
JRE 是 Java运⾏时环境。它是运⾏已编译 Java 程序所需的所有内容
的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的⼀些基
础构件。但是,它不能用于创建新程序。
如果你只是为了运⾏⼀下 Java 程序的话,那么你只需要安装 JRE 就
可以了。如果你需要进⾏⼀些 Java 编程⽅面的⼯作,那么你就需要安装
JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进⾏任何
Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,
那么从技术上讲,您只是在应用程序服务器中运⾏Java程序。那你为什么
需要JDK呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要
使用 JDK 来编译 servlet。
38. 静态⽅法和实例⽅法有何不同?
在外部调用静态⽅法时,可以使用”类名.⽅法名”的⽅式,也可以使
用”对象名.⽅法名”的⽅式。⽽实例⽅法只有后面这种⽅式。也就是说,调
用静态⽅法可以⽆需创建对象。
静态⽅法在访问本类的成员时,只允许访问静态成员(即静态成员变
量和静态⽅法),⽽不允许访问实例成员变量和实例⽅法;实例⽅法则⽆
此限制。