三笠信息网

最后 今天是坚持刷题更文的第25/100天 各位的点赞、关注、

简介: 最后 今天是坚持刷题更文的第25/100天 各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力 更多面试题欢迎关注专栏《大厂面试突击》 为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包

欢迎订阅《大厂面试突击》专栏,面试10多家中大厂总结出的高频面试知识,仅前50名免费 早晨的阳光和傍晚的落日,是你努力奔跑的背景色 前言哈喽,大家好,我是一条。

(不好意思,让大家久等了,本来定周日发的,但感觉有些地方说的不够通俗易懂,又改了一版)告诉大家一个消息,我在7月份又离职了,离职后我开始疯狂的面试,一共面了、字节、滴滴、美团、陌陌、58同城、汽车之家、元气森林、猿辅导,掌阅科技,美术宝、moka等10多家中大厂,最多的时候一天4面。

面完之后我发现大厂对于算法的重视程度非常之高,算法题没做出来,基本就不会再往下问了,你“八股文”再溜也没有展现的机会。

但算法非一日之功可成,我们的“八股文”也不能落下。

Spring cloud篇、企业项目篇,由浅入深,到时有可能还会增加。

目前一条已经入职新的公司,至于是哪家大家可以猜一下,留个悬念。

目前的工作氛围和待遇都非常好,新团队,不卷,有兴趣小伙伴也可以私信我,还在招人中。

文章目录 前言 题目合集 JVM、JDK、JRE、JMM什么区别 JVM JDK JRE JMM 字节码 Ja有几种数据类型,占多少字节?

char和boolean的默认值是多少?

泛型 如何理解封装,继承,多态?

Lambda表达式 stream 最后 题目合集 相比于逐个知识点的去讲解,一条更偏向于用面试题的方式呈现,原因如下: 节省时间,有很多朋友都是面试前临时抱佛脚,从helloworld开始讲,根本来不及好吗 重点突出,有些东西面试官是不会问的,也没法问,暂时就可以不看 转换思维,最重要的一点,有很多时候这个东西你知道,但一问就不会,有没有,有的评论区扣1 ok,我们看题 JVM、JDK、JRE、JMM什么区别 你要是没听过这几个东西,别说你学过Ja JVMja虚拟机,可以说是核心的核心,如果你简历上敢写精通jvm,面试官一定把你问的怀疑人生。

运行在操作系统之上的,与硬件没有任何关系。

我们说Ja的跨平台特性,就是靠它实现的。

JDKJa Development Kit,我们学ja的第一天就要安装的东西,其包含包括 Ja 运行环境(Ja Runtime Envirnment,简称 JRE),Ja 工具(比如 jac、ja、jap 等等),以及 Ja 基础类库(比如 rt.jar)JRE对,就是刚刚提到的jre,他包含运行JA程序所必须的环境的集合,包含JVM标准实现及Ja核心类库。

字节码我们写好的ja代码需要编译成字节码文件才能被计算机执行,字节码的开头是CAFFBABE,正好对应Ja的图标。

出自美术宝、元气森林 面试官一问这道题你是不是以为他在侮辱你,太简单了好吗 但是,千万不要轻敌,简单题,我们要回答的流畅,深刻 Ja 语言了 8 种基本类型,大致分为 4 类(8位=1字节)整数型 byte - 1字节 short - 2字节 int - 4字节 long - 8字节,赋值时一般在数字后加上 l 或 L 浮点型 float - 4字节,直接赋值时必须在数字后加上 f 或 F double - 8字节,赋值时一般在数字后加 d 或 D 字符型 char - 2字节,存储 Unicode 码,用单引号赋值 布尔型 boolean - 1字节,只有 true 和 false 两个取值,一个字节就够了 挺简单哈,回答的不错,关于这道题,还能追问什么呢?

3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。

short s1 = 1; s1 = s1 + 1;有错吗?对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1运算结果也是int型,需要强制转换类型才能赋值给 short 型。

