吐血总结java开发面试,面试两个月终于上车了

自我介绍

大家好,我叫XXX。今年21岁,来自陕西省汉中市,是XX大学XX专业方向的三年级学生。本人对于软件开发有极大的兴趣,掌握一定的JAVA语言,熟悉spring、springBoot、SpringMVC、MyBatise 框架和 HTML、CSS、JavaScript、jQuery 等 web 开发技术。以及MySQL 数据库、JDBC 的编程技术。也在不断学习新技术来继续丰富自已的知识,目前已经独自编写多个项目。例如:OA办公系统,图书馆管理系统,大学生就业分析系统等。以上使我拥有了一定的实践经验。但仍觉得经历甚浅,希望通过与工作上的真实接触,学习更多的知识,通过更多的项目实践来提高自身的软件设计能力和编程技术。

Hello, everyone. My name is Li Wenzhuo. I am 21 years old, from Hanzhong City, Shaanxi Province. I am a third-year student majoring in Internet of Things engineering at Yulin University. I have great interest in software development. I am familiar with JAVA language, Spring, springBoot, SpringMVC, MyBatise framework, HTML, CSS, JavaScript, jQuery and other Web development technologies. And MySQL database, JDBC programming technology. I am also constantly learning new technologies to continue to enrich my knowledge, and I have written several projects by myself.For example: OA office system, library management system, college student employment analysis system, etc. The above makes me have certain practical experience. However, I still feel that my experience is very shallow. I hope to learn more knowledge through real contact with work and improve my software design ability and programming skills through more project practice.

Java基础

java1.8新特性

  • Lambda表达式

  • 函数式接口

  • *方法引用和构造器调用

  • Stream API

  • 接口中的默认方法和静态方法

  • 新时间日期API

为什么Java代码可以实现一次编写、到处运行?

参考答案

JVM(Java虚拟机)是Java跨平台的关键。

在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。

同一份Java源代码在不同的平台上运行,它不需要做任何的改变,并且只需要编译一次。而编译好的字节码,是通过JVM这个中间的“桥梁”实现跨平台的,JVM是与平台相关的软件,它能将统一的字节码翻译成该平台的机器码。

注意事项

  1. 编译的结果是生成字节码、不是机器码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行;

  2. 跨平台的是Java程序、而不是JVM,JVM是用C/C++开发的软件,不同平台下需要安装不同版本的JVM。

一个Java文件里可以有多个类吗(不含内部类)?

参考答案

  1. 一个java文件里可以有多个类,但最多只能有一个被public修饰的类;

  2. 如果这个java文件中包含public修饰的类,则这个类的名称必须和java文件名一致。

说一说你对Java访问权限的了解

参考答案

Java语言为我们提供了三种访问修饰符,即private、protected、public,在使用这些修饰符修饰目标时,一共可以形成四种访问权限,即private、default、protected、public,注意在不加任何修饰符时为default访问权限。

在修饰成员变量/成员方法时,该成员的四种访问权限的含义如下:

  • private:该成员可以被该类内部成员访问;

  • default:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问;

  • protected:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问,还可以被它的子类访问;

  • public:该成员可以被任意包下,任意类的成员进行访问。

在修饰类时,该类只有两种访问权限,对应的访问权限的含义如下:

  • default:该类可以被同一包下其他的类访问;

  • public:该类可以被任意包下,任意的类所访问。

介绍一下Java的数据类型

参考答案

Java数据类型包括基本数据类型和引用数据类型两大类。

基本数据类型有8个,可以分为4个小类,分别是整数类型(byte/short/int/long)、浮点类型(float/double)、字符类型(char)、布尔类型(boolean)。其中,4个整数类型中,int类型最为常用。2个浮点类型中,double最为常用。另外,在这8个基本类型当中,除了布尔类型之外的其他7个类型,都可以看做是数字类型,它们相互之间可以进行类型转换。

引用类型就是对一个对象的引用,根据引用对象类型的不同,可以将引用类型分为3类,即数组、类、接口类型。引用类型本质上就是通过指针,指向堆中对象所持有的内存空间,只是Java语言不再沿用指针这个说法而已。

int类型的数据范围是多少?

参考答案

int类型占4字节(32位),数据范围是 -2^31 ~ 2^31-1。

请介绍全局变量和局部变量的区别

参考答案

全局变量=成员变量

Java中的变量分为成员变量和局部变量,它们的区别如下:

成员变量:

  1. 成员变量是在类的范围里定义的变量;

  2. 成员变量有默认初始值;

  3. 未被static修饰的成员变量也叫实例变量,它存储于对象所在的堆内存中,生命周期与对象相同;

  4. 被static修饰的成员变量也叫类变量,它存储于方法区中,生命周期与当前类相同。

局部变量:

  1. 局部变量是在方法里定义的变量;

  2. 局部变量没有默认初始值;

  3. 局部变量存储于栈内存中,作用的范围结束,变量空间会自动的释放。

注意事项

Java中没有真正的全局变量,面试官应该是出于其他语言的习惯说全局变量的,他的本意应该是指成员变量。

请介绍一下实例变量的默认值

参考答案

实例变量若为引用数据类型,其默认值一律为null。若为基本数据类型,其默认值如下:

  • byte:0

  • short:0

  • int:0

  • long:0L

  • float:0.0F

  • double:0.0

  • char:'\u0000'

  • boolean:false

注意事项

上述默认值规则适用于所有的成员变量,所以对于类变量也是适用的。

为啥要有包装类?

参考答案

Java语言是面向对象的语言,其设计理念是“一切皆对象”。但8种基本数据类型不具备对象的特性,Java为每个基本数据类型都定义了一个对应的引用类型,这就是包装类。

说一说自动装箱、自动拆箱的应用场景

参考答案

自动装箱、自动拆箱是JDK1.5提供的功能。

自动装箱:可以把一个基本类型的数据直接赋值给对应的包装类型

自动拆箱:可以把一个包装类型的对象直接赋值给对应的基本类型

通过自动装箱、自动拆箱功能,可以大大简化基本类型变量和包装类对象之间的转换过程。比如,某个方法的参数类型为包装类型,调用时我们所持有的数据却是基本类型的值,则可以不做任何特殊的处理,直接将这个基本类型的值传入给方法即可。

如何对Integer和Double类型判断相等?

参考答案

Integer、Double不能直接进行比较,这包括:

  • 不能用==进行直接比较,因为它们是不同的数据类型

  • 不能转为字符串进行比较,因为转为字符串后,浮点值带小数点,整数值不带,这样它们永远都不相等;

  • 不能使用compareTo方法进行比较,虽然它们都有compareTo方法,但该方法只能对相同类型进行比较。

整数、浮点类型的包装类,都继承于Number类型,而Number类型分别定义了将数字转换为byte、short、int、long、float、double的方法。所以,可以将Integer、Double先转为转换为相同的基本数据类型(如double),然后使用==进行比较。

