深入探索Java开发世界:Java基础~类型分析大揭秘

在这里插入图片描述

文章目录

    • 一、基本数据类型
    • 二、封装类型
    • 三、类型转换
    • 四、集合类型
    • 五、并发类型

Java基础知识,类型知识点梳理~

一、基本数据类型

Java的基本数据类型是语言的基础,它们直接存储在栈内存中,具有固定的大小和不变的行为。

八种基本数据类型的具体分析

  1. byte(字节型)

    • 大小: 8-bit == 1-byte
    • 取值范围: -128 ~ 127
    • 默认值: 0
    • 使用场景:
      • 节省内存: 在大数组中存储数据时,使用byte可以有效节省内存空间。例如,处理大型文件或图像数据。
      • 网络通信: 在网络传输协议中,通常以字节为单位进行数据传输。
  2. short(短整型)

    • 大小: 16-bit == 2-byte
    • 取值范围: -32,768 ~ 32,767
    • 默认值: 0
    • 使用场景:
      • 内存受限场景: 在需要存储大量小整数且内存受限的情况下,如游戏开发中存储地图坐标。
  3. int(整型)

    • 大小: 32-bit == 4-byte
    • 取值范围: -2^31 ~ 2^31-1
    • 默认值: 0
    • 使用场景:
      • 常规整数运算: 最常用的整数类型,适合绝大多数计算场景,如计数器、循环变量、数组索引等。
      • 位运算: 常用于位运算操作,如位掩码和位图。
  4. long(长整型)

    • 大小: 64-bit == 8-byte
    • 取值范围: -2^63 ~ 2^63-1
    • 默认值: 0L
    • 使用场景:
      • 大整数计算: 适用于需要存储大范围整数的场景,如时间戳(System.currentTimeMillis()返回的值)、大规模数据处理中的ID生成。
      • 金融计算: 存储货币金额(通常以分为单位),避免浮点数带来的精度问题。
  5. float(浮点型)

    • 大小: 32-bit == 4-byte
    • 取值范围: 约 ±3.40282347E+38F (6-7 个有效十进制数字)
    • 默认值: 0.0f
    • 使用场景:
      • 图形处理: 在计算机图形学、游戏开发中用于表示坐标、颜色值等。
      • 简单科学计算: 适用于对精度要求不高的科学计算。
  6. double(双精度浮点型)

    • 大小: 64-bit == 8-byte
    • 取值范围: 约 ±1.79769313486231570E+308 (15 个有效十进制数字)
    • 默认值: 0.0d
    • 使用场景:
      • 高精度科学计算: 适用于需要高精度的计算,如物理模拟、统计分析、机器学习算法等。
      • 金融计算: 如果不涉及严格的货币计算场景,可以用于财务分析、汇率转换等。
  7. char(字符型)

    • 大小: 16-bit == 2-byte
    • 取值范围: 0 ~ 65,535 (表示单个Unicode字符)
    • 默认值: ‘\u0000’
    • 使用场景:
      • 字符处理: 用于表示单个字符,如在字符串处理中对单个字符的操作。
      • 字符编码: 在处理字符编码转换时,暂存单个字符。
  8. boolean(布尔型)

    • 大小: 实际大小依赖于JVM实现(通常使用1-bit,但实际存储可能更大)
    • 取值范围: true 或 false
    • 默认值: false
    • 使用场景:
      • 逻辑判断: 用于条件控制,如if语句、循环控制、标志位等。
      • 状态表示: 表示对象的某种状态,如开关状态、运行状态等。

二、封装类型

封装类型为每种基本数据类型提供了一个对应的类,使得基本数据类型具有了对象的特性,可以调用对象方法和利用面向对象的特性。

Java的封装类型包括以下八种

  1. Byte --> byte
  2. Short --> short
  3. Integer --> int
  4. Long --> long
  5. Float --> float
  6. Double --> double
  7. Character --> char
  8. Boolean --> boolean

使用场景:

  1. 集合类的使用

Java集合框架(如ListSetMap等)只能存储对象,无法直接存储基本数据类型。因此,在需要将基本数据类型放入集合中时,需要使用对应的封装类型。

import java.util.ArrayList;
import java.util.List;

