随笔分类 - Java笔记
HashMap 和 ConcurrentHashMap 的区别
摘要:线程安全性不同, HashMap 是线程不安全的, ConcurrentHashMap 是线程安全的. ConcurrentHashMap 采用锁分段技术, 将整个 Hash 桶进行了分段 segment, 也就是将这个大的数组分成了几个小的片段 segment, 而且每个 segment 片段上面
阅读全文
HashMap 和 HashTable 的区别
摘要:继承的父类不同, 但都实现了 Map 接口. 线程安全性不同, HashMap 线程不安全, HashTable 线程安全. key 和 value 是否能存 null, 虽然这两个在设计上都不允许存空值, 但 HashTable 编译时期就会报错, 而 HashMap 则在运行时才会抛出异常 Nu
阅读全文
ArrayList 和 LinkedList 的区别
摘要:线程安全: ArrayList 和 LinkedList 都是线程不安全的, 它们的方法之间都是不同步的. 底层数据结构: ArrayList 底层是使用 Object 数组; LinkedList 底层是使用双向链表数据结构. 快速访问随机元素: ArrayList 支持高效的快速访问随机元素,
阅读全文
ArrayList 和 Vector 的区别
摘要:这两个类都继承了 List 接口(List 继承了 Collection接口), 它们都是有序集合, 存储的元素可以重复. 安全性: ArrayList 是线程不安全的, 它的方法之间是线程不同步的, 但效率较高. Vector 是线程安全的, 它的方法之间是线程同步的. 扩容机制: ArrayLi
阅读全文
List, Set, Map 的区别
摘要:List: list 接口存储一组不唯一的, 有序的对象. Set: 不允许有重复元素的集合, 是无序的. Map: 使用键值对存储数据, key 是唯一的, 而 value 可以重复, 使用 key 来搜索效率极高.
阅读全文
sleep() 和 wait() 的共同点和区别
摘要:#####共同点: 两者都可以暂停线程的执行. ####区别: 最主要的区别是 sleep() 没有释放锁, 而 wait() 释放了锁. wait() 常被用于线程间的交互和通讯, 而 sleep() 则通常被用于暂停执行. wait() 被调用后, 线程不会自动苏醒, 需要其他线程调用同一对象上
阅读全文
什么是线程死锁?如何避免线程死锁?
摘要:####线程死锁 多个线程同时被阻塞, 它们中的一个或全部都在等待某个资源被释放. 由于线程被无限期的阻塞, 导致程序不可能被正常终止. 就像上图一样, 线程A持有资源2, 线程B持有资源1, 它们同时都想申请对方的资源, 所以这两个线程就会互相等待而进入死锁状态. 产生死锁必须具备四个条件: 互斥
阅读全文
&和&&, |和||的区别
摘要:&和&&的含义一样, 表示逻辑与(and), 只有第一个表达式和第二个表达式都为 true 时, 整个运算结果才为 true. |和||的含义一样, 表示逻辑或(or), 当第一个表达式和第二个表达式其中有一个为 true 时, 整个运算结果就为 true. &&和||还具备短路功能, 就是当第一个
阅读全文
Java 深拷贝和浅拷贝
摘要:###浅拷贝 对于基本数据类型的成员对象, 浅拷贝是将属性值赋值给新的对象, 所以其中一个修改, 不会影响另外一个. 对于引用数据类型的成员对象, 浅拷贝只是将成员对象的内存地址指向了同一个, 这时改变其中一个的属性值, 另外一个也会跟着改变. ###深拷贝 在拷贝引用数据类型的成员对象时, 会开辟
阅读全文
final 关键字修饰类,方法,变量有什么作用?
摘要:类 被 final 修饰的类不能被继承, final 类中的所有成员方法都会被隐式的指定为 final 方法. 方法 把方法锁定, 不让子类去修改方法的实现. 提高效率, 早期的 Java 实现版本中会将 final 方法转为内嵌调用, 而现在的 Java 版本已经不需要使用 final 进行优化了
阅读全文
线程有哪些基本状态,每种状态都代表什么
摘要:new(新建): 当程序使用 new 创建一个线程后, 该线程处于新建状态, 此时它和其它 java 对象一样, 仅仅由 JVM 为其分配内存并初始化成员变量值. runnable(可运行状态): 实际上可以细分成两种状态: ready(就绪) 和 running(运行) 状态. ready(就绪)
阅读全文
hashcode() 和 equals() 的作用 区别 联系
摘要:hashCode() 和 equals() 方法的作用其实一样, 都是用来对比两个对象是否相等, 都需要自己去覆写来提高对比效率和准确度, 在向 hashSet, hashMap 等底层用 hash值 判断的集合中存值时, 被存储的对象都需要覆写这两个方法. hashCode() 方法返回一个哈希值
阅读全文
== 与 equals 的区别
摘要:==: 它的作用是判断两个对象的地址是不是相等. 就是判断两个对象是不是同一个对象(基本数据类型中就是比较值, 而引用数据类型就是比较内存地址). equals: 它的作用也是判断两个对象是否相等. 但它一般有两种使用情况: 类没有覆盖 equals() 方法: 跟==比较没有区别. 类覆盖了 eq
阅读全文
为什么在调用子类构造函数之前会调用父类无参构造函数?
摘要:为了实现对象的实例化. 子类中所有的构造函数都会默认调用父类中的无参构造函数, 因为每一个子类构造函数内第一行都有隐式的 super(); 若父类中没有无参构造函数, 那么子类的构造函数内必须通过 super 语句指定要调用的父类中的构造函数. 若子类构造函数中用 this 来指定调用子类自己的构造
阅读全文
构造函数有那些特性?
摘要:名字与类名相同. 没有返回值, 但不能用 void 声明构造函数. 生成类的对象时自动执行, 无需调用. 无法被子类继承. 可以重载. 如果定义了有参构造函数, 则无参构造函数将不再自动创建.
阅读全文
接口和抽象类的区别是什么?
摘要:接口的方法默认时 public, 所有方法在接口中不能有实现(Java 8开始接口方法可以有默认实现), 而抽象类可以有非抽象方法. 接口中除了 static, final 变量, 不能有其他表变量, 而抽象类中则不一定. 一个类可以实现多个接口, 但只能实现一个抽象类. 接口自己本身可以通过继承拓
阅读全文
String为什么是不可变的? String、StringBuffer 和 StringBuilder 的区别是什么?
摘要:###String为什么是不可变的? String 类中使用 final 关键字修饰字符数组来保存字符串, private final char value[], 所以String对象是不可变的. ###String、StringBuffer 和 StringBuilder 的区别是什么? 可变性
阅读全文
Java 面向对象的三大特性
摘要:##封装 在定义类的时候, 如果可以直接修改类中的字段, 那么就可能会出现 age 可以设置为1000这种不合理的情况. 而封装, 就可以将类的某些信息隐藏在类内部, 不允许外部程序直接访问, 而是通过该类提供的方法来实现对隐藏信息的操作和访问, 从而可以限制对信息的不合理访问和修改. 封装的特点:
阅读全文
构造器 Constructor 是否可被 override (重写)?
摘要:Constructor 不能被 override, 但是可以 overload (重载), 所以在一个类中可以有多个构造函数的情况. Constructor 不能被继承, 所以不能被 override. 每一个类必须有自己的构造函数, 负责构造自己这部分的构造. 子类不会覆盖父类的构造函数, 相反必
阅读全文
overload 重载和 override 重写的区别
摘要:重载 发生在同一个类中, 方法名必须相同, 参数类型不同, 个数不同, 顺序不同, 方法返回值和访问修饰符可以不同. 重写 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 发生在子类中, 方法名, 参数列表必须相同, 返回值范围小于等于父类, 抛出的异常范围小于等于父类, 访问修饰符的范围
阅读全文
浙公网安备 33010602011771号