深入探索Java开发世界:Java基础~类型分析大揭秘
文章目录
- 一、基本数据类型
- 二、封装类型
- 三、类型转换
- 四、集合类型
- 五、并发类型
Java基础知识,类型知识点梳理~
一、基本数据类型
Java的基本数据类型是语言的基础,它们直接存储在栈内存中,具有固定的大小和不变的行为。
八种基本数据类型的具体分析:
-
byte(字节型)
- 大小: 8-bit == 1-byte
- 取值范围: -128 ~ 127
- 默认值: 0
- 使用场景:
- 节省内存: 在大数组中存储数据时,使用
byte
可以有效节省内存空间。例如,处理大型文件或图像数据。 - 网络通信: 在网络传输协议中,通常以字节为单位进行数据传输。
- 节省内存: 在大数组中存储数据时,使用
-
short(短整型)
- 大小: 16-bit == 2-byte
- 取值范围: -32,768 ~ 32,767
- 默认值: 0
- 使用场景:
- 内存受限场景: 在需要存储大量小整数且内存受限的情况下,如游戏开发中存储地图坐标。
-
int(整型)
- 大小: 32-bit == 4-byte
- 取值范围: -2^31 ~ 2^31-1
- 默认值: 0
- 使用场景:
- 常规整数运算: 最常用的整数类型,适合绝大多数计算场景,如计数器、循环变量、数组索引等。
- 位运算: 常用于位运算操作,如位掩码和位图。
-
long(长整型)
- 大小: 64-bit == 8-byte
- 取值范围: -2^63 ~ 2^63-1
- 默认值: 0L
- 使用场景:
- 大整数计算: 适用于需要存储大范围整数的场景,如时间戳(
System.currentTimeMillis()
返回的值)、大规模数据处理中的ID
生成。 - 金融计算: 存储货币金额(通常以分为单位),避免浮点数带来的精度问题。
- 大整数计算: 适用于需要存储大范围整数的场景,如时间戳(
-
float(浮点型)
- 大小: 32-bit == 4-byte
- 取值范围: 约 ±3.40282347E+38F (6-7 个有效十进制数字)
- 默认值: 0.0f
- 使用场景:
- 图形处理: 在计算机图形学、游戏开发中用于表示坐标、颜色值等。
- 简单科学计算: 适用于对精度要求不高的科学计算。
-
double(双精度浮点型)
- 大小: 64-bit == 8-byte
- 取值范围: 约 ±1.79769313486231570E+308 (15 个有效十进制数字)
- 默认值: 0.0d
- 使用场景:
- 高精度科学计算: 适用于需要高精度的计算,如物理模拟、统计分析、机器学习算法等。
- 金融计算: 如果不涉及严格的货币计算场景,可以用于财务分析、汇率转换等。
-
char(字符型)
- 大小: 16-bit == 2-byte
- 取值范围: 0 ~ 65,535 (表示单个Unicode字符)
- 默认值: ‘\u0000’
- 使用场景:
- 字符处理: 用于表示单个字符,如在字符串处理中对单个字符的操作。
- 字符编码: 在处理字符编码转换时,暂存单个字符。
-
boolean(布尔型)
- 大小: 实际大小依赖于JVM实现(通常使用1-bit,但实际存储可能更大)
- 取值范围: true 或 false
- 默认值: false
- 使用场景:
- 逻辑判断: 用于条件控制,如if语句、循环控制、标志位等。
- 状态表示: 表示对象的某种状态,如开关状态、运行状态等。
二、封装类型
封装类型为每种基本数据类型提供了一个对应的类,使得基本数据类型具有了对象的特性,可以调用对象方法和利用面向对象的特性。
Java的封装类型包括以下八种:
- Byte -->
byte
- Short -->
short
- Integer -->
int
- Long -->
long
- Float -->
float
- Double -->
double
- Character -->
char
- Boolean -->
boolean
使用场景:
- 集合类的使用
Java集合框架(如List
、Set
、Map
等)只能存储对象,无法直接存储基本数据类型。因此,在需要将基本数据类型放入集合中时,需要使用对应的封装类型。
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); }}
}
- 泛型编程
泛型类和方法只能使用引用类型,从而在泛型参数中必须使用封装类型。
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()); }
}
- 与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); }
}
- 空值处理
封装类型可以表示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);}}
}
- 反射操作
反射机制通常基于对象,而封装类型使得反射操作更加方便。
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); }
}
三、类型转换
数据类型转换可以分为隐式转换(也称为自动类型转换)和显式转换(也称为强制类型转换)
- 隐式转换(自动类型转换)
隐式转换是指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);}
}
- 显式转换(强制类型转换)
显式转换需要开发者手动进行类型转换,通过在要转换的值前面加上目标数据类型的括号,这种转换通常用于将较大范围的类型转换为较小范围的类型。
例如:将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); }
}
- 字符与数值类型之间的转换
字符类型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集合框架提供了一系列用来存储和操作数据的类和接口,不同的集合类型适用于不同的场景。
主要集合类型具体分析:
ArrayList
- 实现:基于动态数组。
- 查找效率:随机访问元素效率高,时间复杂度为O(1)。
- 插入和删除效率:在尾部进行插入和删除操作效率高,但在中间和头部插入和删除时需要移动元素,时间复杂度为O(n)。
- 线程安全:非线程安全,需要外部同步。
- 适用场景:
- 频繁的读取操作,如需要快速随机访问元素的场景。
- 插入和删除操作相对较少的场景。
- 数据量可预测且变化不频繁。
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
// 输出:Banana
System.out.println(arrayList.get(1));
LinkedList
- 实现:基于双向链表。
- 查找效率:随机访问效率较低,时间复杂度为O(n)。
- 插入和删除效率:插入和删除操作效率高,时间复杂度为O(1)。
- 线程安全:非线程安全,需要外部同步。
- 适用场景:
- 频繁的插入和删除操作。
- 不常进行随机访问的场景。
- 需要实现队列或栈结构时。
List<String> linkedList = new LinkedList<>();
linkedList.add("Apple");
linkedList.addFirst("Banana");
// 输出:Banana
System.out.println(linkedList.get(0));
HashSet
- 实现:基于哈希表。
- 查找效率:查找、插入和删除操作的平均时间复杂度为O(1)。
- 重复元素:不允许存储重复元素。
- 线程安全:非线程安全,需要外部同步。
- 适用场景:
- 需要快速查找元素是否存在。
- 需要保持数据的唯一性,不关心元素的顺序。
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
// 重复元素不会被添加
hashSet.add("Apple");
System.out.println(hashSet.size()); // 输出:2
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"));
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
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的并发类型提供了一系列用来处理多线程并发操作的类和接口,能够帮助开发者编写线程安全的程序。
并发类型的具体分析:
synchronized
- 实现:通过关键字
synchronized
实现同步。 - 线程安全:确保代码块或方法在同一时刻只能被一个线程执行,从而避免多线程并发访问时的数据竞争问题。
- 适用场景:
- 适用于对特定代码块或方法进行简单的同步控制。
- 实现:通过关键字
public synchronized void synchronizedMethod() {// 同步的方法体
}
ReentrantLock
- 实现:基于显示锁的机制。
- 功能:提供了比
synchronized
更灵活的锁机制,支持公平性选择和可中断性。 - 适用场景:
- 适用于需要更高级的锁功能,比如公平锁、可重入锁等。
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {// 需要同步的代码块
} finally {lock.unlock();
}
Semaphore
- 实现:基于计数信号量的机制。
- 功能:用来控制同时访问特定资源的线程数量,限流的作用。
- 适用场景:
- 适用于控制对某些资源的并发访问权限,比如数据库连接池、线程池等。
// 允许10个线程同时访问
Semaphore semaphore = new Semaphore(10);
semaphore.acquire();
try {// 资源访问操作
} finally {semaphore.release();
}
CountDownLatch
- 实现:基于计数器的机制。
- 功能:允许一个或多个线程等待其他线程完成操作后再继续执行。
- 适用场景:
- 适用于等待其他线程完成某项任务后再进行后续操作的场景。
// 初始计数为1
CountDownLatch latch = new CountDownLatch(1);
// 线程1
// 完成操作
latch.countDown();
// 线程2
// 等待操作完成
latch.await();
CyclicBarrier
- 实现:基于栅栏的机制。
- 功能:让一组线程相互等待,直到所有线程都到达栅栏位置后再继续执行。
- 适用场景:
- 适用于多个线程之间相互等待,然后同时开始执行下一阶段任务的场景。
// 等待3个线程到达
CyclicBarrier barrier = new CyclicBarrier(3);
// 线程1
barrier.await();
// 线程2
barrier.await();
// 线程3
barrier.await();
// 所有线程都到达后继续执行
ConcurrentHashMap
- 实现:基于哈希表的并发HashMap实现。
- 线程安全:内部实现了分段锁机制,提供了比Hashtable更高效的并发性能。
- 适用场景:适用于多线程并发访问的场景,比如作为缓存或全局共享的数据结构。
ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("key", 1);
每一天都是起跑线,勇敢迈出第一步
相关文章:

深入探索Java开发世界:Java基础~类型分析大揭秘
文章目录 一、基本数据类型二、封装类型三、类型转换四、集合类型五、并发类型 Java基础知识,类型知识点梳理~ 一、基本数据类型 Java的基本数据类型是语言的基础,它们直接存储在栈内存中,具有固定的大小和不变的行为。 八种基本数据类型的具…...

短URL服务设计
引言 在营销系统里,为了增加系统的活跃用户数,经常会有各种各样的营销活动。这类活动几乎都是为了充分利用存量用户的价值,促使他们分享产品或App以达到触达到更多用户的目的。又或者是出于营销目的,群发优惠券触达短信这种场景。…...

Kafka集成flume
1.flume作为生产者集成Kafka kafka作为flume的sink,扮演消费者角色 1.1 flume配置文件 vim $kafka/jobs/flume-kafka.conf # agent a1.sources r1 a1.sinks k1 a1.channels c1 c2# Describe/configure the source a1.sources.r1.type TAILDIR #记录最后监控文件…...

如何让视频有高级感 高级感视频制作方法 高级感视频怎么剪 会声会影视频剪辑制作教程 会声会影中文免费下载
高质量视频通常具有清晰的画面、优质的音频和令人印象深刻的视觉效果。这篇文章来了解如何让视频有高级感,高级感视频制作方法。 一、如何让视频有高级感 要让视频有高级感,要注意以下几个要点: 1、剧本和故事性:一个好的剧本和…...