int和Integer有什么区别,二者在做==运算时会得到什么结果?

参考答案

int是基本数据类型,Integer是int的包装类。二者在做==运算时,Integer会自动拆箱为int类型,然后再进行比较。届时,如果两个int值相等则返回true,否则就返回false。

面向对象,封装继承多态

说一说你对面向对象的理解

参考答案

面向对象是基于面向过程而言,面向对象简单来说就是将功能封装到对象(数据和操作结合)里,我们面向对象,让对象去完成这些功能。万物皆对象。

理解面向对象:

经典案例:把大象塞进冰箱 1>>面向过程的做法:1.打开冰箱门 2.把大象塞进去 3.关闭冰箱门 当有两个不同的人用不同的方法实现这样的步骤,我们需要为不同的人量身定做不同解决事情的方法。 2>>面向对象,找个对象帮你做事 我们把冰箱作为对象,1.冰箱门可以被打开 2.大象可以被塞进去 3.冰箱门可以被关闭(面向对象写出通用的方法,屏蔽了所有人的差异)

面向对象的三大特征是什么?

参考答案

面向对象的程序设计方法具有三个基本特征:封装、继承、多态。其中,封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类后,将直接获得父类的属性和方法;多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

封装的目的是什么,为什么要有封装?

参考答案

封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接操作和修改。对一个类或对象实现良好的封装,可以实现以下目的:

  • 隐藏类的实现细节;

  • 让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;

  • 可进行数据检查,从而有利于保证对象信息的完整性;

  • 便于修改,提高代码的可维护性。

说一说你对多态的理解

参考答案

因为子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型由系统自动完成。

当把一个子类对象直接赋给父类引用变量时,例如 BaseClass obj = new SubClass();,这个obj引用变量的编译时类型是BaseClass,而运行时类型是SubClass,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。

Java中的多态是怎么实现的?

参考答案

多态的实现离不开继承,在设计程序时,我们可以将参数的类型定义为父类型。在调用程序时,则可以根据实际情况,传入该父类型的某个子类型的实例,这样就实现了多态。对于父类型,可以有三种形式,即普通的类、抽象类、接口。对于子类型,则要根据它自身的特征,重写父类的某些方法,或实现抽象类/接口的某些抽象方法。

Java为什么是单继承,为什么不能多继承?

参考答案

首先,Java是单继承的,指的是Java中一个类只能有一个直接的父类。Java不能多继承,则是说Java中一个类不能直接继承多个父类。

其次,Java在设计时借鉴了C++的语法,而C++是支持多继承的。Java语言之所以摒弃了多继承的这项特征,是因为多继承容易产生混淆。比如,两个父类中包含相同的方法时,子类在调用该方法或重写该方法时就会迷惑。

准确来说,Java是可以实现"多继承"的。因为尽管一个类只能有一个直接父类,但是却可以有任意多个间接的父类。这样的设计方式,避免了多继承时所产生的混淆。

重载重写

说一说重写与重载的区别

参考答案

重载OverLoad在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载

重写Override,从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。

参考答案

方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

介绍一下Object类中的方法

参考答案

Object类提供了如下几个常用方法:

  • Class<?> getClass():返回该对象的运行时类。

  • boolean equals(Object obj):判断指定对象与该对象是否相等。

  • int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值。

  • String toString():返回该对象的字符串表示,当程序使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。Object类的toString()方法返回 运行时类名@十六进制hashCode值 格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

说一说hashCode()和equals()的关系

参考答案

hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定:

  • 如果两个对象相等,则它们必须有相同的哈希码。

  • 如果两个对象有相同的哈希码,则它们未必相等。

为什么要重写hashCode()和equals()?

参考答案

Object类提供的equals()方法默认是用==来进行比较的,也就是说只有两个对象是同一个对象时,才能返回相等的结果。而实际的业务中,我们通常的需求是,若两个不同的对象它们的内容是相同的,就认为它们相等。鉴于这种情况,Object类中equals()方法的默认实现是没有实用价值的,所以通常都要重写。

由于hashCode()与equals()具有联动关系,所以equals()方法重写时,通常也要将hashCode()进行重写,使得这两个方法始终满足相关的约定。

==和equals()有什么区别?

参考答案

==运算符:

  • 作用于基本数据类型时,是比较两个数值是否相等

  • 作用于引用数据类型时,是比较两个对象的内存地址是否相同,即判断它们是否为同一个对象;

equals()方法:

  • 没有重写时,Object默认以 == 来实现,即比较两个对象的内存地址是否相同;

  • 重写后,一般会按照对象的内容来进行比较,若两个对象内容相同则认为对象相等,否则认为对象不等。

String类

String类有哪些方法?

参考答案

String类是Java最常用的API,它包含了大量处理字符串的方法,比较常用的有:

  • char charAt(int index):返回指定索引处的字符;

  • String substring(int beginIndex, int endIndex):从此字符串中截取出一部分子字符串;

  • String[] split(String regex):以指定的规则将此字符串分割成数组;

  • String trim():删除字符串前导和后置的空格;

  • int indexOf(String str):返回子串在此字符串首次出现的索引;

  • int lastIndexOf(String str):返回子串在此字符串最后出现的索引;

  • boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;

  • boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;

  • String toUpperCase():将此字符串中所有的字符大写;

  • String toLowerCase():将此字符串中所有的字符小写;

  • String replaceFirst(String regex, String replacement):用指定字符串替换第一个匹配的子串;

  • String replaceAll(String regex, String replacement):用指定字符串替换所有的匹配的子串。

String可以被继承吗?

参考答案

String类由final修饰,所以不能被继承。

说一说String和StringBuffer有什么区别

参考答案

String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象

说一说StringBuffer和StringBuilder有什么区别

参考答案

StringBuffer、StringBuilder都代表可变的字符串对象,它们有共同的父类 AbstractStringBuilder,并且两个类的构造方法和成员方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder是非线程安全的所以StringBuilder性能略高。一般情况下,要创建一个内容可变的字符串,建议优先考虑StringBuilder类。

接口

接口和抽象类有什么区别?

参考答案

从设计目的上来说,二者有如下的区别:

接口体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务;对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。

抽象类体现的是一种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。

从使用方式上来说,二者有如下的区别:

  • 接口里只能包含抽象方法、静态方法、默认方法和私有方法,不能为普通方法提供方法实现;抽象类则完全可以包含普通方法。

  • 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。

  • 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

  • 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。

  • 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

接口中可以有构造函数吗?

参考答案

由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法、默认方法或私有方法)、内部类(包括内部接口、枚举)定义。

谈谈你对面向接口编程的理解

参考答案

接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极好地降低程序各模块之间的耦合,从而提高系统的可扩展性和可维护性。基于这种原则,很多软件架构设计理论都倡导“面向接口”编程,而不是面向实现类编程,希望通过面向接口编程来降低程序的耦合。

异常