public class WrapperExample {
    public static void main(String[] args) {
        List<Integer> intList = new ArrayList<>();
        // 自动装箱:int -> Integer
        intList.add(10); 
        intList.add(20);
        
        for (Integer num : intList) {
            // 自动拆箱:Integer -> int
            // 输出:10 20
            System.out.println(num); 
        }
    }
}
  1. 泛型编程

泛型类和方法只能使用引用类型,从而在泛型参数中必须使用封装类型。

public class GenericContainer<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }

    public static void main(String[] args) {
        GenericContainer<Integer> container = new GenericContainer<>();
        // 自动装箱:int -> Integer
        container.setItem(100); 
        // 自动拆箱:Integer -> int
        // 输出:100
        System.out.println(container.getItem()); 
    }
}
  1. 与API交互

一些API或第三方库要求使用对象而不是基本数据类型。封装类型满足这些要求。

import java.util.Optional;

public class ApiExample {
    public static void main(String[] args) {
        // 自动装箱:int -> Integer
        Optional<Integer> optionalInt = Optional.of(30); 
        // 自动拆箱:Integer -> int
        // 输出:30
        optionalInt.ifPresent(System.out::println); 
    }
}
  1. 空值处理

封装类型可以表示null,而基本数据类型不能。有些场景需要处理空值,例如数据库查询结果。

public class NullHandlingExample {
    public static void main(String[] args) {
        // 封装类型可以为null
        Integer possibleNullInt = null; 
        if (possibleNullInt == null) {
            System.out.println("The value is null");
        } else {
            System.out.println(possibleNullInt);
        }
    }
}
  1. 反射操作

反射机制通常基于对象,而封装类型使得反射操作更加方便。

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        Method parseIntMethod = Integer.class.getMethod("parseInt", String.class);
        // 使用Integer类的静态方法
        Object result = parseIntMethod.invoke(null, "123"); 
        // 输出:123
        System.out.println(result); 
    }
}

三、类型转换

数据类型转换可以分为隐式转换(也称为自动类型转换)和显式转换(也称为强制类型转换)

  1. 隐式转换(自动类型转换)

隐式转换是指Java编译器自动完成的类型转换。这种转换通常发生在将一种较小范围的数据类型赋值给较大范围的数据类型时。

例如:将int类型的变量赋值给long类型的变量。隐式转换是安全的,因为不会造成数据丢失。

public class ImplicitConversion {
    public static void main(String[] args) {
        int intVal = 100;
        // 自动将 int 转换为 long
        long longVal = intVal; 
        // 自动将 long 转换为 float
        float floatVal = longVal; 

        System.out.println("intVal: " + intVal);
        System.out.println("longVal: " + longVal);
        System.out.println("floatVal: " + floatVal);
    }
}
  1. 显式转换(强制类型转换)

显式转换需要开发者手动进行类型转换,通过在要转换的值前面加上目标数据类型的括号,这种转换通常用于将较大范围的类型转换为较小范围的类型。

例如:将double类型转换为int类型。显式转换可能会导致数据丢失或精度降低,因此要谨慎使用。

public class ExplicitConversion {
    public static void main(String[] args) {
        double doubleVal = 100.99;

        // 强制将 double 转换为 int
        int intVal = (int) doubleVal; 

        System.out.println("doubleVal: " + doubleVal);
        // 可能会丢失小数部分
        System.out.println("intVal: " + intVal); 
    }
}
  1. 字符与数值类型之间的转换

字符类型char可以与数值类型进行相互转换,char实际上是一个无符号的16位Unicode字符,可以存储0到65535之间的整数值。

public class CharConversion {
    public static void main(String[] args) {
        char charVal = 'A';
        // char 自动转换为 int
        int intVal = charVal; 

        System.out.println("charVal: " + charVal);
        // 输出65,'A'对应的ASCII码
        System.out.println("intVal: " + intVal); 

        intVal = 66;
        // 强制将 int 转换为 char
        charVal = (char) intVal; 
        System.out.println("intVal: " + intVal);
        // 输出'B'
        System.out.println("charVal: " + charVal); 
    }
}

四、集合类型

Java集合框架提供了一系列用来存储和操作数据的类和接口,不同的集合类型适用于不同的场景。

