• 冒险村物语
  • 英雄无敌3塔防
  • 驾考家园手游

要成为一个 Java 架构师得学习哪些知识?

2022-03-23

没有一蹴而就的Java架构师,只有苦得一批的Java攻城狮。

首先,成为一个普通的Java程序员,你需要掌握

①Java基础知识

1、JVM、JRE 和 JDK 的区别:

JVM(Java Virtual Machine):java 虚拟机,用于保证 java 的跨平台的特性。

java 语言是跨平台,jvm 不是跨平台的。

JRE(Java Runtime Environment):java 的运行环境,包括 jvm+java 的核心类库。

JDK(Java Development Kit):java 的开发工具,包括 jre+开发工具

2、环境变量 path 和 classpath 的作用是什么?

C:\Program Files (x86)\Java\jre7\bin;C:\Program Files (x86)\Java\jdk1.7.0_72\bin

(1)path 是配置 Windows 可执行文件的搜索路径,即扩展名为.exe 的程序文件所在的目录, 用于指定 DOS 窗口命令的路径。

(2)Classpath 是配置 class 文件所在的目录,用于指定类搜索路径,JVM 就是通过它来寻找该类的 class 类文件的。

3、变量有什么用?为什么要定义变量?什么时候用?

答:变量的作用:用来存储数据。

为什么要定义变量:用来不断的存放同一类型的常量,并可以重复使用

4、&和&&的区别?

答:(1)&&会出现短路,如果可以通过第一个表达式判断出整个表达式的结果,则不继续后面表达式的运算;

只能操作 boolean 类型数据;

(2)&不会出现短路,将整个表达式都运算。既可以操作 boolean 数据还可以操作数。

5、标示符命名规则:

由数字(0-9),大小写英文字母,以及_和$组成。

不能以数字开头。

不能使用关键字来自定义命名。

6、数据类型:

(1)基本数据类型(4 类 8 种):

整数类型:byte、short、int、long

浮点数类型:float、double

字符类型:char

布尔类型:boolean(ture false)

(2)引用数据类型:

接口

数组

7、类型转换

精度从高到低 double float long int short(char) byte

(1)自动类型转换 将一个低精度--- 高精度

(2)强制类型转换 将一个高精度--- 低精度(精度会下降)

8、java 语言的三种技术架构

J2EE:企业版

是为开发企业环境下的应用程序提供的一套解决方案。

该技术体系中包含的技术如 Servlet、Jsp 等,主要针对于 Web 应用程序开发。

J2SE:标准版

是为开发普通桌面和商务应用程序提供的解决方案。

该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发。

2比如 Java 版的扫雷。

J2ME:小型版

是为开发电子消费产品和嵌入式设备提供的解决方案。

该技术体系主要应用于小型电子消费类产品,如手机中的应用程序等。

9、java 的跨平台性:

通过 Java 语言编写的应用程序在不同的系统平台上都可以运行。

跨平台的原因:

只要在需要运行 java 应用程序的操作系统上,先安装一个 Java 虚拟机(JVM Java Virtual Machine)即可。

由 JVM 来负责 Java 程序在该系统中的运行。

10、有符号数据的表示法(次重点)

原码,反码(原码取反),补码(反码+1)。

……

更多Java基础知识点,也可以移步阿里P8高级技术专家的讲座分享《大厂Java高级工程师的求职秘诀》,为大家讲解Java必备基础知识和常考面试题。

②面向对象

1、面向对象思想:

(1)概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对象,强调具备功能的对象;

(2)思想特点:

A:是符合人们思考习惯的一种思想;

B:将复杂的事情简单化了;

C:将程序员从执行者变成了指挥者;

比如我要达到某种结果,我就寻找能帮我达到该结果的功能的对象,如我要洗衣服我就买洗衣机,至于怎么洗我不管。

(3)特征:

封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式

继承: 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

多态: 一个对象在程序不同运行时刻代表的多种状态,父类或者接口的引用指向子类对象

2、类和对象:

类:对现实世界中某类事物的描述,是抽象的,概念上的定义。

对象:事物具体存在的个体。

3:成员变量和局部变量的区别(重点)

