Java与Go:基本数据类型

Java 和 Go 在基本数据类型的设计和使用上有着一些显著的差异,本文将从数据范围、内存占用、类型安全性、性能等方面对 Java 和 Go 语言的基本数据类型进行更详细的对比。

1.数字基本类型

Java 提供了六种基本数字数据类型,他们分别是:

  1. 整数类型:byte、short、int、long,分别占用 1、2、4、8 个字节。

  2. 浮点数类型:float、double,分别占用 4、8 个字节。

而Go 语言的基本数字数据类型如下:

1.整数类型:

  • int:根据程序运行平台,可以是32位或64位。

  • uint:无符号整数类型,也根据平台是32位或64位。

  • int8、int16、int32、int64:分别表示8位、16位、32位、64位的有符号整数。

  • uint8、uint16、uint32、uint64:分别表示8位、16位、32位、64位的无符号整数。

  • uintptr:用于存放指针的整数类型,大小足以存放指针的值。

  1. 浮点数类型:
  • float32:单精度浮点数。

  • float64:双精度浮点数。

  1. 字符类型:
  • rune:表示 Unicode 码点的整数类型,32位。

来张表看的更清楚。这里要注意的是java没有无符号数字类型,所有无符号类型在java中没有对应。但是根据取值范围可以推断一下

Go 32bit or 64bit Java
int8/uint8 1 or 1 int8相当于byte
int16/uint16 2 or 2 short/char
int32/uint32 4 or 4 int
int64/uint64 8 or 8 long
byte 1 or 1 无对应,相当于C的uint8
int 4 or 8 会根据机器位数变化,无
float32 4 or 4 float
float64 8 or 8 double
uintptr 4 or 8 同int,无对应
rune 4 or 4 字符,但是中文

2.布尔类型

这个比较简单且相对应

Go 32bit or 64bit Java
bool 1 or 1 boolean

3.字符串类型

众所周知Java将字符串(String)定义为引用数据类型。所以字符串对象的创建通常发生在堆内存中,而不是在栈内存中。这是因为字符串在 Java 中是不可变的,一旦创建就不能被修改,因此将其放在堆内存中使得它们可以被多个引用共享。

而Go语言中,字符串string(注意大小写)为基本数据类型,是一个不可变的字节序列,而字符串的内容是只读的。在 Go 中,字符串创建时亦会在堆上分配内存,而不是在栈上。

不过在Java里面,当你使用字符串字面量创建一个字符串对象时,Java 编译器会检查字符串池(String Pool)以查看是否已经存在相同值的字符串对象。如果池中已经存在相同值的字符串,则返回池中的引用,否则创建一个新的字符串对象并将其添加到池中。

在 Java 中,栈内存主要用于保存基本数据类型的变量和对象的引用,而对象本身则通常存储在堆内存中。所以,当你创建一个字符串对象时,其引用会存储在栈内存中,而字符串对象本身则存储在堆内存中。

在 Go 语言中,没有像 Java 中那样的字符串常量池(String Pool)的概念。在 Java 中,字符串常量池是一种特殊的存储区域,用于存储字符串常量的唯一实例,以便实现字符串的共享。

在 Go 中,字符串常量是可以重复的,它们在内存中并不共享。每次使用字符串常量,都会在内存中创建一个新的字符串对象。这与 Java 的字符串常量池机制不同。我们来看一段代码,用==来比较地址

复制代码
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);
        //true,
        //因为字符串常量池做了优化,两个变量实际指向同一地址。
    }
}

再来看看Go代码

复制代码
package main

import "fmt"

func main() {
  str1 := "hello"
  str2 := "hello"

  // 获取字符串的地址
  addr1 := &str1
  addr2 := &str2

  fmt.Printf("Address of str1: %p\n", addr1)
  fmt.Printf("Address of str2: %p\n", addr2)

  // 比较字符串的地址
  if addr1 == addr2 {
    fmt.Println("Address of str1 and str3 are equal")
  } else {
    fmt.Println("Address of str1 and str3 are not equal")
  }
}
/**
结果是
Address of str1: 0xc00005c250
Address of str2: 0xc00005c260         
Address of str1 and str3 are not equal
*/

3.总结

1.类型安全性:Java 的类型系统更为严格,这意味着开发者必须更加小心地处理类型转换和数据溢出问题。而 Go 语言更加灵活,但需要开发者自行负责类型的正确使用。

2.内存管理:Java 的基本数据类型在内存中的大小是固定的,而 Go 语言的基本数据类型的大小取决于编译器和操作系统的架构。

3.性能:Go 语言通常比 Java 在性能上更加高效,尤其是在处理并发和内存管理方面。

综上所述,Java 和 Go 语言在基本数据类型的设计和使用上有着一些区别,开发者可以根据项目需求和个人喜好选择合适的编程语言和数据类型。多写多练方能熟能生巧,得心应手。

相关推荐
h7ml1 分钟前
查券返利机器人的OCR识别集成:Java Tesseract+OpenCV优化图片验证码的自动解析方案
java·机器人·ocr
野犬寒鸦3 分钟前
从零起步学习并发编程 || 第五章:悲观锁与乐观锁的思想与实现及实战应用与问题
java·服务器·数据库·学习·语言模型
李小白202002026 分钟前
EMMC写入/烧录逻辑
linux·运维·服务器
Volunteer Technology7 分钟前
Sentinel的限流算法
java·python·算法
VX:Fegn08957 分钟前
计算机毕业设计|基于springboot + vue云租车平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
岁岁种桃花儿8 分钟前
SpringCloud从入门到上天:Nacos做微服务注册中心
java·spring cloud·微服务
jdyzzy9 分钟前
什么是 JIT 精益生产模式?它与传统的生产管控方式有何不同?
java·大数据·人工智能·jit
Chasmれ14 分钟前
Spring Boot 1.x(基于Spring 4)中使用Java 8实现Token
java·spring boot·spring
froginwe1114 分钟前
Python 条件语句
开发语言
汤姆yu15 分钟前
2026基于springboot的在线招聘系统
java·spring boot·后端