主要集合类型具体分析

  1. ArrayList
    • 实现:基于动态数组。
    • 查找效率:随机访问元素效率高,时间复杂度为O(1)。
    • 插入和删除效率:在尾部进行插入和删除操作效率高,但在中间和头部插入和删除时需要移动元素,时间复杂度为O(n)。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景
      • 频繁的读取操作,如需要快速随机访问元素的场景。
      • 插入和删除操作相对较少的场景。
      • 数据量可预测且变化不频繁。
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
// 输出:Banana
System.out.println(arrayList.get(1)); 
  1. LinkedList
    • 实现:基于双向链表。
    • 查找效率:随机访问效率较低,时间复杂度为O(n)。
    • 插入和删除效率:插入和删除操作效率高,时间复杂度为O(1)。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景
      • 频繁的插入和删除操作。
      • 不常进行随机访问的场景。
      • 需要实现队列或栈结构时。
List<String> linkedList = new LinkedList<>();
linkedList.add("Apple");
linkedList.addFirst("Banana");
// 输出:Banana
System.out.println(linkedList.get(0)); 
  1. HashSet
    • 实现:基于哈希表。
    • 查找效率:查找、插入和删除操作的平均时间复杂度为O(1)。
    • 重复元素:不允许存储重复元素。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景:
      • 需要快速查找元素是否存在。
      • 需要保持数据的唯一性,不关心元素的顺序。
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
// 重复元素不会被添加
hashSet.add("Apple"); 
System.out.println(hashSet.size()); // 输出:2
  1. HashMap
    • 实现:基于哈希表。
    • 查找效率:查找、插入和删除操作的平均时间复杂度为O(1)。
    • 键值对:允许存储null值和null键。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景
      • 需要根据键快速查找对应的值。
      • 无需关心键值对的顺序。
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 3);
hashMap.put("Banana", 2);
// 输出:3
System.out.println(hashMap.get("Apple")); 
  1. LinkedHashMap
    • 实现:基于哈希表和双向链表。
    • 查找效率:查找、插入和删除操作的平均时间复杂度为O(1)。
    • 键值对顺序:维护插入顺序或访问顺序。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景:
      • 需要按插入顺序或访问顺序迭代键值对。
      • 需要关联的最近使用(LRU)缓存实现。
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Apple", 3);
linkedHashMap.put("Banana", 2);
for (Map.Entry<String, Integer> entry : linkedHashMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// 输出:
Apple: 3
Banana: 2
  1. TreeMap
    • 实现:基于红黑树。
    • 查找效率:查找、插入和删除操作的时间复杂度为O(log n)。
    • 键值对顺序:按自然顺序或指定的比较器顺序排序。
    • 线程安全:非线程安全,需要外部同步。
    • 适用场景:
      • 需要按键的自然顺序或自定义顺序迭代键值对。
      • 需要实现有序映射,比如按字母顺序存储单词。
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Banana", 2);
treeMap.put("Apple", 3);
for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// 输出:
Apple: 3
Banana: 2

五、并发类型

Java的并发类型提供了一系列用来处理多线程并发操作的类和接口,能够帮助开发者编写线程安全的程序。

并发类型的具体分析:

  1. synchronized
    • 实现:通过关键字synchronized实现同步。
    • 线程安全:确保代码块或方法在同一时刻只能被一个线程执行,从而避免多线程并发访问时的数据竞争问题。
    • 适用场景
      • 适用于对特定代码块或方法进行简单的同步控制。
public synchronized void synchronizedMethod() {
    // 同步的方法体
}
  1. ReentrantLock
    • 实现:基于显示锁的机制。
    • 功能:提供了比synchronized更灵活的锁机制,支持公平性选择和可中断性。
    • 适用场景
      • 适用于需要更高级的锁功能,比如公平锁、可重入锁等。
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
    // 需要同步的代码块
} finally {
    lock.unlock();
}
  1. Semaphore
    • 实现:基于计数信号量的机制。
    • 功能:用来控制同时访问特定资源的线程数量,限流的作用。
    • 适用场景
      • 适用于控制对某些资源的并发访问权限,比如数据库连接池、线程池等。