(1)作用域

成员变量:针对整个类有效。

局部变量:只在某个范围内有效。(一般指的就是方法,语句体内)

(2)存储位置

成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。

局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。

当方法调用完,或者语句结束后,就自动释放。

(3)初始值

成员变量:有默认初始值。

局部变量:没有默认初始值,使用前必须赋值。

4、匿名对象

(1)匿名对象就是没有名字的对象。是对象的一种简写形式。

(2)应用场景

A:只调用一次类中的方法。

B:可以作为实际参数在方法传递中使用

5、封装:

指隐藏对象的属性和实现细节,仅对外提供公共访问方式;比如电脑机箱、笔记本等

好处:

将变化隔离;

方便使用;

提高复用性;

提高安全性

6、关键字 private:封装在代码中的体现

(1)私有的意思,权限修饰符

(2)用来修饰成员变量和成员函数

(3)用 private 修饰的成员只在本类中有效

(4)私有是封装的一种体现

7、构造方法:

(1)特点:

方法名与类名相同

没有返回类型

没有返回值

(2)作用:构造函数是用于创建对象,并对其进行初始化赋值,对象一建立就自动调用相

对应的构造函数,

(3)构造方法的注意事项:

A:如果一个自定义类没有构造方法,系统会默认给出一个无参构造方法。

B:如果一个自定义类提供了构造方法,那么,系统将不再给出无参构造方法。

这个时候,你可以不使用无参构造方法。

如果你想使用,那么,就必须手动给出无参构造方法。

建议:一般情况下,我们的自定义类都要手动给出无参构造方法。

(4)构造方法和成员方法的区别

A:格式区别

构造方法和类名相同,并且没有返回类型,也没有返回值。

普通成员方法可以任意起名,必须有返回类型,可以没有返回值。

B:作用区别

构造方法用于创建对象,并进行初始化值。

普通成员方法是用于完成特定功能的。

C:调用区别

构造方法是在创建对象时被调用的,一个对象建立,只调用一次相应构造函数

普通成员方法是由创建好的对象调用,可以调用多次

8、构造代码块:

(1)作用:给对象进行初始化,对象一建立就执行,而且优先于构造函数执行

(2)构造代码块和构造函数的区别:

构造代码块是给所有不同对象的共性进行统一初始化

构造函数是给对应的对象进行初始化

9、this 关键字

(1)this 关键字代表本类对象的一个引用,谁调用 this 所在的方法,this 就代表谁

(2)this 的使用场景

A:用于区分同名成员变量和局部变量;

B:在定义函数时,该函数内部要用到调用该函数的对象时,因为此时对象还没建立,故 this 代表此对象

B:构造函数间调用

**这个时候,this(参数)必须作为第一条语句存在。

10、Person p = new Person();在内存中做了哪些事情。

(1)将 Person.class 文件加载进内存中。

(2)如果 p 定义在主方法中,那么,就会在栈空间开辟一个变量空间 p。

(3)在堆内存给对象分配空间。

(4)对对象中的成员进行默认初始化。

(5)对对象中的成员进行显示初始化。

(6)调用构造代码块对对象进行初始化。(如果没有就不执行)

(7)调用构造方法对对象进行初始化。对象初始化完毕。

(8)将对象的内存地址赋值给 p 变量,让 p 变量指向该对象。

③集合框架

1:String 类:字符串(重点)

(1)多个字符组成的一个序列,叫字符串。

生活中很多数据的描述都采用的是字符串的。而且我们还会对其进行操作。

所以,java 就提供了这样的一个类供我们使用。

(2)创建字符串对象

A:String():无参构造

**举例:

String s = new String();

s = "hello";

sop(s);

B:String(byte[] bys):传一个字节数组作为参数 *****

**举例

byte[] bys = {97,98,99,100,101};

String s = new String(bys);

sop(s);

C:String(byte[] bys,int index,int length):把字节数组的一部分转换成一个字符串 *****

**举例

byte[] bys = {97,98,99,100,101};

String s = new String(bys,1,2);

sop(s);

D:String(char[] chs):传一个字符数组作为参数 *****

**举例

char[] chs = {'a','b','c','d','e'};

