N 个值得一看的后端代码片段

简介: 三元运算符:坏习惯还是好习惯?最高赞的回答是一个名为Ted Dziuba的老哥说的。为了便于阅读,如果三元组适合一行 80 个字符,我才会使用它。大家好,我是南哥。一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。

点赞再看,Java进阶一大半

三元运算符大家肯定有使用过,国外论坛有这么一个问题:Ternary operator: bad or good practice?三元运算符:坏习惯还是好习惯?

最高赞的回答是一个名为Ted Dziuba的老哥说的。

为了便于阅读,如果三元组适合一行 80 个字符,我才会使用它。

For the sake of readability, I only use a ternary if it fits into one 80-char line.

在这里插入图片描述

大家好,我是南哥。

一个Java学习与进阶的领路人,相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。

⭐⭐本文收录在《Java学习进阶指南》:https://github.com。。

1. 数据类型

1.1 static修饰的变量

本文所有内容在企业考核的笔试题出现频率很高,而且是易错题大家注意下

南友们在玩Java时有没发现,下面这样一个对象,我们即使没有给变量赋值,在创建它后这个变量依旧会有默认值

class A {
   
   
    int a;
}

System.out.println(new A().a);
程序执行结果:
0

有时前端同学要求后端给个默认值0,我们甚至不用动手,Java编译器就把活给干完。

这实际上是Java语言的一个特性,对于实例变量即成员变量,如果是基本数据类型都会有一个默认值。不同的基本类型默认值不同,我们看看以下各种基本类型的默认值。

int a; //0
short b; //0
long c; //0
float d; //0.0
double e; //0.0
boolean f; //false
byte g; //0
char h; //空字符

1.2 自动类型提升

(1)Java中的byte、short、char进行数学计算时都会提升为int类型,很容易忽略的基础知识,南哥慢慢道来。

以下代码的运行正常吗?

byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2;

答案在你意料之中,就是编译报错。

# 报错内容
java: 不兼容的类型: 从int转换到byte可能会有损失

既然byte、short、char进行数学计算时都会提升为int类型,那我们就需要在运行过程中把结果转换成byte类型。正确的做法如下。

b3 = (byte)(b1 + b2);

(2)但假如byte变量是这样的写法,我们给b1和b2都加个final,很神奇,编译不会报错。

final byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2;

这种情况是一个特殊情况,Java编译器会为其进行特殊处理,我们称它为编译时常量表达式的求值。b1、b2、b3都是常量值,b3在编译阶段就会被编译器进行赋值,不会涉及到上面我们提到的数学计算提升为int类型,也就不会编译错误。

(3)但如果是这种情况呢?

final byte b1 = 1; byte b2 = 2, b3;
b3 = b1 + b2;

以上两个byte变量,只有一个final修饰,也就是说对b3赋值运算不能在编译时进行,那这段代码依旧会报错,我们还是需要把结果转换为byte类型。

正确做法如下。

b3 = (byte)(b1 + b2);

1.3 byte溢出

byte类型的数据范围在-128 ~ 127,当这个值超过127会转变成 - 128。为什么呢?

byte i = 127;
System.out.println(++i);
程序执行结果:
-128

byte类型的最大值127在二进制中表示为01111111,当我们对127的值增加1时,每位加1后都会产生进位,导致的结果就是所有的位都会翻转(从01111111变成10000000),而10000000十进制的表示就是-128。

1.4 Bollean赋值

业务开发编写最多就是条件语句了,特别在迭代年代比较旧的老项目,一套接一套的if语句。

既然见识了那么多条件语句,那以下代码的执行结果是什么?

Boolean flag = false;
if (flag = true) {
   
   
    System.out.println("true");
}
else {
   
   
    System.out.println("false");
}

在Java里,条件判断是有赋值的功能,try语句同样也有。此时falg在条件判断里被赋值了。

程序执行结果:
true

2. 程序运算

2.1 类型提升

三元运算符的坑,相信不少南友遇到过。。。我们来看看三元运算符是什么?

Java中的三元运算符是一种简洁的条件表达式工具,其语法格式为:条件 ? 表达式1 : 表达式2。

如果条件为真(true),则表达式的结果是表达式1;如果为假(false),则结果是表达式2

假如是这种情况呢,南哥问:o1最终的数据类型是什么?

Object o1 = true ? new Integer(1) : new Double(2.0);

上面的代码行其实等同于这一行。

Object o1 = true ? new Double(1.0) : new Double(2.0);

三元运算符的一个非常关键的细节就是类型的统一化。Double类型的数据范围更大于Interger类型,所以Java编译器会对值类型进行类型提升,最终把Integer类型提升为Double类型。