// 允许10个线程同时访问
Semaphore semaphore = new Semaphore(10); 
semaphore.acquire();
try {
    // 资源访问操作
} finally {
    semaphore.release();
}
  1. CountDownLatch
    • 实现:基于计数器的机制。
    • 功能:允许一个或多个线程等待其他线程完成操作后再继续执行。
    • 适用场景
      • 适用于等待其他线程完成某项任务后再进行后续操作的场景。
// 初始计数为1
CountDownLatch latch = new CountDownLatch(1);
// 线程1
// 完成操作
latch.countDown(); 
// 线程2
// 等待操作完成
latch.await();
  1. CyclicBarrier
    • 实现:基于栅栏的机制。
    • 功能:让一组线程相互等待,直到所有线程都到达栅栏位置后再继续执行。
    • 适用场景
      • 适用于多个线程之间相互等待,然后同时开始执行下一阶段任务的场景。
// 等待3个线程到达
CyclicBarrier barrier = new CyclicBarrier(3); 
// 线程1
barrier.await();
// 线程2
barrier.await();
// 线程3
barrier.await();
// 所有线程都到达后继续执行
  1. ConcurrentHashMap
    • 实现:基于哈希表的并发HashMap实现。
    • 线程安全:内部实现了分段锁机制,提供了比Hashtable更高效的并发性能。
    • 适用场景:适用于多线程并发访问的场景,比如作为缓存或全局共享的数据结构。
ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key", 1);

每一天都是起跑线,勇敢迈出第一步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/716956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第42课-多人联机-实时互动

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第42课-多人联机-实时互动 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

操作系统入门 -- CPU调度算法

操作系统入门 – CPU调度算法 在了解完进程和线程的概念后&#xff0c;我们就需要了解当一个进程就绪后系统会进行怎样的资源分配并运行进程&#xff0c;因此我们就需要了解CPU的调度算法 1.CPU调度 1.1概念 CPU调度即按照某种算法将CPU资源分配给某个就绪的进程。 1.2调度…

【无标题】Pycharm执行报错

file 读取未指定utf-8编码&#xff0c;加上就好了 疑问&#xff1a;为什么 有的电脑可以直接跑呢&#xff1f;该电脑、Pycharm、工程&#xff0c;已经做了修改设置默认值&#xff0c;但是到新的电脑上&#xff0c;就需要重新设置&#xff0c;所以 file 读、写&#xff0c;最好…

超声波清洗机洗眼镜干净吗?四大珍藏高分超声波清洗机分享!

超声波清洗机就是一种方便快捷且高效的一种智能清洁工具&#xff0c;作为清洁领域的功能集成产品给人们带来了更高质的清洁体验。无论你是注重生活品质还是追求性价比&#xff0c;又或者是探索智能科技产品的爱好者&#xff0c;超声波清洗机肯定不会让你失望的&#xff01;毕竟…

常见的安全测试漏洞

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、SQL注入攻击 SQL 注入攻击主要是由于程序员在开发过程中没有对客户端所传输到服务器端的参…

来自红队大佬的经验之谈---命令执行过滤绕过-Windows篇

感谢来自老流氓大佬的投稿&#xff0c;本次文章介绍的是在windows环境下&#xff0c;过滤的“点”和“空格”等符号&#xff0c;导致在写入webshell时会受限。以下是针对该目标的绕过记录。 首先是命令执行和过滤验证&#xff0c;如下&#xff1a;​ 执行dir命令&#xff0c;…

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时&#xff0c;就会发生基于堆的缓冲区溢出&#xff0c;从而导致多余的数据溢出到相邻的…

生产 的mybatisplus 日志输入到日志文件

默认是输出到控制台.不输出到日志文件 输出到日志文件.需要修改配置 第一步. logging:config: classpath:logback-wshoto.xml第二步 mybatis-plus:configuration:cache-enabled: truedefault-executor-type: reuselog-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl第三步…

Mathtype与word字号对照+Mathtype与word字号对照

字体大小对照表如下 初号44pt 小初36pt 一号26pt 小一24pt 二号22pt 小二18pt 三号16pt 小三15pt 四号14pt 小四12pt 五号10.5pt 小五9pt 六号7.5pt 小六6.5pt 七号5.5pt 八号5pt 1 保存12pt文件 首选选择第一个公式&#xff0c;将其大小改为12pt 然后依次选择 “预置”—…