String s = new String(chs);

sop(s);

E:String(char[] chs,int index,int length):把字符数组的一部分转换成一个字符串 *****

**举例

char[] chs = {'a','b','c','d','e'};

String s = new String(chs,1,2);

sop(s);

F:String(String str):把一个字符串传递过来作为参数

char[] chs = {'a','b','c','d','e'};

String ss = new String(s);

sop(ss);

G:直接把字符串常量赋值给字符串引用对象(最常用) *****

**举例

String s = "hello";

sop(s);

(3)面试题

A:请问 String s = new String("hello");创建了几个对象。

两个。一个"hello"字符串对象,在方法区的常量池;一个 s 对象,在栈内存。

B:请写出下面的结果

String s1 = new String("abc");

String s2 = new String("abc");

String s3 = "abc";

String s4 = "abc";

sop(s1==s2); //false

sop(s1==s3); //false

sop(s3==s4); //true

C:字符串对象一旦被创建就不能被改变。

指的是字符串常量值不改变。

(4)字符串中各种功能的方法

A:判断

**** boolean equals(Object anObject):判断两个字符串的内容是否相同,复写了Object 的方法

**** boolean e(String anotherString):判断两个字符串的内容是否相同,不区分大小写

**** boolean contains(String s):判断一个字符串中是否包含另一个字符串

注意:判断字符串是否包含特殊字符.直接表示为 str.contains(".")

boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束

boolean startsWith(String suffix):测试此字符串是否以指定的前缀开始

boolean isEmpty():测试字符串是否为空

B:获取

***** int length():返回此字符串的长度

***** char charAt(int index):返回指定索引处的 char 值

***** int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。

int indexOf(int ch, int fromIndex):返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。

int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。

int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次

出现处的索引,从指定的索引开始。

*** int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。

int lastIndexOf(int ch, int fromIndex)

返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。

int lastIndexOf(String str)

返回指定子字符串在此字符串中最右边出现处的索引。

int lastIndexOf(String str, int fromIndex)

返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反

向搜索。

***** String substring(int beginIndex) (注意:该方法 substring 的 String 是小写!!!)

返回一个新的字符串,它是此字符串的一个子字符串。

String substring(int beginIndex, int endIndex) (注意该方法的 String 是小写!!!)

返回一个新字符串,它是此字符串的一个子字符串,包含头不包含尾。

C:转换

***** byte[] getBytes():(很常用!)从字符串到字节数组的方法

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

将字符从此字符串复制到目标字符数组。

***** char[] toCharArray():(很常用!)从字符串到字符数组的方法

**** static String copyValueOf(char[] data)

返回指定数组中表示该字符序列的 String。

static String copyValueOf(char[] data, int offset, int count)

返回指定数组中表示该字符序列的 String。

***** static String valueOf(数据类型):把该数据类型的数据转换成字符串。

*** String toLowerCase():把字符串转换成小写

String toUpperCase():把字符串转换成大写

*** 字符串的连接

String concat(String str):将指定字符串连接到此字符串的结尾。

D:替换

String replace(char oldChar, char newChar):用新字符替换旧字符(替换所有)

String replace(String target, String replacement):用新的子串换旧串

E:分割

String[] split(String regex):根据指定的字符串把一个字符串分割成一个字符串数组

F:

String trim():去除字符串的前后空格

G:

int compareTo(String anotherString)

按字典顺序比较两个字符串。

int compareToIgnoreCase(String str)

按字典顺序比较两个字符串,不考虑大小写。

(5)练习

211:模拟登录,给三次机会,并提示还有几次.

默认的用户名和密码为 admin。 区分大小写。

自己从键盘输入用户名和密码。

2:给定一个字符串统计,统计大写字母,小写字母,数字出现的个数.

***注意:不包括特殊字符

从键盘输入一个不包含特殊字符的字符串(只有 26 个字母和 0-9 组成)。

3:给定一个字符串,把它变成首字母大写,其他字母小写的字符串.

从键盘输入一个字符串,全部 26 个字母组成的。

4:子串在整串中出现的次数。

也就是说:获取一个字符串中,指定的字串在该字符串中出现的次数.

