mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-01 16:28:03 +08:00
Compare commits
5 Commits
219cea0d3d
...
9af407bc4d
Author | SHA1 | Date | |
---|---|---|---|
|
9af407bc4d | ||
|
d0e70fcbbb | ||
|
3db5f58741 | ||
|
088a4eb040 | ||
|
2e9e3fe193 |
@ -303,8 +303,8 @@ Java 中有三种移位运算符:
|
||||
|
||||

|
||||
|
||||
- `<<` :左移运算符,向左移若干位,高位丢弃,低位补零。`x << 1`,相当于 x 乘以 2(不溢出的情况下)。
|
||||
- `>>` :带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。`x >> 1`,相当于 x 除以 2。
|
||||
- `<<` :左移运算符,向左移若干位,高位丢弃,低位补零。`x << n`,相当于 x 乘以 2 的 n 次方(不溢出的情况下)。
|
||||
- `>>` :带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。`x >> n`,相当于 x 除以 2 的 n 次方。
|
||||
- `>>>` :无符号右移,忽略符号位,空位都以 0 补齐。
|
||||
|
||||
由于 `double`,`float` 在二进制中的表现比较特殊,因此不能来进行移位操作。
|
||||
@ -438,7 +438,8 @@ Java 中有 8 种基本数据类型,分别为:
|
||||
**注意:**
|
||||
|
||||
1. Java 里使用 `long` 类型的数据一定要在数值后面加上 **L**,否则将作为整型解析。
|
||||
2. `char a = 'h'`char :单引号,`String a = "hello"` :双引号。
|
||||
2. Java 里使用 `float` 类型的数据一定要在数值后面加上 **f 或 F**,否则将无法通过编译。
|
||||
3. `char a = 'h'`char :单引号,`String a = "hello"` :双引号。
|
||||
|
||||
这八种基本类型都有对应的包装类分别为:`Byte`、`Short`、`Integer`、`Long`、`Float`、`Double`、`Character`、`Boolean` 。
|
||||
|
||||
|
@ -421,7 +421,7 @@ public void objTest() throws Exception{
|
||||
|
||||
#### 典型应用
|
||||
|
||||
- **常规对象实例化方式**:我们通常所用到的创建对象的方式,从本质上来讲,都是通过 new 机制来实现对象的创建。但是,new 机制有个特点就是当类只提供有参的构造函数且无显示声明无参构造函数时,则必须使用有参构造函数进行对象构造,而使用有参构造函数时,必须传递相应个数的参数才能完成对象实例化。
|
||||
- **常规对象实例化方式**:我们通常所用到的创建对象的方式,从本质上来讲,都是通过 new 机制来实现对象的创建。但是,new 机制有个特点就是当类只提供有参的构造函数且无显式声明无参构造函数时,则必须使用有参构造函数进行对象构造,而使用有参构造函数时,必须传递相应个数的参数才能完成对象实例化。
|
||||
- **非常规的实例化方式**:而 Unsafe 中提供 allocateInstance 方法,仅通过 Class 对象就可以创建此类的实例对象,而且不需要调用其构造函数、初始化代码、JVM 安全检查等。它抑制修饰符检测,也就是即使构造器是 private 修饰的也能通过此方法实例化,只需提类对象即可创建相应的对象。由于这种特性,allocateInstance 在 java.lang.invoke、Objenesis(提供绕过类构造器的对象生成方式)、Gson(反序列化时用到)中都有相应的应用。
|
||||
|
||||
### 数组操作
|
||||
|
@ -5,19 +5,25 @@ tag:
|
||||
- Java并发
|
||||
---
|
||||
|
||||
一个接口可能需要调用 N 个其他服务的接口,这在项目开发中还是挺常见的。举个例子:用户请求获取订单信息,可能需要调用用户信息、商品详情、物流信息、商品推荐等接口,最后再汇总数据统一返回。
|
||||
实际项目中,一个接口可能需要同时获取多种不同的数据,然后再汇总返回,这种场景还是挺常见的。举个例子:用户请求获取订单信息,可能需要同时获取用户信息、商品详情、物流信息、商品推荐等数据。
|
||||
|
||||
如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些接口之间有大部分都是 **无前后顺序关联** 的,可以 **并行执行** ,就比如说调用获取商品详情的时候,可以同时调用获取物流信息。通过并行执行多个任务的方式,接口的响应速度会得到大幅优化。
|
||||
如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些任务之间有大部分都是 **无前后顺序关联** 的,可以 **并行执行** ,就比如说调用获取商品详情的时候,可以同时调用获取物流信息。通过并行执行多个任务的方式,接口的响应速度会得到大幅优化。
|
||||
|
||||

|
||||

|
||||
|
||||
对于存在前后顺序关系的接口调用,可以进行编排,如下图所示。
|
||||
对于存在前后调用顺序关系的任务,可以进行任务编排。
|
||||
|
||||

|
||||
|
||||
1. 获取用户信息之后,才能调用商品详情和物流信息接口。
|
||||
2. 成功获取商品详情和物流信息之后,才能调用商品推荐接口。
|
||||
|
||||
可能会用到多线程异步任务编排的场景(这里只是举例,数据不一定是一次返回,可能会对接口进行拆分):
|
||||
|
||||
1. 首页:例如技术社区的首页可能需要同时获取文章推荐列表、广告栏、文章排行榜、热门话题等信息。
|
||||
2. 详情页:例如技术社区的文章详情页可能需要同时获取作者信息、文章详情、文章评论等信息。
|
||||
3. 统计模块:例如技术社区的后台统计模块可能需要同时获取粉丝数汇总、文章数据(阅读量、评论量、收藏量)汇总等信息。
|
||||
|
||||
对于 Java 程序来说,Java 8 才被引入的 `CompletableFuture` 可以帮助我们来做多个任务的编排,功能非常强大。
|
||||
|
||||
这篇文章是 `CompletableFuture` 的简单入门,带大家看看 `CompletableFuture` 常用的 API。
|
||||
|
Loading…
x
Reference in New Issue
Block a user