SaaS产品运营|一文讲清楚为什么ToB产品更适合采用PLG模式?

在数字化时代&#xff0c;ToB&#xff08;面向企业&#xff09;产品市场的竞争愈发激烈。为了在市场中脱颖而出&#xff0c;许多企业开始转向PLG&#xff08;产品驱动增长&#xff09;模式。这种模式以产品为核心&#xff0c;通过不断优化产品体验来驱动用户增长和业务发展。本…

DPDK环境配置

DPDK环境配置 DPDK&#xff08;Data Plane Development Kit&#xff09;是一个开源的软件框架&#xff0c;最初由Intel开发&#xff0c;旨在提升数据包处理性能&#xff0c;尤其是在Intel架构的处理器上。它允许开发者在用户空间&#xff08;user space&#xff09;而不是传统…

个人在家如何获取World Scientific文献的经验分享

今天有位同学求助一篇World Scientific文献&#xff0c;他的学校虽然有这个数据库&#xff0c;但订购的该数据库资源内容有限&#xff0c;这位同学所需的文献不在学校订购范围内所以下载不了。今天小编就分享一个在家就可获取各个数据库文献的方法。本文以这篇求助文献为例&…

Linux服务器上激活conda环境conda: error: argument COMMAND: invalid choice: ‘activate‘

正常我们使用如下来流程&#xff1a; 创建环境&#xff1a;conda create -n 环境名称 激活环境&#xff1a;conda activate 环境名称 但是&#xff0c;在Linux服务器上&#xff0c;使用conda activate 环境名称&#xff0c;出现如上图所示的报错。conda: error: argument CO…

一文看懂人工智能、机器学习、深度学习是什么、有什么区别!

引言&#xff1a;走进智能的世界 曾经&#xff0c;人工智能&#xff08;AI&#xff09;是科幻小说中的概念&#xff0c;与飞船、外星人并肩而立。 然而&#xff0c;随着时间的推移&#xff0c;AI不再仅仅是幻想的产物&#xff0c;它已经成为我们日常生活中不可或缺的一部分。 在…

虚拟机Ping不通主机

1.问题描述 虚拟机IP&#xff1a; 192.168.3.133 主机ip&#xff1a;192.168.3.137 虚拟机Ping不通主机 主机可以ping通虚拟机 2.解决方案 设置桥接模式 控制面板找到网络和Internet设置 3.问题解决

如何用Xcode创建你的第一个项目?学起来

前言 上一期&#xff0c;咱们已经有安装XCode的教程了。有小伙伴说建议跳过&#xff0c;嗯。。。如果你对开发很熟悉&#xff0c;那可以。但如果不熟悉&#xff0c;建议还是按照教程一步步来哦&#xff01; 毕竟统一了开发工具&#xff0c;咱们后续讲的内容学习起来也会简单一…

第二十章 迭代器模式

目录 1 迭代器模式介绍 2 迭代器模式原理 3 迭代器模式实现 4 迭代器模式应用实例 5 迭代器模式总结 1 迭代器模式介绍 迭代器模式(Iterator pattern)又叫游标&#xff08;Cursor&#xff09;模式&#xff0c;它的原始定义是&#xff1a;迭代器提供一种对容器对象中的各…

基于Matlab的BP神经网络的车牌识别系统(含GUI界面)【W7】

简介&#xff1a; 本系统结合了图像处理技术和机器学习方法&#xff08;BP神经网络&#xff09;&#xff0c;能够有效地实现车牌的自动识别。通过预处理、精确定位、字符分割和神经网络识别&#xff0c;系统能够准确地识别各种车牌图像&#xff0c;并在智能交通管理、安防监控等…

tyflow线相关教程二

线条生长一 生长静脉二 绳索动画三 两个球线连接四 扫帚五

SRAM和DRAM

1.SRAM&#xff08;静态RAM&#xff09; 把存放一个二进制位的物理器件称为存储元&#xff0c;它是存储器最基本的构件。 地址码相同的多个存储元构成一个存储单元。 存储单元的集合构成存储体。 静态RAM的存储元是用双稳态触发器&#xff08;六晶体管MOS&#xff09;来记忆…