2.2 自增问题

下面是南哥编写的两个i++自增的易错问题,面试考核经常出现在笔试题。

(1)南哥第一问:以下代码执行的结果是什么?

int i = 0;
i = i++ + i;
程序执行结果:
1

(2)南哥第二问:以下代码执行的结果是什么?

int i = 0;
i = i++;
System.out.println(i);
程序执行结果:
0

2.3 String对象

我们创建一个String对象,JVM在背后实际上做了很多功夫,String对象在常量池、堆内存都有可能存在。我们具体问题来具体分析下。

(1)以下代码段不包含引用类型,只是单纯的字面量拼接,所以只会创建一个对象存在于常量池中。

String s = "JavaProGuide" + "南哥" + 666;

(2)以下代码段包含了引用类型,一共创建了3个对象,猜对了吗?

String s = "Hello";
s = s + " world!"

"Hello"、" world!"都属于字面量,所以它们都会被加入到Java字符串常量池中。

s + " world!"这么一个代码段涉及了引用类型,所以它在内存里创建了一个新的String对象,并不存在于常量池,而是存在于堆内存里。

(3)以下代码段一共创建了两个对象,分别存在于常量池、堆内存。

首先new对象会把该String对象放到堆内存里,而过程中会先检查常量池是否存在JavaProGuide

String str = new String("JavaProGuide");

戳这,《JavaProGuide》作为一份涵盖Java程序员所需掌握核心知识、面试重点的Java学习进阶指南。

在这里插入图片描述

欢迎关注南哥的公众号:Java进阶指南针。公众号里有南哥珍藏整理的大量优秀pdf书籍!

我是南哥,南就南在Get到你的有趣评论➕点赞➕关注。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关文章
|
7月前
|
XML 存储 前端开发
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容(三)
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容
|
7月前
|
XML JSON 前端开发
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容(二)
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容
|
1月前
|
自然语言处理 关系型数据库 MySQL
PHP编程入门:构建你的第一个网页应用
【10月更文挑战第29天】本文旨在引导初学者步入PHP编程的世界,通过深入浅出的方式介绍PHP的基础知识,并指导读者如何动手实践,搭建一个简单的网页应用。文章不仅涉及PHP代码的编写,还包括了环境配置、项目结构设计以及前后端交互的基本概念。适合对Web开发感兴趣且希望快速入门的朋友阅读。
47 0
|
4月前
|
搜索推荐 关系型数据库 MySQL
PHP编程入门与实战:构建你的第一个动态网页
【8月更文挑战第24天】本文将引导初学者进入PHP编程的世界,从基础概念到实践操作,一步步展示如何使用PHP创建一个简单的动态网页。文章不仅介绍PHP的安装、语法和常用功能,还通过一个实际案例演示如何应用这些知识。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你打开一扇通往Web开发的大门。
|
7月前
|
XML 前端开发 JavaScript
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容(一)
前端网络请求真的搞懂了吗?解密前端参数传递方式,让开发更从容
|
存储 前端开发 JavaScript
前端祖传三件套JavaScript的对象之基础概念的方法
在 JavaScript 中,对象是一个非常重要的数据类型,用于表示一组相关属性和方法。每个对象都有一些方法,这些方法可以是对象自身定义的方法,也可以是从原型链中继承而来的方法。本文将介绍对象方法的概念、分类和使用方法。
67 0
|
前端开发 JavaScript
前端祖传三件套JavaScript的最基础之循环
在前端开发中,JavaScript 作为一门重要的编程语言,是无法绕过的一个基础。而在学习 JavaScript 的时候,了解循环则是其中最为基础、最为关键的部分之一。
91 0
|
设计模式 移动开发 前端开发
😲Review 实战经典:2 种封装风格,你偏爱哪种?
所以大家在后台管理系统项目中遇到的很多问题也都是相似的,代码很值得 review,本篇带来一例(真实)
|
XML Java 数据库
面试项目说实现了一个后端多线程网络服务器框架应该怎样写
面试项目说实现了一个后端多线程网络服务器框架应该怎样写
面试项目说实现了一个后端多线程网络服务器框架应该怎样写
|
JavaScript
JS之用面向对象和传统过程式编程
改写成面向对象时,可先将普通函数变型,再改成面向对象。 普通方法变型 普通方法变型,变型有3个原则 1)尽量不要出现函数嵌套函数 2)可以用全局变量 3)把onload中不是赋值的语句放到单独函数中 如下代码中,完成了普通函数的变型。
104 0
JS之用面向对象和传统过程式编程

热门文章

最新文章