Java 万字长文基础知识总结(下,2021年阿里Java岗面试必问

慢查询是什么?


分析MySQL语句查询性能的⽅法除了使用 EXPLAIN 输出执⾏计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。

主从库是什么?


1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切 换到从数据库继续⼯作,避免数据丢失。

2、架构的扩展。业务量越来越⼤,I/O访问频率过⾼,单机⽆法满⾜,此时做多库的存储,降低磁盘I/O访问的频率,提⾼单个机器的I/O性能。

3、读写分离,使数据库能支撑更⼤的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

五、Java开发相关基础

================

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的开发者的欢迎。模型-视图-控制器模式是⼀个有用的⼯具箱,它有很多好处,但也有⼀些缺点。

js跨域请求是什么意思?


跨域访问,简单来说就是 A ⽹站的 javascript 代码试图访问 B ⽹站,包括提交内容和获取内容。由于安全原因,跨域访问是被各⼤浏览器所默认禁⽌的。

服务器500、502、503、504、505错误是什么?


HTTP 500 - 内部服务器错误

HTTP 502 - ⽹关错误

503 服务器目前⽆法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)

504 表示超时,也就是客户端所发出的请求没有到达⽹关

505 服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持)

负载均衡是什么?


负载均衡建立在现有⽹络结构之上,它提供了⼀种廉价有效透明的⽅法扩展⽹络设备和服务器的带宽、增加吞吐量、加强⽹络数据处理能⼒、提⾼⽹络的灵活性和可用性。

负载均衡(Load Balance)其意思就是分摊到多个操作单元上进⾏执⾏,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从⽽共同完成⼯作任务。

Cookie和Session分别是什么?Cookie的容量限制是多少?说⼀下 Session 的⼯作原理?


Cookie是⼀段不超过4KB的小型⽂本数据,由⼀个名称(Name)、⼀个值(Value)和其它⼏个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

Session:在计算机中,尤其是在⽹络应用中,称为“会话控制”。

Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,⽽是在整个用户会话中⼀直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建⼀个 Session对象。当会话过期或被放弃后,服务器将终⽌该会话。Session 对象最常见的⼀个用法就是存储用户的首选项。

如果客户端禁⽌ Cookie 能实现 Session 还能用吗?


能用。需要特殊处理。

Session共享原理是什么?怎么实现?


应用服务器间的session复制共享

基于cache DB缓存的session共享

基于redis缓存的session共享目的是实现单点登录

java的历史


1991 年Sun公司的James Gosling等⼈开始开发名称为 Oak 的语⾔,希望用于控制嵌⼊在有线电视交换盒、PDA等的微处理器;

1994年将Oak语⾔更名为Java;

Java的三种技术架构:

JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发;

JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础;

JAVAME:Java Platform Micro Edition,开发电⼦消费产品和嵌⼊式设备,如⼿机中的程序;

正则表达式?


好处:正则的出现,对字符串的复杂操作变得更为简单。

特点:将对字符串操作的代码用⼀些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进⾏操作。符号的出现,简化了代码的书写。

弊端:符号的出现虽然简化了书写,但是却降低了阅读性。

其实更多是用正则解决字符串操作的问题。

组:用小括号标示,每定义⼀个小括号,就是⼀个组,⽽且有自动编 号,从1开始。 只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加 \\。 (aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有⼏个左括号就是⼏组。

常见操作:

1,匹配:其实用的就是String类中的matches⽅法。

String reg = “[1—9][0—9]{4,14}";

boolean b = qq.matches(reg);//将正则和字符串关联对字符串进⾏匹配。

2,切割:其实用的就是String类中的split⽅法。

3,替换:其实用的就是String类中的replaceAll();

4,获取:

1),先要将正则表达式编译成正则对象。使用的是Pattern中静态⽅法 compile(regex);

2),通过Pattern对象获取Matcher对象。

Pattern用于描述正则表达式,可以对正则表达式进⾏解析。 ⽽将规则操作字符串,需要从新封装到匹配器对象Matcher中。

然后使用Matcher对象的⽅法来操作字符串。

如何获取匹配器对象呢?

通过Pattern对象中的matcher⽅法。该⽅法可以正则规则和字符串想关联。并返回匹配器对象。

