java long和java.lang.Long有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java long和java.lang.Long有啥区别?相关的知识,希望对你有一定的参考价值。

1.
long数是基本数据类型,long是引用类型,long又叫
long的包装类
2.
long和long可以互转和互相赋值(自动拆箱装箱)。
3.
看jdk帮助文档可知long含有许多静态工具方法可实现多种数据类型互转。
4.
到底是选择long
还是long这个还得看具体环境,如果你认为这个属性不能为null,那么就用long,因为它默认初值为0l,如果这个字段可以为null,那么就应该选择long。
5.
....
参考技术A Java中数据类型分两种:

1.基本类型:long,int,byte,float,double
2.对象类型:Long,Integer,Byte,Float,Double其它一切java提供的,或者你自己创建的类。

其中Long叫 long的包装类。Integer、Byte和Float也类似,一般包装类的名字首写是数值名的大写开头。

什么是包装类?

在java中有时候的运算必须是两个类对象之间进行的,不充许对象与数字之间进行运算。所以需要有一个对象,这个对象把数字进行了一下包装,这样这个对象就可以和另一个对象进行运算了。
这个Long 就是一个包装类,它包装了一个整数值,然后可以在里面写一些运算符重载的方法使它支持某些运算。这个时候可以赋值:
Long l = new Long(10);
现在变量 l 就是一个对象,不是一个数字。

long是原始数据类型,没有属性方法,只能进行数学运算,Long是long相对应的引用数据类型,它有方法和属性,一个没方法属性,一个有方法属性,这就是它们的区别。
Long定义的变量为一个Long类型的对象;而long定义的变量为一个长整形数值的数值变量。
ID用long还是Long?

hibernate、el表达式等都是包装类型,用Long类型可以减少装箱/拆箱;
在hibernate中的自增的hid在实体中的类型要用Long 来定义而不是long。否则在DWR的匹配过程中会出现Marshallingerror:null的错误提示。

到底是选择Long 还是long这个还得看具体环境,如果你认为这个属性不能为null,那么就用long,因为它默认初值为0,如果这个字段可以为null,那么就应该选择Long。
参考技术B Long
是long类型的包装类
Long
a=10l
相当于Long
a=new
Long(10);
一个是基本数据类型
一个是类实例化对象
一般推荐用Long,方法比较多,实用

ClassCastException:java.math.BigInteger 在连接到 MySQL 时无法转换为 java.lang.Long

【中文标题】ClassCastException:java.math.BigInteger 在连接到 MySQL 时无法转换为 java.lang.Long【英文标题】:ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long on connect to MySQL 【发布时间】:2018-02-18 06:06:52 【问题描述】:

连接到 MySQL 时出现错误(见下文)。

点击here获取代码

我得到这个输出:

run:
Now connecting to databse...

java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1062)
    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3556)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2513)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at dbms_basic.Dbms_Basic.main(Dbms_Basic.java:28)
Caused by: java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
    at com.mysql.jdbc.ConnectionImpl.buildCollationMapping(ConnectionImpl.java:1007)
    ... 15 more
BUILD SUCCESSFUL (total time: 0 seconds)

我该如何解决这个问题?

【问题讨论】:

此外,您的代码链接显示了一些其他错误,并且您发布了一些不同的内容。 这不是实际错误。 【参考方案1】:

您的错误清楚地表明无法进行强制转换,因为 java.math.BigInteger 类实例不是 java.lang.Long 类的实例。

现在的问题是,谁在什么级别进行强制转换,当我们要求 JDBC 驱动程序建立连接时,它在后台做了大量工作,然后才真正将正确的连接工作对象返回给我们。

问题似乎与您的 MySQL 版本和您的 mysql-connector.jar 版本相结合。尝试更新版本的 MySQL Connector/J(有关最新版本,请参阅 https://dev.mysql.com/downloads/connector/j/),例如,如果您使用的是旧版本,请升级到 5.1.47 或 8.0.12。

【讨论】:

Bug#13958793 已在 mysql 连接器上记录并解决。 将连接器的 jar 版本从 5.1.21 更改为 5.1.45 - 成功! 它为我节省了很多时间 这个答案解决了我的问题。谢谢!我还想补充一点,以便轻松了解这个 Maven 命令帮助很大的每个依赖项的版本。 mvn 依赖:tree > tree.txt【参考方案2】:

上述 cmets 中提到的 5.1.45 不存在此问题。可在以下位置下载,

https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.45/

【讨论】:

5.1.47 上测试没有错误,但是出现了关于 SSL 的警告,我必须在 url 连接中包含 useSSL=false 才能摆脱它。【参考方案3】:

您的 MySQL 版本不匹配,可能是最新的 8.0.19,但 MySQL 驱动程序文件较旧的版本可能是 5.1.23,NetBeans IDE 通常可用。要克服这个问题,请从您的 PC download connector/j 5.1.48 zip file 中的此链接下载 mysql-connector-java-5.1.48.jar (4.6MB)

现在右键单击 netbeans IDE 中的项目名称,转到服务,在其中选择“库”,在其中选择“添加库”,然后不要选择可用库(下拉菜单将列出一个 JDBCDriver 文件,其中包含“mysql-connector-java-5.1.23.jar”文件,这是旧版本,这会导致不匹配)。因此,改为单击“创建库”,现在给它您选择的任何名称,然后单击创建按钮,将弹出一个浏览窗口,转到您下载“mysql-connector-java-5.1”的目录.48.zip'文件夹,打开它并选择java jar文件'mysql-connector-java-5.1.48.jar'并点击'ok'。项目树的库文件夹现在将显示添加到库列表(JDK 和 Tomcat)中的 'JDBCDriver-mysql-connector-java-5.1.48.jar'。现在尝试通过单击“运行”按钮再次连接到您的数据库,转到 JSP 链接,您会看到这次您已连接。

【讨论】:

【参考方案4】:

对我来说,更新连接器还不够,我还必须用所有参数完成我的 DriverManager.getConnection() url 参数,即使错误消息没有提到这个问题。

在我的情况下,需要这个参数: "jdbc:mysql://127.0.0.1:3306/database?zeroDateTimeBehavior=convertToNull&amp;serverTimezone=UTC"

连接器:mysql-connector-java-8.0.17.jar mysql版本:8.0.17

在 netbeans 上使用 java。

【讨论】:

【参考方案5】:

另一种方式,因为从mysql更改版本对我不起作用,请帮助其他人:

Long.parseLong(String.valueOf(item[0]);

【讨论】:

【参考方案6】:

当您使用过时/不受支持的 mysql 连接器驱动程序时,这是一个常见问题。如果您使用的是 x86 版本的 Netbeans,您的驱动程序通常会在 Program(x86) 文件夹中找到,而不是在 Program 文件夹中。像这样“C:\Program Files (x86)\MySQL\Connector J 8.0\mysql-connector-java-8.0.23.jar”

【讨论】:

以上是关于java long和java.lang.Long有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]

java.lang.Integer can not be cast to java.lang.Long

Android java.lang.Long 无法转换为 java.lang.String

java.lang.ClassCastException:java.lang.Long 无法在 java 1.6 中转换为 java.lang.Integer

如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;

java.lang.Long 类源码解读