常见的异常

1、算术异常类:ArithmeticException

2、空指针异常类:NullpointerException

3、类型强制转换异常:ClassCastException

4、数组下标越界异常:ArrayIndexOutOfBoundsException

5、文件未找到异常:FileNotFoundException

6、操作数据库异常:SQLException

7、I/O 异常的根类:IOException

8、线程中断:InterruptedException

遇到过异常吗,如何处理?

参考答案

  1. 抛出异常throw

  2. 捕获异常try…catch

  3. 声明异常throws

说一说Java的异常机制

参考答案

关于异常处理:

在Java中,处理异常的语句由try、catch、finally三部分组成。其中,try块用于包裹业务代码,catch块用于捕获并处理某个类型的异常,finally块则用于回收资源。当业务代码发生异常时,系统会创建一个异常对象,然后由JVM寻找可以处理这个异常的catch块,并将异常对象交给这个catch块处理。若业务代码打开了某项资源,则可以在finally块中关闭这项资源,因为无论是否发生异常,finally块一定会执行。

关于抛出异常:

当程序出现错误时,系统会自动抛出异常。除此以外,Java也允许程序主动抛出异常。当业务代码中,判断某项错误的条件成立时,可以使用throw关键字向外抛出异常。在这种情况下,如果当前方法不知道该如何处理这个异常,可以在方法签名上通过throws关键字声明抛出异常,则该异常将交给JVM处理。

关于异常跟踪栈:

程序运行时,经常会发生一系列方法调用,从而形成方法调用栈。异常机制会导致异常在这些方法之间传播,而异常传播的顺序与方法的调用相反。异常从发生异常的方法向外传播,首先传给该方法的调用者,再传给上层调用者,以此类推。最终会传到main方法,若依然没有得到处理,则JVM会终止程序,并打印异常跟踪栈的信息

请介绍Java的异常接口

参考答案

Error、Exception。

Throwable是异常的顶层父类,代表所有的非正常情况。它有两个直接子类,分别是Error、Exception。

Error是错误,一般是指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。在定义方法时,也无须在其throws子句中声明该方法可能抛出Error及其任何子类。

Exception是异常,它被分为两大类

,分别是Checked异常和Runtime异常。所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常。Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。Runtime异常则更加灵活,Runtime异常无须显式声明抛出,如果程序需要捕获Runtime异常,也可以使用try...catch块来实现。

finally是无条件执行的吗?

参考答案

不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块总会被执行。

注意事项

如果在try块或catch块中使用 System.exit(1); 来退出虚拟机,则finally块将失去执行的机会。但是我们在实际的开发中,重来都不会这样做,所以尽管存在这种导致finally块无法执行的可能,也只是一种可能而已。

在finally中return会发生什么?

参考答案

在通常情况下,不要在finally块中使用return、throw等导致方法终止的语句,一旦在finally块中使用了return、throw语句,将会导致try块、catch块中的return、throw语句失效。

详细解析

当Java程序执行try块、catch块时遇到了return或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去寻找该异常处理流程中是否包含finally块,如果没有finally块,程序立即执行return或throw语句,方法终止;如果有finally块,系统立即开始执行finally块。只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的return或throw语句;如果finally块里也使用了return或throw等导致方法终止的语句,finally块已经终止了方法,系统将不会跳回去执行try块、catch块里的任何代码。

static

说一说你对static关键字的理解

参考答案

在Java类里只能包含成员变量、方法、构造器、初始化块、内部类(包括接口、枚举)5种成员,而static可以修饰成员变量、方法、初始化块、内部类(包括接口、枚举),以static修饰的成员就是类成员。类成员属于整个类,而不属于单个对象。

对static关键字而言,有一条非常重要的规则:类成员(包括成员变量、方法、初始化块、内部类和内部枚举)不能访问实例成员(包括成员变量、方法、初始化块、内部类和内部枚举)。因为类成员是属于类的,类成员的作用域比实例成员的作用域更大,完全可能出现类成员已经初始化完成,但实例成员还不曾初始化的情况,如果允许类成员访问实例成员将会引起大量错误。

static修饰的类能不能被继承?

参考答案

static修饰的类可以被继承

final与static的区别

参考答案

1、是否可以修改值 对于final来说,修饰的引用、方法和类都是“不可以改变的”,而static修饰则可以“改变”; 2、何时加载 对于final修饰的引用、方法来说,会在每一次实例化对象时加载,而static 修饰则会在类加载是就加载,且只加载一次,优先于对象存在。

泛型

说一说你对泛型的理解

参考答案

1、泛型只存在于编译期间

2、泛型在语法中的特征就是尖括号

3、泛型的核心原理:利用Object引用可以指向任意类型的对象

反射

说一说你对Java反射机制的理解

参考答案

Java程序中的对象在运行时可以表现为两种类型,即编译时类型和运行时类型。例如 Person p = new Student(); ,这行代码将会生成一个p变量,该变量的编译时类型为Person,运行时类型为Student。

有时,程序在运行时接收到外部传入的一个对象,该对象的编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序需要在运行时发现对象和类的真实信息,而解决这个问题有以下两种做法:

  • 第一种做法是假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换将其转换成其运行时类型的变量即可。

  • 第二种做法是编译时根本无法预知该对象和类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息,这就必须使用反射。

具体来说,通过反射机制,我们可以实现如下的操作:

  • 程序运行时,可以通过反射获得任意一个类的Class对象,并通过这个对象查看这个类的信息;

  • 程序运行时,可以通过反射创建任意一个类的实例,并访问该实例的成员;

  • 程序运行时,可以通过反射机制生成一个类的动态代理类或动态代理对象。

Java反射在实际项目中有哪些应用场景?

参考答案

Java的反射机制在实际项目中应用广泛,常见的应用场景有:

  • 使用JDBC时,如果要创建数据库的连接,则需要先通过反射机制加载数据库的驱动程序;

  • 多数框架都支持注解/XML配置,从配置中解析出来的类是字符串,需要利用反射机制实例化;

  • 面向切面编程(AOP)的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现。

说一说Java的四种引用方式

参考答案

Java对象的四种引用方式分别是强引用、软引用、弱引用、虚引用,具体含义如下:

  • 强引用:这是Java程序中最常见的引用方式,即程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。

  • 软引用:当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象。当系统内存空间不足时,系统可能会回收它。软引用通常用于对内存敏感的程序中。

  • 弱引用:弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收,正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。

  • 虚引用:虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列联合使用。

集合类

集合框架底层数据结构

常用的集合类有哪些?

Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

集合框架底层数据结构

List Arraylist: Object数组 Vector: Object数组 LinkedList: 双向循环链表 Set HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素 LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。 TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。) Map HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间 LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。 HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的 TreeMap: 红黑树(自平衡的排序二叉树)

哪些集合类是线程安全的?

Vector,hashTable

ArrayList和LinkedList的区别

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