详解|访问学者申请被拒原因有哪些?
访问学者项目为全球科研人员提供了一个难得的机会,让他们能够跨越国界,深入不同的学术环境,进行学术交流和合作。然而,并非所有申请者都能如愿以偿地获得这一机会。本文将对访问学者申请中常见的被拒原因进行详细解析,…...

[鹤城杯 2021]BabyRSA
题目: from Crypto.Util.number import getPrime, bytes_to_long from secret import flagp getPrime(1024) q getPrime(1024) n p * q e 65537 hint1 p >> 724 hint2 q % (2 ** 265) ct pow(bytes_to_long(flag), e, n) print(hint1) print(hint2) p…...

西安市工业倍增引导基金子基金申报条件流程和材料程序指南(2024年)
一、基本情况 产业投资基金是以产业发展为首要目标,围绕经济社会发展规划和产业发展政策,发挥“有效市场”作用,支持重点领域、重点产业、重点区域(如:全市六大支柱产业、五大新兴产业领域成熟期重点规模以上企业以及“…...

微型丝杆的耐用性和延长使用寿命的关键因素!
无论是机械设备,还是精密传动元件,高精度微型丝杆是各种机械设备中不可或缺的重要组件。它的精度和耐用性直接影响着工作效率和产品品质,在工业技术不断进步的情况下,对微型丝杆的性能要求也越来越高,如何提升微型丝杆…...

音频文件下载后,如何轻松转换格式?
在我们日常的数字生活中,下载各种音频文件是司空见惯的事情。然而,有时候我们可能需要将这些音频文件转换为不同的格式,以适应不同的设备或编辑需求。无论您是希望将下载的音频文件转换为通用的MP3格式,还是需要将其转换为高保真的…...

Intel平台,13600KF+3060Ti,虚拟机安装macOS 14(2024年6月)
距离上次装macOS虚拟机已经有一段时间了,macOS系统现在大版本升级的速度也是越来越快了,由于Office只支持最新三个版本的macOS,所以现在保底也得安装macOS 12了,我这次是用macOS 14做实验,13和12的安装方式和macOS 14一…...

Cookie、Session、Token的关系和区别
关系 Session与Cookie:Session通常依赖于Cookie来工作。当服务器为客户端创建一个Session时,它会在服务器上存储与客户端相关的信息,并将一个唯一的SessionID通过Cookie发送给客户端。客户端在后续的请求中会携带这个Cookie(包含…...

Windows 11 中安装 Docker Desktop 并安装镜像
本该主要介绍在 Windows 11 中安装 Docker Desktop 时的一些准备工作,以及该如何下载和安装,然后分别使用管理界面和 Docker 命令安装两个镜像。 一、准备工作 在 Windows 11 中安装 Docker Desktop 前,需要做一些准备。打开 【Windows 功能…...

深入剖析Java线程池之“newWorkStealingPool“
1. 概述 newWorkStealingPool 是Java 8中引入的一个新型线程池,它基于ForkJoinPool实现,并采用了“工作窃取”(Work-Stealing)算法。这种线程池特别适用于可并行化且计算密集型的任务,能够充分利用多核CPU资源,提高任务执行效率。 2. 工作窃取算法(Work-Stealing Algor…...

《跟我一起学“网络安全”》——安全设备
安全设备 一、安全设备–IDS IDS入侵检测 (1)什么是入侵检测: 入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。…...

猜测Tomcat如何实现WebSocket协议
一、WebSocket协议的实现 (一)WebSocket是官方的协议接口标准。 (二)如果一门编程语言可以网络连接和并发,就能创建一种WebSocket实现。 (三)同一种编程语言,有不同的协议实现版本和框架。 二、Tomcat实现 在Tomcat容器中实现了对应的WebSocket版本&am…...

uniApp @input事件更改输入框值,值改变了但是页面没更新新的值
<uni-easyinputtype"text"trim"all":inputBorder"false"v-model"customFormData.completePercent"input"(val) > completeOnInput(val)"placeholder"请输入" /> function completeOnInput(val) {let num…...

两行css 实现瀑布流
html <ul ><li><a href"" ><img src"05094532gc6w.jpg" alt"111" /><p>传奇</p></a></li><li><a href"" ><img src"05094532gc6w.jpg" alt"111"…...

Centos7.9部署单节点K8S环境
Centos7.9部署单节点K8S环境 通过Centos extras镜像源安装K8S环境,优点是方便快捷,缺点是版本较低,安装后的版本为1.5.2。 1. 准备工作 关闭selinux [rootlocalhost ~]# cat /etc/selinux/config# This file controls the state of SELin…...

【CV】stable diffusion初步理解
来自gpt-4o Stable diffusion 和DALLE的关系 Stable Diffusion 和 DALL-E 都是生成图像的人工智能模型,但它们有不同的开发背景和技术实现。 Stable Diffusion: 开发者: 由Stability AI开发,并与CompVis和LAION等组织合作。技术: 基于扩散模型…...

足底筋膜炎最好的恢复办法
足底筋膜炎是一种由足底筋膜受到炎症刺激而引起的疼痛和不适的疾病。其典型症状主要包括: 1、足底疼痛:这是足底筋膜炎最常见的症状。疼痛通常位于足跟部位,患者可能感到刺痛或灼热感。尤其在早晨起床或长时间站立后,这种疼痛感会…...

Fiddler抓包工具介绍
下载 下载:Web Debugging Proxy and Troubleshooting Tools|Fiddler 进去要填一个表 汉化版 百度网盘 请输入提取码 提取码:xq9t 下载过附件之后分别把两个文件 点开fiddler就ok了 配置https fiddler要想抓到https包(解密的),点击tools->options勾选三个对…...

知乎号开始运营了,宣传一波
知乎号开始发布一些小说、散文还有诗歌了,欢迎大家多来关注 知乎链接:姜亚轲 每篇小说都改编成网易云音乐,文章中也有链接,我做的词,Suno编曲和演唱,欢迎大家来听听...

Go 基础丨切片 slice
1. 底层 runtime/slice.go type slice struct {array unsafe.Pointer // 指向底层数组len int // 切片元素数量cap int // 底层数组容量 }reflect/value.go type SliceHeader struct {Data uintptrLen intCap int }2. 创建 根据数组创建 s : arr[0:3]字面…...

哪个牌子充电宝好用?精选四大热门款充电宝品牌!公认好用
在当今快节奏的生活中,充电宝已经成为了我们日常生活中不可或缺的数码伴侣。无论是旅行、出差还是日常通勤,拥有一款好用的充电宝,能够确保我们的手机、平板等设备随时保持充足电量。然而,市场上充电宝品牌繁多,如何选…...

WPF/C#:如何将数据分组显示
WPF Samples中的示例 在WPF Samples中有一个关于Grouping的Demo。 该Demo结构如下: MainWindow.xaml如下: <Window x:Class"Grouping.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x&q…...

leetcode 200 岛屿数量
思路 就是深搜,将可以走到的都标为0 ##代码 class Solution {static int[][] to {{1,0},{0,1},{-1,0},{0,-1}};public int numIslands(char[][] grid) {// 深搜int result 0;for (int i 0; i < grid.length; i) {for (int j 0; j < grid[0].length; j)…...

1:25万基础电子地图(江西版)
我们在《50幅1:25万基础电子地图(四川版)》和《1:25基础电子地图(云南版)》等文中,为你分享过四川和云南的基础电子地图。 现在我们再为你分享江西的1:25万基础电子地图,你可以在文…...

【RabbitMQ】初识 RabbitMQ
初识 RabbitMQ 1.认识 RabbitMQ1.1 介绍1. 2.使用场景1.2.1 推送通知1.2.2 异步任务1.2.3 多平台应用的通信1.2.4 消息延迟1.2.5 远程过程调用 1.3 特性 2.基本概念2.1 生产者、消费者和代理2.2 消息队列2.3 交换机2.3.1 direct2.3.2 topic2.3.3 headers2.3.4 fanout 2.4 绑定2…...

Qt QListView自定义树状导航控件
大部分的软件都有多个页面,这时候就需要一个导航栏控件,通过在导航栏中选择某一栏,同时显示对应的页面。 本文代码效果如下: 本文的导航栏控件基于大佬 feiyangqingyun 的导航栏控件博客Qt/C编写自定义控件46-树状导航栏_qt之实现…...

Java 数组的全面解析与应用
Java 中的数组是一种基础且重要的数据结构,用于存储相同类型的多个数据项。它提供了有效的数据组织和访问机制,是 Java 编程中不可或缺的部分。本文将从多个角度全面探讨 Java 数组的特性、操作和实际应用,帮助读者深入理解和有效利用这一数据…...