深入探索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 -> IntegerintList.add(10); intList.add(20);for (Integer num : intList) {// 自动拆箱:Integer -> int// 输出:10 20System.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 -> Integercontainer.setItem(100); // 自动拆箱:Integer -> int// 输出:100System.out.println(container.getItem()); }
}
  1. 与API交互

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

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

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

public class NullHandlingExample {public static void main(String[] args) {// 封装类型可以为nullInteger 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"); // 输出:123System.out.println(result); }
}

三、类型转换

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

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

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

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

public class ImplicitConversion {public static void main(String[] args) {int intVal = 100;// 自动将 int 转换为 longlong longVal = intVal; // 自动将 long 转换为 floatfloat 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 转换为 intint 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 自动转换为 intint intVal = charVal; System.out.println("charVal: " + charVal);// 输出65,'A'对应的ASCII码System.out.println("intVal: " + intVal); intVal = 66;// 强制将 int 转换为 charcharVal = (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);

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue46-render函数

一、非单文件和单文件的main.js对比 1-1、非单文件的main.js 1-2、 单文件的main.js 将单文件的main.js中的render函数变成非单文件的main.js中的template形式&#xff0c;报如下错误&#xff1a; 解决方式&#xff1a; 二、解决方式 2-1、引入完成版的vue.js 精简版的vue&a…

推广结算统计,Xinstall助您轻松掌握每一分投入与回报!

在移动互联网时代&#xff0c;App的推广与运营离不开精准的数据支持和高效的结算系统。然而&#xff0c;面对众多的推广渠道和复杂的结算流程&#xff0c;如何确保每一分投入都能得到合理的回报&#xff0c;成为了众多企业和开发者关注的焦点。今天&#xff0c;我们就来聊聊如何…

半监督学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 介绍一、Self Training自训练1、介绍2、代码示例3、参数解释 二、Label Propagation&#xff08;标签传播&#xff09;1、介绍2、代码示例3、参数解释 三、Label Spread…

618狂欢日,美味产品齐上阵,超值优惠等你享

这个充满激情与活力的6月&#xff0c;我们带着满满的诚意与惊喜&#xff0c;为广大美食爱好者们开启一场独特的618狂欢之旅。 当我们提及甘肃&#xff0c;那丰富多样的甘肃传统美食便是不得不说的瑰宝。烤馍&#xff0c;油饼&#xff0c;锅盔、擀面皮、浆水等每一种美食都…

你知道花洒其实起源于中国古代吗?

花洒作为日常生活中不可或缺的一部分&#xff0c;其发展历程不仅见证了人类文明的进步&#xff0c;也反映了生活美学的演变。从最初的简单构想到现代的智能化设计&#xff0c;花洒的变迁历程是一部生动的人类生活史。 早在隋朝时期&#xff0c;我们的祖先就已经有了花洒的初步构…

《纪元 1800》好玩吗? 苹果电脑能玩《纪元 1800》吗?

《纪元1800》是一款不错的策略游戏&#xff0c;这款游戏因为画面和玩法独特深受玩家们的喜爱。下面我们来看看《纪元 1800》好玩吗&#xff0c;苹果电脑能玩《纪元 1800》吗的相关内容。 一、《纪元1800》好玩吗 《纪元1800》是一款备受瞩目的策略游戏。下面让我们来看看这款…

初探工厂抽象模式

设计模式的-工厂模式 1.定义一个约定的规则抽象类 class ETFactory {createStore() {throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)}createUser(){throw new Error(抽象方法&#xff0c;不允许直接调用&#xff0c;需重写)} } 案例&#xff1a;…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

Android Compose 文本输入框TextField使用详解

一、 TextField介绍 TextField 允许用户输入和修改文本&#xff0c;也就是文本输入框。 TextField 分为三种&#xff1a; TextField是默认样式OutlinedTextField 是轮廓样式版本BasicTextField 允许用户通过硬件或软件键盘修改文本&#xff0c;但不提供提示或占位符等装饰&a…

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…

实时工业数据采集分析系统高效处理产线信息!

对于大部分制造业企业&#xff0c;测量仪器的自动数据采集一直是个令人烦恼的事情&#xff0c;即使仪器已经具有RS232/485等接口&#xff0c;但仍然在使用一边测量&#xff0c;一边手工记录到纸张&#xff0c;再输入到PC中处理的方式&#xff0c;不但工作繁重&#xff0c;同时也…

try catch return语句情况分析

try catch return语句情况分析 try catch无finally语句写在最后 try catch try catch语法是一种对应于异常处理的语句&#xff0c;其中try语句内用于编写有异常存在可能的语句&#xff0c;而catch语句内用于编写捕获到异常的类型以及对异常对象的处理方法&#xff0c;本文主要…

鸿蒙: 基础认证

先贴鸿蒙认证 官网10个类别总结如下 https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 10节课学习完考试 考试 90分合格 3次机会 1个小时 不能切屏 运行hello world hvigorfile.ts是工程级编译构建任务脚本 build-profile.json5是工程…

IPA清洁棉签 IPA清洁擦拭棒:打印机头、电子设备等清洁的有力工具!

在数字化快速发展的今天&#xff0c;打印机头、电子设备等已经成为了我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;这些设备往往会因为灰尘、油渍等污染物的积累而影响其性能。此时&#xff0c;一款高效、便捷的清洁工具就显得尤为重…

数据预处理之基于聚类的TOD异常值检测#matlab

1.基于聚类的异常值检测方法 物以类聚——相似的对象聚合在一起&#xff0c;基于聚类的异常点检测方法有两个共同特点&#xff1a; (1)先采用特殊的聚类算法处理输入数据而得到聚类&#xff0c;再在聚类的基础上来检测异常。 (2)只需要扫描数据集若干次&#xff0c;效率较高…

3D Gaussian Splatting Windows安装

1.下载源码 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 2.安装cuda NVIDIA GPU Computing Toolkit CUDA Toolkit Archive | NVIDIA Developer 3.安装COLMAP https://github.com/colmap/colmap/releases/tag/3.9.1 下载完成需要添加环…

基于Springboot框架班级综合测评管理系统的设计与实现

开头语&#xff1a;你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Springboot框架&#xff0c;B/S模式 工具&#xff1a;MyEclipse 系统展示 首页…

Go 并发控制:RWMutex 实战指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

《地下城与勇士》新手攻略,开荒必备!云手机多开教程!

《地下城与勇士》&#xff08;DNF&#xff09;是一款广受欢迎的多人在线动作角色扮演游戏。玩家将在游戏中扮演不同职业的角色&#xff0c;通过打怪、做任务、PK等方式不断提升自己&#xff0c;探索广阔的阿拉德大陆。游戏中设有丰富的副本、装备、技能系统&#xff0c;玩家可以…

重磅!草料模板库更新,新增签到报名和旅游模板

本次共更新5个签到报名场景模板&#xff0c;以及6个旅游场景模板。 所有模板内容均可自定义修改&#xff0c;并可免费使用。 签到报名场景 签到报名场景更新了 活动报名、大型活动会议报名、展会邀请函、专题讲座活动报名和技能培训邀约报名 5个模板&#xff0c;基于不同的会…