4.自由性不同,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便。LinkList自由度高能够动态的随数据量的变化而变化,但是它不便于使用。

5.主要控件的开销不同

  1. ArrayList主要控件开销在于需要在List列表预留一定空间

  2. LinkList主要控件开销在于需要存储节点信息以及节点指针。

HashMap和HashSet的区别

1.HashMap实现了Map接口,而HashSet实现了Set接口。

2.HashMap用于存储键值对,而HashSet用于存储对象。

3.HashMap不允许有重复的键,可以允许有重复的值。HashSet不允许有重复元素。

4.HashMap允许有一个键为空,多个值为空,HashSet允许有一个空值。

5.HashMap中使用put()将元素加入map中,而HashSet使用add()将元素放入set中。

6.HashMap比较快,因为其使用唯一的键来获取对象。

HashSet和TreeSet的区别

底层使用的储存数据结构不同:

Hashset底层使用的是HashMap哈希表结构储存 而Treeset底层用的是TreeMap树结构储存。

储存的数据保存唯一方式不用。

Hashset是通过复写hashCode()方法和equals()方法来保证的。 而Treeset是通过Compareable接口的compareto方法来保证的。

hashset无序 Treeset有序

hashmap和treemap的区别

数据结构不同

HashMap是基于哈希表+数组来实现的,而TreeMap是基于红黑树实现的。

效率方面不同

HashMap比TreeMap的性能更高。

HashMap的时间复杂度是O(1),它是通过哈希函数计算的哈希地址。

而TreeMap主要是保证数据平衡,时间复杂度是O(log2 n)。

线程安全方面

HashMap和TreeMap都是非线程安全的。

日常开发建议多使用HashMap,只有在需要排序的时候才使用TreeMap。

HashMap和HashTable的区别

HashMap不是线程安全的,HashTable是线程安全的;

现在HashTable在我们的开发中很少很少使用。如果你要保证线程安全,推荐使用ConcurrentHashMap

因为线程安全的问题,HashMap要比HashTable的效率高一点。

HashMap中,null可以作为key,HashTable中不支持key为null,

数据结构

哈希

请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方?

参考回答:

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。

请说一说,Java中的HashMap的工作原理是什么?

HashMap是以键值对的形式存储元素的,需要一个哈希函数,使用hashcode和eaquels方法,从集合中添加和检索元素,调用put方法时,会计算key 的哈希值,然后把键值对存在集合中合适的索引上,如果键key已经存在,value会被更新为新值。另外HashMap的初始容量是16,在jdk1.7的时候底层是基于数组和链表实现的,插入方式是头插法。jdk1.8的时候底层是基于数组和链表/红黑树实现的,插入方式为尾插法。

介绍一下,什么是hashmap?

HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。

jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突

参考回答:

  • HashMap 是一个散列表,它存储的内容是键值对(key-value)。

  • HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。 HashMap 的实现不是同步的,所以它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

红黑树和平衡二叉树的区别?

红黑树是一个二叉查找树,不像平衡二叉树要求所有节点左右子树高度差不超过1,红黑树只要求从一个节点到所有叶结点的路径中,最长路径不超过最短路径的两倍,所以红黑树只追求树的大致平衡。

因为对树平衡程度的不同要求,平衡二叉树在插入和删除的过程中会花费比较大的代价来维护树的平衡,所以平衡二叉树不适合插入、删除太多的场景。而红黑树只要求弱平衡,它做到了当插入和删除时,只需最多旋转3次就能实现一定程度的平衡,所以能将查询、插入和删除的时间复杂度维持在对数级别(O(logn))。

对红黑树了解吗?说一下

先讲上面红黑树与平衡二叉树的区别,再讲下面的性质。

红黑树性质:

红黑树中节点分为黑色节点和红色节点。 根节点和所有叶子结点(NIL节点)是黑色。 每条从根到叶子的路基上不能出现连续两个红色节点。 从任一节点到所有叶子结点的路径上的黑色节点数量相同。

请你说一下,B+树和B-树?

考察点:树

  • B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。

  • B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

遍历

二叉树 Z 字型遍历

考察点:遍历

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        //标记奇偶层 开始为0层 从左->右遍历
        boolean flag = true;
        if (pRoot == null) {
            return result;
        }
        queue.add(pRoot);
        while (queue.size() != 0) {
            flag = !flag;
            int size = queue.size();
            ArrayList<Integer> temp = new ArrayList<Integer>();
            for (int i = 0; i < size; i++) {
                TreeNode curroot = queue.poll();
                temp.add(curroot.val);
                if (curroot.left != null) 
                    queue.add(curroot.left);
                if (curroot.right != null)
                    queue.add(curroot.right);
            }
            // 反转
            if (flag) {
                Collections.reverse(temp);
            }
            result.add(temp);
        }
        return result;
    }
}

编程题:写一个函数,找到一个文件夹下所有文件,包括子文件夹

考察点:遍历

import java.io.File;
public class Counter2 {
    public static void main(String[] args) {
        //取得目标目录
        File file = new File("D:");
        //获取目录下子文件及子文件夹
        File[] files = file.listFiles();
        readfile(files);
    }
​
    public static void readfile(File[] files) {
        if(files == null) {// 如果目录为空,直接退出  
            return; 
        }
        for(File f:files) {
            //如果是文件,直接输出名字
            if(f.isFile()) {
                System.out.println(f.getName());
            }
            //如果是文件夹,递归调用
            else if(f.isDirectory()) {
                readfile(f.listFiles());
            }
        }
    }
}

链表

数组

排序

用java写一个冒泡排序?

考察点:冒泡排序

public static void main(String[] args) {
    int[] result = {2,4,1,3,6,5};
    int temp;
    System.out.println("----冒泡排序前顺序----");
    for (int i : result) {
        System.out.print(i);
    }
    for(int i=0;i<result.length-1;i++){
        for(int j = 0;j<result.length-1-i;j++){
            if(result[j+1]<result[j]){
                //后一个比前一个小
                temp = result[j];
                result[j] = result[j+1];
                result[j+1] = temp;
            }
        }
    }
    System.out.println();
    System.out.println("----冒泡排序后结果----");
    for (int i : result) {
        System.out.print(i);
    }
}

介绍一下,排序都有哪几种方法?请列举出来。

考察点:排序

参考回答:

排序的方法有:

插入排序(简单插入排序、希尔排序)

交换排序(冒泡排序、快速排序)

选择排序(简单选择排序、堆排序)

归并排序

分配排序(箱排序、基数排序)

你知道哪些排序算法,这些算法的时间复杂度分别是多少,解释一下快排?

考察点:快排

参考回答:

快排:快速排序有两个方向,左边的i下标一直往右走(当条件a[i] <= a[center_index]时),其中center_index是中枢元素的数组下标,一般取为数组第0个元素。

而右边的j下标一直往左走(当a[j] > a[center_index]时)。

如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。交换a[j]和a[center_index],完成一趟快速排序。