3),使用Matcher对象中的⽅法即可对字符串进⾏各种正则操作。

反射技术?


就是动态加载⼀个指定的类,并获取该类中的所有的内容。⽽且将字

节码⽂件封装成对象,并将字节码⽂件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对⼀个类进⾏解剖。

反射的好处:⼤⼤的增强了程序的扩展性。

反射的基本步骤:

1、获得Class对象,就是获取到指定的名称的字节码⽂件对象。

2、实例化对象,获得类的属性、⽅法或构造函数。

3、访问属性、调用⽅法、调用构造函数创建对象。

Java 语⾔有哪些特点?


简单易学;

面向对象(封装,继承,多态);

平台⽆关性( Java 虚拟机实现平台⽆关性);

可靠性;

安全性;

支持多线程( C++ 语⾔没有内置的多线程机制,因此必须调用操作

系统的多线程功能来进⾏多线程程序设计,⽽ Java 语⾔却提供了多线程支持);

支持⽹络编程并且很⽅便( Java 语⾔诞⽣本身就是为简化⽹络编程

设计的,因此 Java 语⾔不仅支持⽹络编程⽽且很⽅便);

重载和重写的区别?


重载: 发⽣在同⼀个类中,⽅法名必须相同,参数类型不同、个数

不同、顺序不同,⽅法返回值和访问修饰符可以不同,发⽣在编译时。

重写: 发⽣在⽗⼦类中,⽅法名、参数列表必须相同,返回值范围

小于等于⽗类,抛出的异常范围小于等于⽗类,访问修饰符范围⼤于等于⽗类;如果⽗类⽅法访问修饰符为 private 则⼦类就不能重写该⽅法。

接⼝和抽象类的区别是什么?


接⼝的⽅法默认是 public,所有⽅法在接⼝中不能有实现(Java 8 开始接⼝⽅法可以有默认实现),⽽抽象类可以有非抽象的⽅法。

接⼝中除了static、final变量,不能有其他变量,⽽抽象类中则不⼀

定。 ⼀个类可以实现多个接⼝,但只能实现⼀个抽象类。接⼝自⼰本身可以通过extends关键字扩展多个接⼝。

接⼝⽅法默认修饰符是public,抽象⽅法可以有public、protected和 default这些修饰符(抽象⽅法就是为了被重写所以不能使用private关键字 修饰!)。 从设计层面来说,抽象是对类的抽象,是⼀种模板设计,⽽接⼝是对⾏为的抽象,是⼀种⾏为的规范。

备注:在JDK8中,接⼝也可以定义静态⽅法,可以直接用接⼝名调

用。实现类和实现是不可以调用的。如果同时实现两个接⼝,接⼝中定义了⼀样的默认⽅法,则必须重写,不然会报错。

成员变量与局部变量的区别有哪些?


从语法形式上看:成员变量是属于类的,⽽局部变量是在⽅法中定义

的变量或是⽅法的参数;成员变量可以被 public,private,static 等修饰符所修饰,⽽局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。

从变量在内存中的存储⽅式来看:如果成员变量是使用static修饰的,

那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。⽽对象存在于堆内存,局部变量则存在于栈内存。

从变量在内存中的⽣存时间上看:成员变量是对象的⼀部分,它随着

对象的创建⽽存在,⽽局部变量随着⽅法的调用⽽自动消失。

成员变量如果没有被赋初值:则会自动以类型的默认值⽽赋值(⼀种

情况例外:被 final 修饰的成员变量也必须显式地赋值),⽽局部变量则不会自动赋值。

== 与 equals?


== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象 是不是同⼀个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)。

equals() : 它的作用也是判断两个对象是否相等。但它⼀般有两种使用情况:

情况1:类没有覆盖 equals() ⽅法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

情况2:类覆盖了 equals() ⽅法。⼀般,我们都覆盖 equals() ⽅法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例⼦:


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("aa==bb");



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");



}



}



}

说明:

String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是比 较的对象的内存地址,⽽ String 的 equals ⽅法比较的是对象的值。

当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建⼀个 String 对象。

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 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。

(摘自我的Java启蒙书《Head first java》第⼆版)。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值