avatar
文章
360
标签
49
分类
10
首页
时间轴
分类
关于
Logo只有那年胜过年年
搜索
首页
时间轴
分类
关于

只有那年胜过年年

HashMap 和 Hashtable 的 6 个区别
发表于2025-10-15|后端
HashMap 和 Hashtable 是 Java 开发程序员必须要掌握的,也是在各种 Java 面试场合中必须会问到的。 但你对这两者的区别了解有多少呢? 现在,栈长我给大家总结一下,或许有你不明朗的地方,在栈长的指点下都会拨开迷雾见晴天。 1、线程安全Hashtable 是线程安全的,HashMap 不是线程安全的。 为什么说 HashTable 是线程安全的? 来看下 Hashtable 的源码,Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。 public synchronized V put(K key, V value); public synchronized V get(Object key); ... 2、性能优劣既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。 如果要线程安全又要保证性能,建议使用 JUC 包下的 ConcurrentHashMap。 3、NULLHashtable 是不允许键或值为 null 的,...
Java 中初始化 List 集合的 6 种方式!
发表于2025-10-15|后端
List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下。 1、常规方式List<String> languages = new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println(languages); 这种就是我们平常用的最多最平常的方式了,没什么好说的,后面缺失的泛型类型在 JDK 7 之后就可以不用写具体的类型了,改进后会自动推断类型。 2、Arrays 工具类List<String> jdks = asList("JDK6", "JDK8", "JDK10"); System.out.println(jdks); 注意,上面的 asList 是 Arra...
HashMap, ConcurrentHashMap 原理及源码
发表于2025-10-15|后端
网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚。终归是希望能降低大家学习的成本,不希望大家到处找各种不是很靠谱的文章,看完一篇又一篇,可是还是模模糊糊。 阅读建议: 四节基本上可以进行独立阅读,建议初学者可按照以下顺序进行阅读,可适当降低阅读门槛。 Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap 阅读前提: 本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍。Java8 用到了红黑树,不过本文不会进行展开,感兴趣的读者请自行查找相关资料。 Java7 HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持...
Java 中的 6 颗语法糖
发表于2025-10-15|后端
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。 Java作为一种与平台无关的高级语言,当然也含有语法糖,这些语法糖并不被虚拟机所支持,在编译成字节码阶段就自动转换成简单常用语法。 一般来说Java中的语法糖主要有以下几种: 泛型与类型擦除 自动装箱与拆箱 变长参数 增强for循环 内部类 枚举类 泛型与类型擦除 Java语言并不是一开始就支持泛型的。在早期的JDK中,只能通过Object类是所有类型的父类和强制类型转换来实现泛型的功能。强制类型转换的缺点就是把编译期间的问题延迟到运行时,JVM并不能为我们提供编译期间的检查。 在JDK1.5中,Java语言引入了泛型机制。但是这种泛型机制是通过类型擦除来实现的,即Java中的泛型只在程序源代码中有效(源代码阶段提供类型检查),在编译后的字节码中自动用强制类型转换进行替代。也就是说,Java语言中的泛型机制其实就是一颗语法糖,相较与C++、C#相比,其泛型实现实在...
Java 中的 String 真的是不可变吗?
发表于2025-10-15|后端
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 // ... } 可以看出 String 类是 final 类型的,String 不能被继承。其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明...
Java 中的伪共享详解及解决方案
发表于2025-10-15|后端
1. 什么是伪共享CPU 缓存系统中是以缓存行(cache line)为单位存储的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多线程情况下,如果需要修改“共享同一个缓存行的变量”,就会无意中影响彼此的性能,这就是伪共享(False Sharing)。 2. 缓存行由于共享变量在 CPU 缓存中的存储是以缓存行为单位,一个缓存行可以存储多个变量(存满当前缓存行的字节数);而CPU对缓存的修改又是以缓存行为最小单位的,那么就会出现上诉的伪共享问题。 Cache Line 可以简单的理解为 CPU Cache 中的最小缓存单位,今天的 CPU 不再是按字节访问内存,而是以 64 字节为单位的块(chunk)拿取,称为一个缓存行(cache line)。当你读一个特定的内存地址,整个缓存行将从主存换入缓存,并且访问同一个缓存行内的其它值的开销是很小的。 3. CPU 的三级缓存由于 CPU 的速度远远大于内存速度,所以 CPU 设计者们就给 CPU 加上了缓存(CPU Cache)。 以免运算被内存速度拖累。(就像我们写代码把共享数据做Cac...
Java 中的宏变量,宏替换详解。
发表于2025-10-15|后端
首先来看下面这段程序,和群友分享的大致一样。 public static void main(String[] args) { String hw = "hello world"; String hello = "hello"; final String finalWorld2 = "hello"; final String finalWorld3 = hello; final String finalWorld4 = "he" + "llo"; String hw1 = hello + " world"; String hw2 = finalWorld2 + " world"; String hw3 = finalWorld3 + " world";...
Java 中获取类名的三种方法,你知道几种?
发表于2025-10-15|后端
获取类名的方法Java 中获取类名的方式主要有以下三种。 getName() 返回的是虚拟机里面的class的类名表现形式。 getCanonicalName() 返回的是更容易理解的类名表示。 getSimpleName() 返回的是类的简称。 都有什么区别?通过一个实例来看下它们主要的区别。 public class TestClass { public static void main(String[] args) { // 外部普通类 System.out.println("方法名 类名"); System.out.println("getName " + TestClass.class.getName()); System.out.println("getCanonicalName " + TestClass.class.getCanonicalName()); System.out.p...
Java 对象引用四个级别(强、软、弱、虚)
发表于2025-10-15|后端
为了使程序能更加灵活地控制对象的生命周期,从JDK1.2版本开始,JDK把对象的引用级别分为了以下四种。 这4种级别由高到低依次为: 强引用(StrongReference) 强引用就是我们平常最基本的对象引用,如果是强引用,那回收器不会回收带有强引用的对象。即使内存不足抛出OutOfMemoryError异常也不会回收强引用对象,存在即合理吧。 如: User user = new User("Java技术"); 这就是强引用,user持有了这个对象的存储地址的引用。 软引用(SoftReference) 一个对象只有软引用,如果内存空间足够情况下垃圾回收器就不会回收它,如果内存空间不够了就会对这些只有软引用的对象进行回收。只要垃圾回收器没有回收,该软引用对象就可以继续被程序使用。 所以软引用一般用来实现一些内存敏感的缓存,只要内存空间足够,对象就会保持不被回收掉。 弱引用(WeakReference) 弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够...
Java 异常处理 10 个最佳实践
发表于2025-10-15|后端
异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中。Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们。事实上,在Java编程中,Java的异常处理不单单是知道语法这么简单,它必须遵循标准的JDK库,和几个处理错误和异常的开源代码。这里我们将讨论一些关于异常处理的Java 最佳实践。 1) 为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。选择检查型还是非检查型异常,对于Java编程人员来说,总是让人感到困惑。检查型异常保证你对错误条件提供异常处理代码,这是一种从语言到强制你编写健壮的代码的一种方式,但同时会引入大量杂乱的代码并导致其不可读。当然,如果你有替代品和恢复策略的话,捕捉异常并做些什么看起来似乎也在理。在Java 编程中选择检查型异常还是运行时异常。 2) 在finally程序块中关闭或者释放资源这在Java编程中,是一个广为...
1…282930…36
avatar
2025
文章
360
标签
49
分类
10
公告
🌸 春去秋来,花开花落 📚 桌上的日历又薄了几页 💭 记忆中的昨天还那么清晰
最新文章
掌握 Spring 框架这 10 个扩展点,开发效率直接翻倍2025-11-10
Minikube安装教程2025-11-07
Deepseek 本地部署各个版本超级详细教学,网页版、软件版2025-11-04
Slow HTTP POST 慢速攻击2025-10-30
JDK 紧急漏洞,XMLDecoder反序列化攻击2025-10-30
分类
  • 其他3
  • 区块链4
  • 后端225
  • 安全漏洞3
  • 工具30
  • 性能4
  • 教程1
  • 数据库21
  • 架构15
  • 程序人生54
标签
文章LinuxJVM分布式技术其他区块链基础安全漏洞多线程性能优化新特性架构算法程序人生行业动态规范资料集合进阶面试Elastic JobdockerJWTDubboMyBatisNettyShiroSpringSpring MVCSpring CloudTomcatSpring BootZookeeper日志开源综合技术消息队列缓存连接池Eclipse
归档
  • 2025年11月 3
  • 2025年10月 355
  • 2025年09月 1
  • 2024年12月 1
网站信息
文章数目 :
360
本站访客数 :
本站总浏览量 :
最后更新时间 :
访客地图
© 2025 By 2025
搜索
数据加载中