short s1 = 1; s1 += 1;有错吗short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于s1 = (short(s1 + 1);其中有隐含的强制类型转换。

出自元气森林当然是可以的,char类型中存储的是Unicode编码,Unicode编码中是存在中文的,所以char自然可以存储汉字,但是!

一个汉字的占两个字节,一个Unicode也是占两个字节 ,char存储汉字完全没有问题。

简单来说,所有的非基本数据类型都是引用数据类型,除了基本数据类型对应的引用类型外,类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型都属于引用类型。

主要有以下区别:1、存储位置基本变量类型在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的 引用数据类型变量其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址 2、传递方式基本数据类型是按值传递 引用数据类型是按引用传递 看下面两段代码理解//基本数据类型作为方法参数被调用public class Main{ public static void main(String[] args){ int msg = 100; System.out.println("调用方法前msg的值:\n"+ msg); //100 fun(msg); System.out.println("调用方法后msg的值:\n"+ msg); //100 } public static void fun(int temp){ temp = 0; }}//引用数据类型作为方法参数被调用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 + ",价格:" + price); } public void setPrice(double price){ this.price = price; }}public class Main{ public static void main(String[] args){ Book book = new Book("一条IT",66.6); book.getInfo(); //图书名称:一条IT,价格:66.6 fun(book); book.getInfo(); //图书名称:一条IT,价格:99.9 } public static void fun(Book temp){ temp.setPrice(99.9); }}==和equals()有什么区别出自moka我们都知道==操作符用来两个对象的地址是否相同,即是否是指相同一个对象。

equals()比较的两个对象的值是否相同,不管是不是一个对象。

但其实object类下的equals()和==是一样的,我们用的都是被重写之后的。

三者共同之处:都是final类,不允许被继承,所以string每次改变值都会新建一个对象。

StringBuffer是线程安全,可以不需要额外的同步用于多线程中;StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

位运算 这块可能不会直接问你,但做算法题会有奇效,所以不能不会。

^(亦或运算) ,针对二进制,相同的为0,不同的为1 &(与运算),针对二进制,只要有一个为0,就为0 <<(向左位移),针对二进制,转换成二进制后向左移动3位,后面用0补齐 >>(向右位移), 针对二进制,转换成二进制后向右移动3位 >>>(无符号右移) 无符号右移,忽略符号位,空位都以0补齐。

>>>与>>唯一的不同是它无论原来的最左边是什么数,统统都用0填充,正数做>>>运算的时候和>>是一样的。

区别在于负数运算 运算符优先级一般而言,单目运算符优先级较高,赋值运算符优先级较低。

其实ja一共分为14个优先级,很不好记,也不实用,记住常用的,不确定就加括号,面试官要是追着你问这个,让他“滚”,我说的,耶稣来了都不行。

因为你被绿了(default不支持不同包的子类);可为了大局,你还是选择接受这个孩子,悄悄把方法设置成了proteced(保护子类,即使不同包);后来你老了,明白了开源才是共赢,就设置成了public(公有的);不知道你听懂了吗,估计看到被那啥了就不想看了吧,没关系,看图(也是绿的)如何理解接口和抽象类?

抽象类:被abstract修饰的类,不能创建实例对象。

含有抽象方法的类必须定义为抽象类,但抽象类中的方法不必须是抽象的。

抽象类中定义抽象方法必须在子类中实现,如果子类没有实现抽象父类中的所有抽象方法,那么子类也是抽象类。

接口:可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。

接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

区别:1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

具体应用:接口在系统架构设计方法中发挥着巨大作用,主要用于定义模块之间的通信契约。

而抽象类在代码实现方面发挥作用,可以实现代码的重用。

如何理解static关键字主要意义:我日常调用方法都是对象.方法,static的主要意义就是可以创建独立于具体对象的域变量或者方法。

另一个比较关键的作用就是 用来形成静态代码块以优化程序性能。

static块可以置于类中的任何地方,可以有多个。

在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次,可以用来优化程序性能通俗理解:static是一个可以让你升级的关键字,被static修饰,你就不再是你了。

如何理解final关键字 final翻译成中文是“不可更改的,最终的”,顾名思义,他的功能就是不能再修改,不能再继承。

将类、方法、变量声明为final能够提高性能,这样JVM就有机会进行估计,然后优化。

按照Ja代码惯例,final变量就是常量,而且通常常量名要大写: final关键字可以用于成员变量、本地变量、方法以及类。

final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。

接口中声明的所有变量本身是final的。

final和abstract这两个关键字是反相关的,final类就不可能是abstract的。

重写和重载出自moka 老生常谈的问题,除了答出定义,更应该说明他们的区别和应用 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

重载:发生在同一个类中,方法名相同参数列表不同(参数类型不同、个数不同、顺序不同),与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏代换原则);如果父类方法访问修饰符为private则子类中就不是重写。