例如:

"nbasdnbafllgnbahjnbak" 在这个字符串中,多有个 nba.

5:对字符串中字符进行自然顺序排序。

"basckd"-->"abcdks"

先留做思考内容:

6:两个字符串的最大相同子串。

两个字符串的最大相同子串。

比如:

"sadabcdfghjkl"

werabcdtyu"

2:StringBuffer

(1)字符串的缓冲区,是一个容器。

(2)它和 String 的区别

它是缓冲区可变长度的。

(3)构造方法

StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。

StringBuffer(int num) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。

StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内

容。

(4)常用方法

A:增加数据

**append :添加各种类型的数据

**insert : 在容器指定位置插入各种类型的数据。

B:删除数据

**deleteCharAt : 删除指定位置的字符

**delete 还可以用于清空 StringBuffer 的缓冲区

C:替换

**replace

D:获取

**charAt

E:长度和容量

**length() 元素的个数

**capacity 元素的理论值

F:获取元素的位置

**indexOf

**lastIndexOf

G:截取

**substring(int start)

**substring(int start,int end)

H:反转

**reverse

(5)字符串和 StringBuffer 的转换

String-->StringBuffer 通过构造:

如:StringBuffer sb = new StringBuffer(String str)

StringBuffer--String 通过 toString 方法

如:StringBuffer sb = new StringBuffer();

sb.toString();

3:StringBuilder

和 StringBuffer 的功能是一样的,但是有区别:

StringBuffer(JDK1.0)是线程安全的。

StringBuilder(JDK1.5)不保证线程安全。

一般来说,我们写的程序都是单线程的,所以,用 StringBuilder,效率高。

JDK 版本的升级原则:

A:提高效率

B:提高安全性

C:简化书写

4:基本数据类型的对象包装类

(1)为了更方便的操作每个基本数据类型,java 对其提供了很多的属性和方法供我们使用。

(2)用途:

**将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能操作该数据。

**常用的操作之一:用于基本数据类型与字符串之间的转换。

A:方便操作

B:用于和字符串进行相互转换

(3)基本数据类型和对象类型的对应

byte Byte

short Short

int Integer

long Longfloat Float

double Double

boolean Boolean

char Character

(4)构造方法

字段摘要:

static int MAX_VALUE 值为 2^31-1 的常量,它表示 int 类型能够表示的最大值

static int MIN_VALUE 值为 -2^31 的常量,它表示 int 类型能够表示的最小值

static Class TYPE 表示基本类型 int 的 Class 实例

Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。

Inreger(String s) 注意: s 必 须 是 纯 数 字 的 字 符 串 。 否 则 会 有 异 常

NumberFormatException

(5)几个常用的方法

Integer.toBinaryString();

以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。

Integer.toOctalString();

以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。

Integer.toHexString();

以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。

static int Integer.parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析, 字符串必须是 int 型范围内的数字字符串

static int Integer.parseInt(String s,int basic)

使用第二个参数指定的基数,将字符串参数解析为有符号的整数.

字符串必须是 int 型范围内的数字字符串

short shortValue() 以 short 类型返回该 Integer 的值。

int intValue() 以 int 类型返回该 Integer 的值。

static Integer valueOf(int num) 返回一个表示指定的 int 值的 Integer 实例。

static Integer valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。

static Integer valueOf(String s, int radix)

返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。

(6)类型转换

int -- Integer

int num = 20;

A:Integer i = new Integer(num);

B:Integer i = Integer.valueOf(num);

Integer -- int

Integer i = new Integer(20);

A:int num = i.intValue();

24int -- String

int num = 20;

A:String s = String.valueOf(num);

B:String s = ""+num;

C:String s = Integer.toString(num);

String -- int

String s = "20";

A:int num = Integer.parseInt(s);

B:Integer i = new Integer(s);或者 Integer i = Integer.valueOf(s);

int num = i.intValue();

篇幅有限,需要Java基础知识总结的朋友可以私我【Java】领取。

接下来,你还必须努力成为一名架构师

①增加相关项目经验

作为架构师,真正操盘过项目非常重要。然而大多数人都没有具体的项目经验,连个面试通知都收不到。