堆与栈

3. IO

介绍一下Java中的IO流

参考答案

IO(Input Output)用于实现对数据的输入与输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它程序就可以采用同一方式访问不同的输入/输出源。

  • 按照数据流向,可以将流分为输入流和输出流,其中输入流只能读取数据、不能写入数据,而输出流只能写入数据、不能读取数据。

  • 按照数据类型,可以将流分为字节流和字符流,其中字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。

  • 按照处理功能,可以将流分为节点流和处理流,其中节点流可以直接从/向一个特定的IO设备(磁盘、网络等)读/写数据,也称为低级流,而处理流是对节点流的连接或封装,用于简化数据读/写功能或提高效率,也称为高级流。

怎么用流打开一个大文件?

参考答案

打开大文件,应避免直接将文件中的数据全部读取到内存中,可以采用分次读取的方式。

  1. 使用缓冲流。缓冲流内部维护了一个缓冲区,通过与缓冲区的交互,减少与设备的交互次数。使用缓冲输入流时,它每次会读取一批数据将缓冲区填满,每次调用读取方法并不是直接从设备取值,而是从缓冲区取值,当缓冲区为空时,它会再一次读取数据,将缓冲区填满。使用缓冲输出流时,每次调用写入方法并不是直接写入到设备,而是写入缓冲区,当缓冲区填满时它会自动刷入设备。

  2. 使用NIO。NIO采用内存映射文件的方式来处理输入/输出,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了(这种方式模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入/输出比传统的输入/输出要快得多。

介绍一下Java的序列化与反序列化

参考答案

序列化机制可以将对象转换成字节序列,这些字节序列可以保存在磁盘上,也可以在网络中传输,并允许程序将这些字节序列再次恢复成原来的对象。其中,对象的序列化(Serialize),是指将一个Java对象写入IO流中,对象的反序列化(Deserialize),则是指从IO流中恢复该Java对象。

若对象要支持序列化机制,则它的类需要实现Serializable接口,该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的,Java的很多类已经实现了Serializable接口,如包装类、String、Date等。

若要实现序列化,则需要使用对象流ObjectInputStream和ObjectOutputStream。其中,在序列化时需要调用ObjectOutputStream对象的writeObject()方法,以输出对象序列。在反序列化时需要调用ObjectInputStream对象的readObject()方法,将对象序列恢复为对象

除了Java自带的序列化之外,你还了解哪些序列化工具?

参考答案

JSON,Protobuf,Thrift,Avro

线程

创建线程有哪几种方式?

参考答案

创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。

说说Thread类的常用方法

参考答案

Thread类常用构造方法:

  • Thread()

  • Thread(String name)

  • Thread(Runnable target)

run()和start()有什么区别?

参考答案

run()方法被称为线程执行体,它的方法体代表了线程需要完成的任务,而start()方法用来启动线程。

synchronized和Lock的区别是什么?

区别:1、lock是一个接口,而synchronized是java的一个关键字。2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。

notify()、notifyAll()的区别

参考答案

  • notify()

    用于唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行。

  • notifyAll()

    用于唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行。

线程是否可以重复启动,会有什么后果?

参考答案

只能对处于新建状态的线程调用start()方法,否则将引发IllegalThreadStateException异常。

介绍一下线程的生命周期

参考答案

在线程的生命周期中,它要经过新建(New)、就绪(Ready)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。尤其是当线程启动以后,它不可能一直“霸占”着CPU独自运行,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、就绪之间切换。

如何实现线程同步?

参考答案

同步方法

同步代码块

ReentrantLock

原子变量

说一说Java多线程之间的通信方式

参考答案

在Java中线程通信主要有以下三种方式:

  1. wait()、notify()、notifyAll()

  2. await()、signal()、signalAll()

  3. BlockingQueue

    说一说sleep()和wait()的区别

    参考答案

    1. sleep()是Thread类中的静态方法,而wait()是Object类中的成员方法;

    2. sleep()可以在任何地方使用,而wait()只能在同步方法或同步代码块中使用;

    3. sleep()不会释放锁,而wait()会释放锁,并需要通过notify()/notifyAll()重新获取锁。

如何实现子线程先执行,主线程再执行?

参考答案

启动子线程后,立即调用该线程的join()方法,则主线程必须等待子线程执行完成后再执行。

阻塞线程的方式有哪些?

参考答案

当发生如下情况时,线程将会进入阻塞状态:

说一说Java中乐观锁和悲观锁的区别

参考答案

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。Java中悲观锁是通过synchronized关键字或Lock接口来实现的。

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量。在JDK1.5 中新增 java.util.concurrent (J.U.C)就是建立在CAS之上的。相对于对于 synchronized 这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。

公平锁与非公平锁是怎么实现的?

参考答案

在Java中实现锁的方式有两种,一种是使用Java自带的关键字synchronized对相应的类或者方法以及代码块进行加锁,另一种是ReentrantLock,前者只能是非公平锁,而后者是默认非公平但可实现公平的一把锁。

了解Java中的锁升级吗?

参考答案

JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁。但是在JDK 1.6后,JVM为了提高锁的获取与释放效率对synchronized 进行了优化,引入了偏向锁和轻量级锁 ,从此以后锁的状态就有了四种:无锁、偏向锁、轻量级锁、重量级锁。并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,这四种锁的级别由低到高依次是:无锁、偏向锁,轻量级锁,重量级锁。

线程池有哪些参数,各个参数的作用是什么?

参考答案

线程池主要有如下6个参数:

corePoolSize

maximumPoolSize

keepAliveTime

workQueue

threadFactory

handler

5. JVM

5.1 JVM包含哪几部分?

参考答案

JVM 主要由四大部分组成:ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Interface(本地库接口)

JVM是如何运行的?

参考答案

JVM的启动过程分为如下四个步骤:

  1. JVM的装入环境和配置

  2. 装载JVM

  3. 初始化JVM,获得本地调用接口

  4. 运行Java程序

  5. ava程序是怎么运行的?

    参考答案

    概括来说,写好的 Java 源代码文件经过 Java 编译器编译成字节码文件后,通过类加载器加载到内存中,才能被实例化,然后到 Java 虚拟机中解释执行,最后通过操作系统操作 CPU 执行获取结果。

    本地方法栈有什么用?

    参考答案

    本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

    没有程序计数器会怎么样?

    参考答案

    没有程序计数器,Java程序中的流程控制将无法得到正确的控制,多线程也无法正确的轮换。

    一说Java的内存分布情况

    参考答案

    程序计数器

    Java虚拟机栈

本地方法栈

Java堆

方法区

运行时常量池

直接内存

类存放在哪里?

参考答案

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

数据库

介绍一下数据库分页

参考答案

MySQL的分页语法:

在MySQL中,SELECT语句默认返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句,以实现分页查询。

介绍一下SQL中的聚合函数

参考答案

常用的聚合函数有COUNT()、AVG()、SUM()、MAX()、MIN(),下面以MySQL为例,说明这些函数的作用。

表跟表是怎么关联的?

参考答案

表与表之间常用的关联方式有两种:内连接、外连接,下面以MySQL为例来说明这两种连接方式。

内连接:

内连接通过INNER JOIN来实现,它将返回两张表中满足连接条件的数据,不满足条件的数据不会查询出来。

外连接:

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

说一说你对外连接的了解

参考答案

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

说一说数据库的左连接和右连接*

参考答案

外连接通过OUTER JOIN来实现,它会返回两张表中满足连接条件的数据,同时返回不满足连接条件的数据。常见的外连接有两种形式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)。

