long相关知识
-
Long == Long 有趣的现象描述 首先,这里应该声明一下,Long等对象类型判断是否相等,采用Long == Long这种形式是错误的。 可以采用以下方式: Long left = 100L; Long right = 100L; // 方法1: System.out.println(left.doubleValue() == right.doubleValue()); // 方法2: System.out.println(left.compareTo(right)); 输出结果: true 0 实验1 如果你亲自操刀,动手做了以下实验,也许你会突然得到一个让你困惑的结果: Long left = 100L; Long right = 100L; System.out.println
-
Java 中 long 是不是原子操作?Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗? JVM中对long的操作是不是原子操作? 首先,通过一段程序对long的原子性进行判断。测试程序如下: public class LongAtomTest implements Runnable { private static long field = 0; private volatile long value; public long getValue() { return value; } public void setValue(long value
-
解决前后端交互Long类型精度丢失问题雪花算法ID,对应的后端Long类型,前端number类型,它们的精度不一样,导致精度丢失现象雪花算法得到的ID较长,传到前端后,精度丢失库中:23754851322302474后端:23754851322302474前端:23754851322302470解决方法将Long类型转成String,再传给前端方法一:单个注解@JsonSerialize(using= ToStringSerializer.class) private Long id;方法二:统一配置package com.jiawa.wiki.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.spring
-
Java中的 Switch 是如何支持 String 的?为什么不支持 long?我们知道 Java Switch 支持byte、short、int 类型,在 JDK 1.5 时,支持了枚举类型,在 JDK 1.7 时,又支持了 String类型。那么它为什么就不能支持 long 类型呢,明明它跟 byte、short、int 一样都是数值型,它又是咋支持 String 类型的呢? 一、结论 不卖关子,先说结论: switch 底层是使用 int 型 来进行判断的,即使是枚举、String类型,最终也是转变成 int 型。由于 long 型表示范围大于 int 型,因此不支持 long 类型。 下面详细介绍下各个类型是如何被
long相关课程
long相关教程
- 2. 方法介绍 方法作用 objectFieldOffset(Field) 返回指定的变量在所属类中的内存偏移地址,该偏移地址仅仅在该 UnSafe 函数中访问指定字段时使用。arrayBaseOffset(Class) 获取取数组中第一个元系的地址。arrayIndexScale(Class) 获取数组中一个元素占用的字节。compareAndSwapLong(Object,long,long,long) 比较对象 obj 中偏移量为 offset 的变量的值是否与 expect 相等,相等则使用 update 值更新,然后返回 true,否则返回 false。longgetLongvolatile(Object,long) 获取对象 obj 中偏移量为 offset 的变量对应 volatile 语义的值。void putLongvolatile(Object,long,long) 设置 obj 对象中 offset 偏移的类型为 long 的 field 的值为 value, 支持 volatile 语义。putOrderedLong(Object,long,long) 设置 obj 对象中 offset 偏移地址对应的 long 型 field 的值为 value。这是一个有延迟的 putLongvolatile 方法,并且不保证值修改对其他线程立刻可见。只有在变量使用 volatile 修饰并且预计会被意外修改时才使用该方法。unpark(Object) 唤醒调用 park 后阻塞的线程。
- 4.6 数据访问接口实现 数据访问接口的位置已经在配置类指定,首先在 com.imooc.springbootmultidb.mapper1 创建 OrderDao ,操作的是数据源 1 中的 order 表。实例:/** * 数据访问接口 */@Repositorypublic interface OrderDao { public int insert(OrderDo order);}然后在 com.imooc.springbootmultidb.mapper2 创建 ErpOrderDao ,操作的是数据源 2 中的 erporder 表。实例:/** * 数据访问接口 */@Repositorypublic interface ErpOrderDao { public int insert(ErpOrderDo erpOrder);}这两个接口中使用的数据对象比较简单,代码如下:实例:/** * 订单数据类 */public class OrderDo { /** * 订单id */ private Long id; /** * 商品id */ private Long goodsId; /** * 购买数量 */ private Long count; // 省略 get set}/** * ERP订单数据类 */public class ErpOrderDo { /** * 订单id */ private Long id; /** * 商城系统订单id */ private Long outId; /** * 商品id */ private Long goodsId; /** * 购买数量 */ private Long count; // 省略 get set}
- C 语言中的类型转换 我们在前面学习了 C 语言的数据类型,那么变量在参与运算的时候类型是始终如一不变的吗?带着这个疑问,我们可以先看一个例子:#include <stdio.h>#define typename(x) _Generic((x), /* Get the name of a type */ \ \ _Bool: "_Bool", unsigned char: "unsigned char", \ char: "char", signed char: "signed char", \ short int: "short int", unsigned short int: "unsigned short int", \ int: "int", unsigned int: "unsigned int", \ long int: "long int", unsigned long int: "unsigned long int", \long long int: "long long int", unsigned long long int: "unsigned long long int", \ float: "float", double: "double", \ long double: "long double", char *: "pointer to char", \ void *: "pointer to void", int *: "pointer to int", \ default: "other")int main(){ int a=1,b=2; float c=3.14159,d=0; printf("a type: %s, b type: %s, c type: %s, d type: %s\n",typename(a),typename(b),typename(c),typename(d)); a=b+c; printf("a=b+c, a=%d\n",a); printf("type (b+c): %s\n",typename(b+c)); d=b+c; printf("d=b+c, d=%f\n",d); return 0;}经过编译运行后得到如下的结果:Tips:有关如何编译运行的内容请参考前面的章节。Tips:同时值得注意的是,这个程序中的 _Generic 来自于 C11 标准中,所以在你之前可能看到的 C 语言的书籍中是没有的。请大家不要使用过于古老的编译器,请使用推荐的较新的编译器。也就是支持 C11 以上标准的编译器。具体情况可以参照你们所选择的编译器的手册。或者直接选择 GCC 7 及更新版本的编译器。a type: int, b type: int, c type: float, d type: floata=b+c, a=5type (b+c): floatd=b+c, d=5.141590这里面的 a, b 变量为整形,而 c 和 d 都是浮点型。那么当一个整形和一个浮点型相加的时候会发生什么呢?这就是我们今天要介绍的内容。
- 4.4 开发数据对象类 开发 goods 表对应的数据对象类 GoodsDo ,代码如下:实例:/*** 商品类*/public class GoodsDo { /** * 商品id */ private Long id; /** * 商品名称 */ private String name; /** * 商品库存 */ private Long num; // 省略 get set}然后开发 order 表对应的数据对象类 OrderDo,代码如下:实例:/** * 订单类 */public class OrderDo { /** * 订单id */ private Long id; /** * 商品id */ private Long goodsId; /** * 购买数量 */ private Long count; // 省略 get set}
- 4.1 MediaPlayer 的使用 首先看看 MainActivity:package com.emercy.myapplication;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.Button;import android.widget.SeekBar;import android.widget.TextView;import android.widget.Toast;import java.util.concurrent.TimeUnit;public class MainActivity extends Activity { private Button b1, b2, b3, b4; private MediaPlayer mediaPlayer; private double startTime = 0; private double finalTime = 0; private Handler myHandler = new Handler(); private int forwardTime = 5000; private int backwardTime = 5000; private SeekBar seekbar; private TextView tx1, tx2, tx3; public static int oneTimeOnly = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1 = (Button) findViewById(R.id.button); b2 = (Button) findViewById(R.id.button2); b3 = (Button) findViewById(R.id.button3); b4 = (Button) findViewById(R.id.button4); tx1 = (TextView) findViewById(R.id.textView2); tx2 = (TextView) findViewById(R.id.textView3); tx3 = (TextView) findViewById(R.id.textView4); mediaPlayer = MediaPlayer.create(this, R.raw.video); seekbar = (SeekBar) findViewById(R.id.seekBar); seekbar.setClickable(false); b2.setEnabled(false); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int) startTime; if ((temp + forwardTime) <= finalTime) { startTime = startTime + forwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(), "前进5秒", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "前方还剩不到5秒", Toast.LENGTH_SHORT).show(); } } }); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Pausing sound", Toast.LENGTH_SHORT).show(); mediaPlayer.pause(); b2.setEnabled(false); b3.setEnabled(true); } }); b3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "音频播放", Toast.LENGTH_SHORT).show(); mediaPlayer.start(); finalTime = mediaPlayer.getDuration(); startTime = mediaPlayer.getCurrentPosition(); if (oneTimeOnly == 0) { seekbar.setMax((int) finalTime); oneTimeOnly = 1; } tx2.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) finalTime))) ); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) startTime))) ); seekbar.setProgress((int) startTime); myHandler.postDelayed(UpdateSongTime, 100); b2.setEnabled(true); b3.setEnabled(false); } }); b4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int temp = (int) startTime; if ((temp - backwardTime) > 0) { startTime = startTime - backwardTime; mediaPlayer.seekTo((int) startTime); Toast.makeText(getApplicationContext(), "后退5秒", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "后方还剩不到5秒", Toast.LENGTH_SHORT).show(); } } }); } private Runnable UpdateSongTime = new Runnable() { public void run() { startTime = mediaPlayer.getCurrentPosition(); tx1.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) startTime), TimeUnit.MILLISECONDS.toSeconds((long) startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS. toMinutes((long) startTime))) ); seekbar.setProgress((int) startTime); myHandler.postDelayed(this, 100); } };}通过MediaPlayer.create(this, R.raw.video)创建一个 MediaPlayer 对象并初始化媒体流地址,然后分别设置几个控制 Button 的监听事件,实现播放器的前进、后退、播放、暂停操作,当中还有一个UpdateSongTime的 Runnable 变量,用来每隔 100 毫秒更新一次播放进度,实现播放进度的同步刷新。
- 4. JDK8 新增的函数 方法作用 getAndSetLong(Object, long, long) 获取对象 obj 中偏移量为 offset 的变量 volaile 语义的当前值,并设置变量 volaile 语义的值为 update。getAndAddLong(Object,long,long) 方法获取 object 中偏移量为 offset 的 volatile 变量的当前值,并设置变量值为原始值加上 addValue
long相关搜索
-
label
labelfor
label标签
lambda
lambda表达式
lamda
lang
last
latin
latin1
layers
layui
leave
left
leftarrow
legend
length
lengths
length函数
less