然而系统架构坑就坑在,哪怕你是个淘宝双十一订单系统的操盘手,想去面个微博的新鲜事系统架构,哦豁——没做过、经验不通用,一切又得从头再来,而大多数人根本就没有接触多种类型系统的机会。

这里推荐几个市面上比较好上手、可迁移、考察最为频繁的高含金量的系统架构设计项目。

a.电商秒杀系统 - Spring项目实战

实战高并发最好的项目之一,课程是由阿里巴巴资深架构师主讲,负责每年双十一淘宝系统的维护。

课程将带大家解决以下项目难点:

如何解决瞬时大流量高并发? 有限库存,如何防止超卖? 如何保证系统稳定和高可用? 如何防止黄牛和恶意请求? 如何限制用户购买件数? 秒杀系统的代码实现?

关于有限库存,如何防止超卖、如何保证系统稳定和高可用、如何防止黄牛和恶意请求、如何限制用户购买件数、秒杀系统的代码实现等知识点,可以免费体验欧阳老师主讲的电商秒杀系统 - Spring项目实战,老师会在课上有更深入的讲解。

b.Twitter 后端系统 - Django 项目实战

Facebook资深架构师带你从零设计Twitter,6周快速搭建一个P8(L5)水准的项目。

这个课是FB资深架构师主讲,带你还原真实开发环境中的完整流程,按工业化要求产出真正可上线的产品,而不是简单做个demo。

代码量可达10000+,覆盖API设计、联合索引、cache、nosql、灰度发布等知识点,是一节真正的有价值的项目课,而不是放在简历上充数的“花瓶”。

感兴趣的话,也可以去免费试听体验。

c.基于标签的实时短视频推荐系统

近期发现的宝藏,对于目前大火的标签推荐系统进行了介绍。

拥有大厂架构师的思维

以秒杀系统为例,介绍下系统设计的设计思路。

1.从高纬度出发,从整体上思考问题,抓住问题本质

秒杀系统的本质是主要解决两个问题,一个是并发读,一个是并发写。秒杀系统本质上就是一个满足 大并发、 高性能和高可用的分布式系统

2.明确核心架构目标

高性能:秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键

一致性:在大并发操作库存的时候,保证库存的准确性,不能出现超卖和少买的情况

高可用:流量符合预期时肯定要稳定,就是超出预期时也同样不能掉链子,要保证秒杀活动顺利完成。

3.分而治之,逐一击破

系统设计是一个升级打怪的过程,将系统中的问题,分而治之,逐一解决

关于系统设计的具体解决思路,可以去免费试听九章算法的《系统架构设计》。介绍了系统设计的通用分析方法【4S分析法】,还独创了通过coding的方式掌握系统设计知识点的做法,让系统设计像刷题一样有迹可循。

跨部门协作能力

想成为一个高级架构师,不但要有【硬技能】,也需要有与人沟通和交流的软技能。

HR想要招的人是【并肩作战伙伴】,而不是【互相比拼的对手】,作为架构师就要有一定的管理能力,这时候沟通、协作能力尤为重要。

面试中想招的,一定是在同等条件下“最顺眼的”。

作为一位架构师,你还需要对前端、后端、产品等岗位需要掌握的知识有一定了解,这里就不赘述了。

算法的精进

作为一名架构师,让自己的代码易读,易维护,不易错是基本要求。

拥有好的代码质量,会让面试官在心里为你默默加分。如果质量很差,面试官会在心里为你默默扣分,最终是否导致 Hire / No Hire,就是一个量变引起质变的问题。

而架构师属于“高级别”的程序员,更是要时刻注意代码质量。

FB资深架构师、ACM金牌选手令狐冲分享了提升代码质量的12个技巧,感兴趣的朋友也可以去他的春招公益讲座上免费体验一下~

看到这里,你会发现想从一个普通码农变成架构师的道路实在太长、太复杂、太难了。不但需要时间的积累,也需要技能的精进。

愿看到这里的人,都能朝着一位优秀的架构师方向迈进。

人气推荐

知识阅读

精彩推荐

  • 游戏
  • 软件
查看更多>>