SQL中怎么将行转成列?

参考答案

使用 CASE...WHEN...THEN 语句实现行转列,

使用 IF() 函数实现行转列

谈谈你对SQL注入的理解

参考答案

SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。也就是说,在一些对SERVER端发起的请求参数中植入一些SQL代码,SERVER端在执行SQL操作时,会拼接对应参数,同时也将一些SQL注入攻击的“SQL”拼接起来,导致会执行一些预期之外的操作。

将一张表的部分数据更新到另一张表,该如何操作呢?

参考答案

可以采用关联更新的方式,将一张表的部分数据,更新到另一张表内。

数据库索引

2.1 说一说你对MySQL索引的理解

参考答案

索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

索引的优点主要有以下几条:

  1. 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。

  2. 可以大大加快数据的查询速度,这也是创建索引的主要原因。

  3. 在实现数据的参考完整性方面,可以加速表和表之间的连接。

  4. 在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。

增加索引也有许多不利的方面,主要表现在如下几个方面:

  1. 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

  2. 索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

索引有哪几种?

参考答案

MySQL的索引可以分为以下几类:

  1. 普通索引和唯一索引

    普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。

    唯一索引要求索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    主键索引是一种特殊的唯一索引,不允许有空值。

  2. 单列索引和组合索引

    单列索引即一个索引只包含单个列,一个表可以有多个单列索引。

    组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。

  3. 全文索引

    全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。

  4. 空间索引

    空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。

MySQL怎么判断要不要加索引?

参考答案

建议按照如下的原则来创建索引:

  1. 当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。

  2. 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

2.5 只要创建了索引,就一定会走索引吗?

参考答案

不一定。

比如,在使用组合索引的时候,如果没有遵从“最左前缀”的原则进行搜索,则索引是不起作用的。

如何判断数据库的索引有没有生效?

参考答案

可以使用EXPLAIN语句查看索引是否正在使用。

索引是越多越好吗?

参考答案

索引并非越多越好,一个表中如有大量的索引,不仅占用磁盘空间,还会影响INSERT、DELETE、UPDATE等语句的性能,因为在表中的数据更改时,索引也会进行调整和更新。

2.9 数据库索引失效了怎么办?

参考答案

可以采用以下几种方式,来避免索引失效:

  1. 使用组合索引时,需要遵循“最左前缀”原则;

  2. 不在索引列上做任何操作,例如计算、函数、类型转换,会导致索引失效而转向全表扫描;

  3. 尽量使用覆盖索引(之访问索引列的查询),减少 select * 覆盖索引能减少回表次数;

  4. MySQL在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描;

  5. LIKE以通配符开头(%abc)MySQL索引会失效变成全表扫描的操作;

  6. 字符串不加单引号会导致索引失效(可能发生了索引列的隐式转换);

  7. 少用or,用它来连接时会索引失效。

2.10 所有的字段都适合创建索引吗?

参考答案

不是。

下列几种情况,是不适合创建索引的:

  1. 频繁更新的字段不适合建立索引;

  2. where条件中用不到的字段不适合建立索引;

  3. 数据比较少的表不需要建索引;

  4. 数据重复且分布比较均匀的的字段不适合建索引,例如性别、真假值;

  5. 参与列计算的列不适合建索引。

MySQL的索引为什么用B+树?

参考答案

B+树由B树和索引顺序访问方法演化而来,它是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点,各叶子节点通过指针进行链接。

B+树索引在数据库中的一个特点就是高扇出性,例如在InnoDB存储引擎中,每个页的大小为16KB。在数据库中,B+树的高度一般都在2~4层,这意味着查找某一键值最多只需要2到4次IO操作,这还不错。因为现在一般的磁盘每秒至少可以做100次IO操作,2~4次的IO操作意味着查询时间只需0.02~0.04秒。

MySQL的Hash索引和B树索引有什么区别?

参考答案

hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树,对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。

什么是联合索引?

参考答案

联合索引是指对表上的多个列进行索引,联合索引的创建方法与单个索引创建的方法一样,不同之处仅在于有多个索引列。从本质上来说,联合索引还是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2,

select in语句中如何使用索引?

参考答案

索引是否起作用,主要取决于字段类型:

  • 如果字段类型为字符串,需要给in查询中的数值与字符串值都需要添加引号,索引才能起作用。

  • 如果字段类型为int,则in查询中的值不需要添加引号,索引也会起作用。

IN的字段,在联合索引中,按以上方法,也会起作用。

2.19 模糊查询语句中如何使用索引?

参考答案

在MySQL中模糊查询 mobile like ‘%8765’,这种情况是不能使用 mobile 上的索引的,那么如果需要根据手机号码后四位进行模糊查询,可以用一下方法进行改造。

数据库引擎

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库

数据库引擎的类型

1、InnoDB引擎

ISAM引擎

MYISAM引擎

HEAP引擎

数据库的事务

3.1 说一说你对数据库事务的了解

参考答案

事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。

事务有哪几种类型,它们之间有什么区别?

参考答案

事务可以分为以下几种类型:

扁平事务

带有保存点的扁平事务

链事务

嵌套事务

分布式事务

谈谈MySQL的事务隔离级别

参考答案

SQL 标准定义了四种隔离级别,这四种隔离级别分别是:

  • 读未提交(READ UNCOMMITTED);

  • 读提交 (READ COMMITTED);

  • 可重复读 (REPEATABLE READ);

  • 串行化 (SERIALIZABLE)。

事务可以嵌套吗?

参考答案

可以,,MySQL数据库不支持嵌套事务。

如何实现可重复读?

参考答案

MySQL的InnoDB引擎,在默认的REPEATABLE READ的隔离级别下,实现了可重复读,同时也解决了幻读问题。

MySQL事务如何回滚?

参考答案

在MySQL默认的配置下,事务都是自动提交和回滚的。当显示地开启一个事务时,可以使用ROLLBACK语句进行回滚。

数据库锁

了解数据库的锁吗?

参考答案

锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。下面我们以MySQL数据库的InnoDB引擎为例,来说明锁的一些特点。

锁的类型:共享锁,排他锁

数据库在什么情况下会发生死锁?

参考答案

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。

说说数据库死锁的解决办法

参考答案

