说明:
本篇用于收集知识点方便随时巩固,持续更新与纠错。
关于JDK版本,若无特殊说明,默认为JDK 1.8,。
关于JVM版本,若无特殊说明,默认为 HotSpot。
目录
一、Java 基础
1.1 Java中的基本数据类型有哪几种?各占用多少字节?
1.2 String 在Java中是个特殊的存在,谈谈?
1.3 谈谈 String、StringBuffer、StringBuilder 的异同。
1.4 ArrayList、Vector、LinkedList 的异同?
1.5 讲讲类的实例化过程中静态变量、成员变量等的加载顺序
1.6 HashMap 你用过吗?说说你对它的认识?
未完,待续。。。
最后
答:Java 中的基本数据类型有8种。其中:
答:
Sting类可以序列化。String实现了序列化接口,所以是可以被序列化与反序列化的。
String对象之间可以进行比较。实现了Comparable接口中的compareTo()方法,所以字符串之间是可以进行比较的(是根据字符串中每个字符的ASCII码进行比较),如下图源码。
String类不可以被继承。因为String 是一个被final所修饰的类。
String是不可变的。String类底层实际存储数据的是:private final char value[]; 也就是说 String类底层维护的是一个字符序列。这个 char 类型数组被 final 所修饰,所以一经创建,就不可修改。
String类重写了equals() 方法。先比较两个字符串的地址是否相同,是则直接返回true;如果地址不相同,再看两个字符串内容是否相同,是的话也返回true。
String可以用字面量方式创建。String 是一个类,与其他类不同的是,String可以使用字面量的形式创建或赋值。
String str = "123";
/*
1 先到常量池去通过String的equals()方法去找是否存在字符串"123",
如果存在,直接将地址返回(这也保证了常量池中的字符串常量都是唯一的)。
2 如果常量池中不存在"123",则先在常量池中创建一个"123"的字符序列,然后再将其地址返回。
*/
String str = new String("123");
/*
1 先到常量池去通过String的equals()方法去找是否存在字符串"123",
如果不存在,就在常量池中创建一个。
(所以说在new字符串的时候,如果常量池中不存在,实际上会创建两次。)
2 在堆中开辟空间,创建一个Sting 对象,并返回其地址。
*/
String常量存储在方法区中的常量池,new出来的对象存储在堆内存中。
字符串之间可以使用 + 号拼接。拼接产生的结果是第三个字符串,进行拼接的字符串本身是没有发生任何变化的。
String 的本地方法 intern() 可以从常量池中获取字符串。如果常量池中没有,就先创建,再将其地址返回。
这三个类 都被 final 锁修饰,不允许被继承。
从线程安全的角度讲:
从对象可变性角度讲:
从频繁修改的性能角度:
其他方面:
Vector:
ArrayList:
LinkedList:
1、父类静态变量
2、父类静态代码块
3、子类静态变量
4、子类静态代码块
5、父类成员变量
6、父类构造代码块
7、父类构造方法
8、子类成员变量
9、子类构造代码块
10、子类构造方法
代码验证:
public class Main {
public static void main(String[] args) {
Son son = new Son();
System.out.println("====================");
Son son2 = new Son();
}
}
class Parent{
public static int a = 1;
private int aa = 10;
static {
System.out.println("父类的静态代码块加载了,在此之前静态变量a已经加载了,a = " + a);
}
{
System.out.println("父类的构造代码块加载了,在此之前成员变量aa已经加载了: aa = " + aa);
}
public Parent() {
System.out.println("父类的构造方法加载了");
}
}
class Son extends Parent{
public static int b = 2;
private int bb = 20;
public Son() {
System.out.println("子类的构造方法加载了");
}
static {
System.out.println("子类的静态代码块加载了,在此之前静态变量b已经加载了,b = " + b);
}
{
System.out.println("子类的构造代码块加载了(此处将【构造块】放在【构造函数】下面,但是仍然是【构造块】先加载),在此之前成员变量bb已经加载了: bb = " + bb);
}
}
打印结果:
HashMap空参构造,只初始化了负载因子(0.75),其他成员变量均为默认值。
常用的有参构造方法 HashMap(int initialCapacity),是可以设置初始化大小的,在大概知道需要多大的map时,可以考虑使用这个构造方法。
HashMap 扩容:每次扩容至原来的2倍。
使用空参构造创建的对象,在第一次添加元素的时候,才会初始化一个长度为16的Node类型的数组。
链表转红黑树的时机:链表长度大于8 , 数组长度大于64
红黑树转链表的时机:链表程度小于 6
HashMap 允许空值作为键和值
HashMap 是无序,且键不重复的
HashMap 线程不安全,多线程操作下可能会抛出 ConcurrentModificationException
参考链接:Java 1.8-API源码学习之java.util.HashMap
本文是我自己复习并积累的过程,文中难免会有遗漏或不准确的地方
若有大佬路过发现我的错误还请指正,可以发送到我的邮箱:[email protected]
嫌麻烦就请在下方直接评论,万分感谢!!!