基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块代码块执行顺序:静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器泛型 泛”就是宽泛,泛指的意思,所谓泛型就是不指定具体类型,而是作为参数传递。

最早接触泛型是在集合中,我们最常用的集合类之一便是List,假如我们想让这个List只放Integer类型的元素,可以这样创建集合类:List list = new ArrayList;List.add(new Integer(11));我们说Integer是这个集合的泛型,那如果创建一个Double的类型的呢,是不是也是可以的,怎么做到的?

看一些创建时的提示,:类型参数是用来表示自定义标识符,用来传递数据的类型。

泛型的优点:使用泛型类时指明了数据类型,赋给其他类型的值会抛出异常,既不需要向下转型,也没有潜在的风险。

除了定义泛型类,还可以定义泛型接口和泛型方法,使用泛型方法时不必指明参数类型,编译器会根据传递的参数自动查找出具体的类型。

限制泛型的可用类型:通过 extends 关键字可以限制泛型的类型泛型代码与JVM:虚拟机中没有泛型,只有普通类和方法。

在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。

(类型擦除) 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。

如何理解封装,继承,多态?

就是只公开代码单元的对外接口,而隐藏其具体实现。

你只需要知道如何去操作他们,并不需要知道他们里面是怎么构造的,怎么实现这个功能的。

2.如何实现封装在程序设计里,封装往往是通过访问控制实现的。

3.封装的意义封装提高了代码的安全性,使代码的修改变的更加容易,代码以一个个独立的单元存在,高内聚,低耦合。

好比只要你手机的充电接口不变,无论以后手机怎么更新,你依然可以用同样的数据线充电或者与其他设备连接。

我只需要使用别人的类,而不必关心其内部逻辑是如何实现的。

好比你家里有各种各样的遥控器,但比还是直到哪个是电视的,哪个是空调的。

不同的类中可以有相同名称的方法和属性,但不会混淆。

后裔有所有英雄共有的属性,同时也有自己独特的技能。

(发送消息就是函数调用)简单来说,同样调用攻击这个方法,后裔的普攻和亚瑟的普攻是不一样的。

多态的条件:要有继承 要有重写 父类引用指向子类对象 多态的好处:多态对已存在代码具有可替换性。

它在应用中体现了灵活多样的操作,提高了使用效率。

多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

Ja中多态的实现方式: 接口实现 继承父类进行方法重写 同一个类中进行方法重载 如何理解Ja反射?

反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是“反”指的是通过对象找到类。

代码如下:public class test1 { public static void main(String[] args) { String yitiao="yitiaoIT"; System.out.println(yitiao.getClass().getName()); }}// out:ja.lang.String这就是我们使用反射的一个例子,那么使用反射有什么好处呢?

反射的意义我们可以通过反射实例化对象,以前都是说对象都是new出来的,现在又有了一种新的方式。

Ja 8是Ja自Ja 5(发布于2004年)之后的最重要的版本。

示例:public class test1 { public static void main(String[] args) { ArrayList list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.forEach(l-> System.out.println(l)); }}更多的使用需要在实际开发中慢慢练习,相信我,你会喜欢用它的。

streamJa 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来一种对 Ja 集合运算和表达的高阶抽象。

Stream API可以极大提高Ja程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

比如我们想筛选出工资大于10000的职员List newList = list.stream().filter(item -> { return item.getSalary().compareTo(new BigDecimal(10000)) > 0 ; }).collect(Collectors.toList());以上就是关于Ja基础部分总结出的面试题,如果哪里有问题,欢迎大家交流评论!

最后 今天是坚持刷题更文的第25/100天 各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力 更多面试题欢迎关注专栏《大厂面试突击》 为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等关注博主后评论区留言「资料」或私信我就可以领取一定要先关注哦!


以上是文章"

最后 今天是坚持刷题更文的第25/100天 各位的点赞、关注、

"的内容,欢迎阅读三笠信息网的其它文章