解决死锁问题最简单的一种方法是超时,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。

数据库优化

5.1 说一说你对数据库优化的理解

参考答案

MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如,通过优化文件系统,提高磁盘I\O的读写速度;通过优化操作系统调度策略,提高MySQL在高负荷情况下的负载能力;优化表结构、索引、查询语句等使查询响应更快。

针对查询,我们可以通过使用索引、使用连接代替子查询的方式来提高查询速度。

针对慢查询,我们可以通过分析慢查询日志,来发现引起慢查询的原因,从而有针对性的进行优化。

针对插入,我们可以通过禁用索引、禁用检查等方式来提高插入速度,在插入之后再启用索引和检查。

针对数据库结构,我们可以通过将字段很多的表拆分成多张表、增加中间表、增加冗余字段等方式进行优化。

介绍一下数据库设计的三大范式

参考答案

目前关系数据库有六种范式,一般来说,数据库只需满足第三范式(3NF)就行了。

1、Spring

Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。

2、SpringMVC

SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等)。

1、SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化XML配置,内置HTTP服务器(Tomcat,Jetty),最终以Java应用程序进行执行。

2、SpringCloud: 是一套目前完整的微服务框架,它是是一系列框架的有序集合。它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过SpringBoot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。

Oracle数据库

浅谈MySQL和Oracle的区别

1、mysql与oracle都是关系型数据库,应用于各种平台。

2、mysql默认端口:3306,默认用户:root;oracle默认端口:1521,默认用户:system,oracle相对来说会麻烦一点,安装所用的空间差别也是很大的

3.mysql的管理工具较少,在Linux下的管理工具的安装有时需要安装额外的包(phpmyadmin,etc),有一定复杂性。 oracle有多重成熟命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。

4.oracle:创建一个数据库,数据库下有好多用户:sys、system、scott等,不同用户下有好多表,一般情况下只创建一个数据库用。

5.数据库中表字段类型: mysql:int、float、double等数值型,varchar、char字符型,date、datetime、time、year、timestamp等日期型。 oracle:number(数值型),varchar2、varchar、char(字符型),date(日期型)等…

springCould

1、什么是Spring Cloud?

答:

Spring cloud 流应用程序启动器是基于Spring Boot的Spring集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

SpringBoot和SpringCloud的区别?

答:

SpringBoot专注于快速方便的开发单个个体微服务。

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。最后再来总结一下,上述几个Spring Cloud核心组件,在微服务架构中,分别扮演的角色:

Spring Cloud核心组件

  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里

  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台

  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

    springCloud 服务间的通信方式有两种

    • RestTemplate 方式

    • Feign 的方式

Spring Boot

参考答案

从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。Spring Boot使用“习惯优于配置”的理念让你的项目快速地运行起来,使用Spring Boot很容易创建一个能独立运行、准生产级别、基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

简而言之,Spring Boot本身并不提供Spring的核心功能,而是作为Spring的脚手架框架,以达到快速构建项目、预置三方配置、开箱即用的目的。Spring Boot有如下的优点:

  • 可以快速构建项目;

  • 可以对主流开发框架的无配置集成;

  • 项目可独立运行,无需外部依赖Servlet容器;

  • 提供运行时的应用监控;

  • 可以极大地提高开发、部署效率;

  • 可以与云计算天然集成。

描述Spring Boot自动装配的过程

参考答案

使用Spring Boot时,我们只需引入对应的Starters,Spring Boot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是Spring Boot的自动配置功能。

说说你对Spring Boot注解的了解

参考答案

@SpringBootApplication注解:

@EnableAutoConfiguration注解:

@Import注解:

@Conditional注解:

@Conditional衍生注解:

Spring

2.1 请你说说Spring的核心是什么

参考答案

Spring框架包含众多模块,如Core、Testing、Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能,而这些功能以及其他模块的功能都是建立在IoC和AOP之上的,所以IoC和AOP是Spring框架的核心。

说一说你对Spring容器的了解

参考答案

Spring主要提供了两种类型的容器:BeanFactory和ApplicationContext。

说一说你对BeanFactory的了解

参考答案

BeanFactory是一个类工厂,与传统类工厂不同的是,BeanFactory是类的通用工厂,它可以创建并管理各种类的对象。

说一说你对Spring IOC的理解

参考答案

IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。

AOP

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方

Spring MVC

3.1 什么是MVC?

参考答案

MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。Model代表的是数据,View代表的是用户界面,Controller代表的是数据的处理逻辑,它是Model和View这两层的桥梁。将软件分层的好处是,可以将对象之间的耦合度降低,便于代码的维护。

DAO层是做什么的?

参考答案

DAO是Data Access Object的缩写,即数据访问对象,在项目中它通常作为独立的一层,专门用于访问数据库。这一层的具体实现技术有很多,常用的有Spring JDBC、Hibernate、JPA、MyBatis等,在Spring框架下无论采用哪一种技术访问数据库,它的编程模式都是统一的。

介绍一下Spring MVC的执行流程

(1)客户端通过url发送请求

(2-3)核心控制器Dispatcher Servlet接收到请求,通过系统或自定义的映射器配置找到对应的handler,并将url映射的控制器controller返回给核心控制器。

(4)通过核心控制器找到系统或默认的适配器

(5-7)由找到的适配器,调用实现对应接口的处理器,并将结果返回给适配器,结果中包含数据模型和视图对象,再由适配器返回给核心控制器

(8-9)核心控制器将获取的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器

(10)核心控制器将结果返回给客户端

参考答案

说一说你知道的Spring MVC注解

参考答案

@RequestMapping:

@RequestParam:

@RequestBody:

@PathVaribale:

介绍一下Spring MVC的拦截器

参考答案

拦截器会对处理器进行拦截,这样通过拦截器就可以增强处理器的功能。Spring MVC中,所有的拦截器都需要实现HandlerInterceptor接口,该接口包含如下三个方法:preHandle()、postHandle()、afterCompletion()。

MyBatis

什么是mybatis

  • MyBatis 是一款优秀的持久层框架

  • 它支持自定义 SQL、存储过程以及高级映射。

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口

mybatis的优缺点

优点:

1.简单易学,容易上手 ,基于sql编程。

2.JDBC相比减少50%以上的代码量,不需要手动开启连接。

3.与各种数据库兼容。

4.提供了许多第三方插件。

5.能够与spring很好的集成。

6.mybatis相当灵活,不会对现有程序影响,sql写在XML中,从程序代码中彻底分离出来,解除了sql与程序耦合,重用

7.提供XML标签,支持编写sql语句。

8.提供映射标签,支持对象与数据库的orm字段关系映射。

缺点

1.框架比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询还得自己写,工作量大,不易修改。

2.二级缓存机制不佳。

3.sql语句依赖数据库,导致数据库移植性差,不能随意更换数据库。

