大佬教程收集整理的这篇文章主要介绍了【一起去大厂】面试10多家中大厂后的万字总结——java基础篇(建议收藏),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
⭐欢迎订阅《大厂面试突击》专栏c;面试10多家中大厂总结出的高频面试知识c;仅前50名免费⭐
早晨的阳光和傍晚的落日c;是你努力奔跑的背景色
(不好意思c;让大家久等了c;本来定周日发的c;但感觉有些地方说的不够通俗易懂c;又改了一版)
告诉大家一个消息c;我在7月份又离职了c;离职后我开始疯狂的面试c;一共面了百度、字节、滴滴、美团、陌陌、58同城、汽车之家、元气森林、猿辅导c;掌阅科技c;美术宝、moka等10多家中大厂c;最多的时候一天4面。
面完之后我发现大厂对于算法的重视程度非常之高c;算法题没做出来c;基本就不会再往下问了c;你“八股文”再溜也没有展现的机会。
所以我开始刷leetcodec;每天一道c;放在了《leetcode》专栏里c;趁着还没有收费c;大家可以抓紧订阅一波。
但算法非一日之功可成c;我们的“八股文”也不能落下。
一条根据多家公司的面试检验c;将高频面试题分门别类的总结出来c;包括java基础篇、javaweb篇、集合篇、jvm篇、多线程篇、框架篇、设计模式篇、数据结构篇、网络篇、操作系统篇、mysql篇、redis篇、kafka篇、ES篇、dubbo篇。Spring cloud篇、企业项目篇c;由浅入深c;到时有可能还会增加。
所有文章都会放在《大厂面试突击》专栏里c;以后会收费c;所以请大家现在抓紧订阅。
今天是「Java基础篇」c;很多时候基础都容易被忽略c;但是大厂就爱考基础c;万丈高楼平地起就是这个道理。跟着一条一块学习吧!
相比于逐个知识点的去讲解c;一条更偏向于用面试题的方式呈现c;原因如下:
- 节省时间c;有很多朋友都是面试前临时抱佛脚c;从@H_673_167@Helloworld开始讲c;根本来不及好吗
- 重点突出c;有些东西面试官是不会问的c;也没法问c;暂时就可以不看
- 转换思维c;最重要的一点c;有很多时候这个东西你知道c;但一问就不会c;有没有c;有的评论区扣1
okc;我们看题
你要是没听过这几个东西c;别说你学过Java
java虚拟机c;可以说是核心的核心c;如果你简历上敢写精通jvmc;面试官一定把你问的怀疑人生。
其主要是用来执行java字节码(二进制的形式)的虚拟计算机。运行在操作系统之上的c;与硬件没有任何关系。我们说Java的跨平台特性c;就是靠它实现的。
关于jvmc;有类加载机制c;组成结构c;垃圾回收c;内存调优等问题可以问。
Java Development Kitc;我们学java的第一天就要安装的东西c;其包含包括 Java 运行环境(Java Runtime Envirnmentc;简称 JRE)c;Java 工具(比如 javac、java、javap 等等)c;以及 Java 基础类库(比如 rt.jar)
对c;就是刚刚提到的jrec;他包含运行JAVA程序所必须的环境的集合c;包含JVM标准实现及Java核心类库。
Java内存模型c;一个抽象的概念c;主要在并发编程时用到c;具有原子性c;有序性c;一致性。
我们写好的java代码需要编译成字节码文件才能被计算机执行c;字节码的开头是@H_673_167@CAFFBABE,正好对应Java的图标。
出自美术宝、元气森林
面试官一问这道题你是不是以为他在侮辱你c;太简单了好吗
Java 语言提供了 8 种基本类型c;大致分为 4 类(8位=1字节)
不正确。3.4 是双精度数c;将双精度型(double)赋值给浮点型(float)属于下转型(down-casTingc;也称为窄化)会造成精度损失c;因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。
对于 @H_673_167@short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型c;因此 @H_673_167@s1+1运算结果也是@H_673_167@int型c;需要强制转换类型才能赋值给 @H_673_167@short 型。
@H_673_167@short s1 = 1; s1 += 1;可以正确编译c;因为 @H_673_167@s1+= 1;相当于@H_673_167@s1 = (short(s1 + 1);其中有隐含的强制类型转换。
出自元气森林
当然是可以的c;char类型中存储的是@H_673_167@Unicode编码c;@H_673_167@Unicode编码中是存在中文的c;所以@H_673_167@char自然可以存储汉字c;但是!仅限于@H_673_167@Unicode中存在的汉字。
一个汉字的占两个字节c;一个@H_673_167@Unicode也是占两个字节 c;char存储汉字完全没有问题。
@H_673_167@char是@H_673_167@'u0000'c;可以理解成一个空格。
@H_673_167@Boolean默认是@H_673_167@false。
你都答对了吗?
简单来说c;所有的非基本数据类型都是引用数据类型c;除了基本数据类型对应的引用类型外c;类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型都属于引用类型。
主要有以下区别:
1、存储位置
2、传递方式
看下面两段代码理解
@H_673_167@//基本数据类型作为方法参数被调用 public class @H_118_388@main{ public static void @H_578_399@main(String[] args){ int msg = 100; System.out.println("调用方法前msg的值:n"+ msg); //100 fun(@H_835_383@msg); System.out.println("调用方法后msg的值:n"+ msg); //100 } public static void fun(int temp){ temp = 0; } }
@H_673_167@//引用数据类型作为方法参数被调用 class Book{ String name; double price; public Book(String name,double price){ this.name = name; this.price = price; } public void geTinfo(){ System.out.println("图书名称:"+ name + "c;价格:" + price); } public void setPrice(double price){ this.price = price; } } public class @H_118_388@main{ public static void @H_578_399@main(String[] args){ Book book = new Book("一条IT",66.6); book.geTinfo(); //图书名称:一条ITc;价格:66.6 fun(book); book.geTinfo(); //图书名称:一条ITc;价格:99.9 } public static void fun(Book temp){ temp.setPrice(99.9); } }
出自moka
我们都知道@H_673_167@==操作符用来两个对象的地址是否相同c;即是否是指相同一个对象。
equals()比较的两个对象的值是否相同c;不管是不是一个对象。
但其实object类下的equals()和@H_673_167@==是一样的c;我们用的都是被重写之后的。
三者共同之处:
都是final类,不允许被继承c;所以String每次改变值都会新建一个对象。
StringBuffer是线程安全c;可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理c;但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
一般而言c;单目运算符优先级较高c;赋值运算符优先级较低。算术运算符优先级较高c;关系和逻辑运算符优先级较低。多数运算符具有左结合性c;单目运算符、三目运算符、赋值运算符具有右结合性。
其实java一共分为14个优先级c;很不好记c;也不实用c;记住常用的c;不确定就加括号c;面试官要是追着你问这个c;让他“滚”c;我说的c;耶稣来了都不行。
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | «、»、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 从右向左 |
访问修饰符就是限制变量的访问权限的。
比如你有个“赚钱”的方法c;谁都不想给用c;那就把方法设成@H_673_167@private(私有);
后来你有了老婆孩子c;你想让他们也会赚钱c;就得设置成@H_673_167@default(同一个包);
后来你又有了第二个孩子c;但你发现他不会赚钱的方法c;为啥呢?因为你被绿了(default不支持不同包的子类);
可为了大局c;你还是选择接受这个孩子c;悄悄把方法设置成了@H_673_167@proteced(保护子类c;即使不同包);
后来你老了c;明白了开源才是共赢c;就设置成了@H_673_167@public(公有的);
不知道你听懂了吗c;估计看到被那啥了就不想看了吧c;没关系c;看图(也是绿的)
抽象类:
被abstract修饰的类c;不能创建实例对象。
含有抽象方法的类必须定义为抽象类c;但抽象类中的方法不必须是抽象的。
抽象类中定义抽象方法必须在子类中实现c;如果子类没有实现抽象父类中的所有抽象方法c;那么子类也是抽象类。
接口:
可以说成是抽象类的一种特例c;接口中的所有方法都必须是抽象的。
接口中的方法定义默认为public abstract类型c;接口中的成员变量类型默认为public static final。
区别:
1.抽象类可以有构造方法c;接口中不能有构造方法。
2.抽象类中可以有普通成员变量c;接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法c;接口中的所有方法必须都是抽象的c;不能有非抽象的普通方法。
4.一个类可以实现多个接口c;但只能继承一个抽象类。
具体应用:
接口在系统架构设计方法中发挥着巨大作用c;主要用于定义模块之间的通信契约。
而抽象类在代码实现方面发挥作用c;可以实现代码的重用。
主要意义:
我日常调用方法都是对象.方法c;@H_673_167@static的主要意义就是可以创建独立于具体对象的域变量或者方法。也就是实现即使没有创建对象c;也能使用属性和调用方法!
另一个比较关键的作用就是 用来形成静态代码块以优化程序性能。@H_673_167@static块可以置于类中的任何地方c;可以有多个。在类初次被加载的时候c;会按照@H_673_167@static块的顺序来执行每个@H_673_167@static块c;并且只会执行一次,可以用来优化程序性能
通俗理解:
@H_673_167@static是一个可以让你升级的关键字c;被@H_673_167@static修饰c;你就不再是你了。
@H_673_167@final翻译成中文是“不可更改的c;最终的”c;顾名思义c;他的功能就是不能再修改c;不能再继承。我们常见的@H_673_167@String类就是被@H_673_167@final修饰的。
出自moka
方法的重载和重写都是实现多态的方式c;区别在于前者实现的是编译时的多态性c;而后者实现的是运行时的多态性。
重载:发生在同一个类中c;方法名相同参数列表不同(参数类型不同、个数不同、顺序不同)c;与方法返回值和访问修饰符无关c;即重载的方法不能根据返回类型进行区分
重写:发生在父子类中c;方法名、参数列表必须相同c;返回值小于等于父类c;抛出的异常小于等于父类c;访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。
基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块
代码块执行顺序:静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
最早接触泛型是在集合中c;我们最常用的集合类之一便是List,假如我们想让这个List只放Integer类型的元素c;可以这样创建集合类:
@H_673_167@ List@H_801_1089@<Integer> list = new ArrayList@H_801_1089@<Integer>; List.add(new Integer(11));
我们说Integer是这个集合的泛型c;那如果创建一个Double的类型的呢c;是不是也是可以的c;怎么做到的?
看一些创建时的提示c;@H_673_167@<E>:类型参数是用来表示自定义标识符c;用来传递数据的类型。
泛型的优点:
使用泛型类时指明了数据类型c;赋给其他类型的值会抛出异常c;既不需要向下转型c;也没有潜在的风险。
除了定义泛型类c;还可以定义泛型接口和泛型方法c;使用泛型方法时不必指明参数类型c;编译器会根据传递的参数自动查找出具体的类型。
限制泛型的可用类型:
通过 extends 关键字可以限制泛型的类型
@H_673_167@@H_801_1089@<T extends Yitiao>
泛型代码与JVM:
1.什么是封装
封装又叫隐藏实现。就是只公开代码单元的对外接口c;而隐藏其具体实现。
其实生活中处处都是封装c;手机c;电脑c;电视这些都是封装。你只需要知道如何去操作他们c;并不需要知道他们里面是怎么构造的c;怎么实现这个功能的。
2.如何实现封装
在程序设计里c;封装往往是通过访问控制实现的。也就是刚才提到的访问修饰符。
3.封装的意义
封装提高了代码的安全性c;使代码的修改变的更加容易c;代码以一个个独立的单元存在c;高内聚c;低耦合。
好比只要你手机的充电接口不变c;无论以后手机怎么更新c;你依然可以用同样的数据线充电或者与其他设备连接。
封装的设计使使整个软件开发复杂度大大降低。我只需要使用别人的类c;而不必关心其内部逻辑是如何实现的。我能很容易学会使用别人写好的代码c;这就让软件协同开发的难度大大降低。
封装还避免了命名冲突的问题。
好比你家里有各种各样的遥控器c;但比还是直到哪个是电视的c;哪个是空调的。因为一个属于电视类一个属于空调类。不同的类中可以有相同名称的方法和属性c;但不会混淆。
继承的主要思想就是将子类的对象作为父类的对象来使用。比如王者荣耀的英雄作为父类c;后裔作为子类。后裔有所有英雄共有的属性c;同时也有自己独特的技能。
多态的定义:
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
简单来说c;同样调用攻击这个方法c;后裔的普攻和亚瑟的普攻是不一样的。
多态的条件:
多态的好处:
多态对已存在代码具有可替换性。
多态对代码具有可扩充性。
多态简化对应用软件的代码编写和修改过程c;尤其在处理大量对象的运算和操作时c;这个特点尤为突出和重要。
Java中多态的实现方式:
接口实现
继承父类进行方法重写
同一个类中进行方法重载
反射之中包含了一个“反”的概念c;所以要想解释反射就必须先从“正”开始解释c;一般而言c;当用户使用一个类的时候c;应该先知道这个类c;而后通过这个类产生实例化对象c;但是“反”指的是通过对象找到类。
代码如下:
@H_673_167@public class test1 { public static void @H_578_399@main(String[] args) { String yitiao="yitiaoIT"; System.out.println(yitiao.getClass().getName()); } } // out:java.lang.String
这就是我们使用反射的一个例子c;那么使用反射有什么好处呢?
我们可以通过反射实例化对象c;以前都是说对象都是new出来的c;现在又有了一种新的方式。
这种方式被广泛应用于设计模式中c;比如工厂模式c;代理模式。
Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。但我们是需要回答常用的两个就行。
它允许我们将函数当成参数传递给某个方法c;或者把代码本身当作数据处理。示例:
@H_673_167@public class test1 { public static void @H_578_399@main(String[] args) { ArrayList@H_801_1089@<Object> list = new ArrayList@H_801_1089@<>(); list.add(1); list.add(2); list.add(3); list.forEach(l-> System.out.println(l)); } }
更多的使用需要在实际开发中慢慢练习c;相信我c;你会喜欢用它的。
Java 8 API添加了一个新的抽象称为流Streamc;可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力c;让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流c; 流在管道中传输c; 并且可以在管道的节点上进行处理c; 比如筛选c; 排序c;聚合等。
元素流在管道中经过中间操作的处理c;最后由最终操作得到前面处理的结果。
比如我们想筛选出工资大于10000的职员
@H_673_167@List@H_801_1089@<employee> newList = list.stream().filter(item -> { return item.getSalary().compareTo(new Big@R_262_6221@l(10000)) > 0 ; }).collect(Collectors.toList());
以上就是关于Java基础部分总结出的面试题c;如果哪里有问题c;欢迎大家交流评论!
⭐今天是坚持刷题更文的第25/100天
⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力
⭐更多面试题欢迎关注专栏《大厂面试突击》
为了回馈各位粉丝c;礼尚往来c;给大家准备了一条多年积累下来的优质资源c;包括 学习视频、面试资料、珍藏电子书等
关注博主后评论区留言「资料」或私信@R_616_10425@领取
一定要先关注哦!不然无法发私信!
以上是大佬教程为你收集整理的【一起去大厂】面试10多家中大厂后的万字总结——java基础篇(建议收藏)全部内容,希望文章能够帮你解决【一起去大厂】面试10多家中大厂后的万字总结——java基础篇(建议收藏)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。