#{}和${}有什么区别

  1. #{} 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符;而${}仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

  2. #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会;而${} 解析之后是什么就是什么,他不会当做字符串处理。

  3. #{} 很大程度上可以防止SQL注入(SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作);而${} 主要用于SQL拼接的时候,有很大的SQL注入隐患。

4.在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。

模糊查询like怎么写

1、使用“${...}”,语法为“like '${...}'”;

2、使用“#{...}”,语法为“like '#{...}'”;

3、使用CONCAT函数连接参数形式,语法为“like CONCAT('%',#{...},'%')”。

Dao接口的工作原理

Dao接口就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名就是映射文件中MappedStatement的id值,接口方法内的参数就是传递给sql的参数。

接口里的方法是不能重载的,因为是全限名+方法名的保存和寻找策略。

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行接口方法所对应的MappedStatement所代表的sql,然后将sql执行结果返回。

Docker

1、什么是Docker?

docker解决了软件环境部署复杂的问题`,对于一个传统的软件工程,开发人员把写好的代码放到服务器上去运行是一件很头疼的事情,因为常常会出现环境不兼容而导致各种各样的bug.比如说,开发是windows系统下编写的代码,放到linux服务器上可能会出问题,开发在本地依赖了一个系统自带的驱动,服务器上却没有这个驱动,开发在本地设置了很多环境变量,服务器上又得重新设置在软件部署的时候,经常会发生在这台机器上可以跑,但是在另一台机器上却运行失败的情况。运维人员需要不断在开发环境和服务器环境之间调试有了docker,只需要简单的几行命令,就可以做到所有运行环境都一致

为什么使用docker

作为一个测试来说,使用docker的主要原因就是用来搭建测试环境

例如:不同的公司使用的环境大不相同

语言 web框架 数据库

3、什么是Docker容器?

Docker容器包括应用程序及所有的依赖项,作为操作系统的独立进程运行。

Docker使用基本信息

1.docker依赖于linux,在windows上安装比较麻烦,所以建议在linux上操作,最好在服务器上部署docker,

2.因为工作中不可能给你台虚拟机去部署环境,都是使用服务器部署环境,安装docker之前,我们需要先有服务器,没有的话需要先去购买云服务器,

3.使用一些连接服务器工具可以连接,如xshell、finalshell、putty等,

  • docker image pull 镜像名称 下载镜像

  • docker image rm image_id(镜像ID) 删除镜像**

  • docker image ls 显示所有的镜像

  • docker container run nginx run运行容器

Redis

Redis是什么

开发的一款内存高速缓存数据库。Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set。Redis的数据是存在内存中的。它的读写速度非常快,因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。

Redis可以用来做什么?

参考答案

  1. Redis最常用来做缓存,是实现分布式缓存的首先中间件;

  2. Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求;

  3. Redis可以作为计算工具,能用很小的代价,统计诸如PV/UV、用户在线天数等数据;

  4. Redis还有很多其他的使用场景,例如:可以实现分布式锁,可以作为消息队列使用。

1.2 Redis和传统的关系型数据库有什么不同?

参考答案

Redis是一种基于键值对的NoSQL数据库,而键值对的值是由多种数据结构和算法组成的。Redis的数据都存储于内存中,因此它的速度惊人,读写性能可达10万/秒,远超关系型数据库。

关系型数据库是基于二维数据表来存储数据的,它的数据格式更为严谨,并支持关系查询。关系型数据库的数据存储于磁盘上,可以存放海量的数据,但性能远不如Redis。

1.3 Redis有哪些数据类型?

参考答案

  1. Redis支持5种核心的数据类型,分别是字符串、哈希、列表、集合、有序集合;

  2. Redis还提供了Bitmap、HyperLogLog、Geo类型,但这些类型都是基于上述核心数据类型实现的;

  3. Redis在5.0新增加了Streams数据类型,它是一个功能强大的、支持多播的、可持久化的消息队列。

1.4 Redis是单线程的,为什么还能这么快?

参考答案

  1. 对服务端程序来说,线程切换和锁通常是性能杀手,而单线程避免了线程切换和竞争所产生的消耗;

  2. Redis的大部分操作是在内存上完成的,这是它实现高性能的一个重要原因;

  3. Redis采用了IO多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。

计算机网络

请介绍七层网络体系结构。

参考回答

  1. 为什么分七层

    支持异构网络的互联互通。

  2. 七层分别负责的内容(功能)

    OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层

请介绍五层网络体系结构。

参考回答

五层网络体系结构分分别为:应用层、运输层、网络层、数据链路层、物理层。各层功能分别如下:

了解网络编程协议吗?客户端发送给服务器的请求,怎么确定具体的协议?

参考回答

了解,客户端发送给服务器端的请求,可以根据统一资源定位系统(uniform resource locator,URL)来确定具体使用的协议。

HTTP, FTP,File,HTTPS

TCP、HTTP、FTP分别属于哪一层?

参考回答

TCP、HTTP、FTP分别属于传输层、应用层、应用层。

讲一下TCP/IP协议。

参考回答

  1. TCP/IP协议定义

    TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

  2. TCP/IP协议组成

    TCP/IP结构模型分为应用层、传输层、网络层、链路层(网络接口层)四层,

linux

*【增】touch*

命令:touch 文件名

示例:在当前目录创建一个名为aa.txt的文件 touch aa.txt

*【删】 rm*

命令:rm -rf 文件名

**【改】 vi或vim* *

*【查】*

文件的查看命令:cat/more/less/tail

Linux添加一个用户

1.创建用户#adduser 名称

2.//修改密码#passwd 名称

New UNIX password: //在这里输入新密码 Retype new UNIX password: //再次输入新密码

3.赋予root权限

Linux里如何查看一个想知道的进程?

参考回答

查看进程运行状态的指令:ps命令。“ps -aux | grep PID”,用来查看某PID进程状态

nux里如何查看带有关键字的日志文件?

参考回答

  1. cat 路径/文件名 | grep 关键词

  2. grep -i 关键词 路径/文件名 (与方法一效果相同,不同写法而已)

说说你对grep命令的了解?

参考回答

grep 命令。强大的文本搜索命令,grep(Global Regular Expression Print) 全局正则表达式搜索。

Linux修改主机名的命令是什么?

参考回答

  1. 如果只需要临时更改主机名,可以使用hostname命令。

2.如果想永久改变主机名,可以使用hostnamectl命令

Linux开机自动执行命令如何实现?

参考回答

  1. 方法 #1 - 使用 cron 任务

2.方法 #2 - 使用 /etc/rc.d/rc.local

6 Linux查看内存的命令是什么?

参考回答

查看内存使用情况的指令

free命令。“free -m”,命令查看内存使用情况。

top命令

top命令。显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等

Linux中压缩文件的命令是什么?

参考回答

Linux中压缩文件与解压文件的命令有:tar命令、gz命令、bz2命令、compress命令、zip命令、unzip命令

Linux查询连接数的命令是什么?

参考回答

  1. netstat

#

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值