1、在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。
2、Java 源程序与编译型运行区别

3、类可以看成是创建 Java 对象的模板。
4、一个源文件可以有多个非 public 类。
5、基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647
6、对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
7、byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制, 例如:
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
8、字符串是常量
9、在把容量大的类型转换为容量小的类型时必须使用强制类型转换。反之自动转换。浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
10、小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f
11、值传递:在方法调用时,传递的是实际参数的值的副本。当参数变量被赋予新的值时,只会修改副本的值,不会影响原始值。Java 中的基本数据类型都采用值传递方式传递参数变量的值。
引用传递:在方法调用时,传递的是实际参数的引用(即内存地址)。当参数变量被赋予新的值时,会修改原始值的内容。Java 中的对象类型采用引用传递方式传递参数变量的值。
12、局部变量在使用前必须被初始化。如果不进行初始化,编译器会报错,因为 Java 不会为局部变量提供默认值。
13、局部变量存储在 Java 虚拟机(JVM)的栈上,与存储在堆上的实例变量或对象不同。
14、方法的参数可以视为一种特殊的局部变量,它们在方法被调用时初始化,并在方法返回后生命周期结束。
15、当一个对象被实例化之后,每个成员变量的值就跟着确定。访问修饰符可以修饰成员变量。成员变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是 false,引用类型变量的默认值是 null。变量的值可以在声明时指定,也可以在构造方法中指定;
16、Java 中的静态变量是指在类中定义的一个变量,它与类相关而不是与实例相关,即无论创建多少个类实例,静态变量在内存中只有一份拷贝,被所有实例共享。静态变量在类加载时被初始化,其初始化顺序与定义顺序有关。
如果一个静态变量依赖于另一个静态变量,那么它必须在后面定义。
17、常量也是与类相关的,但它是用 final 关键字修饰的变量,一旦被赋值就不能再修改。与静态变量不同的是,常量在编译时就已经确定了它的值,而静态变量的值可以在运行时改变。
18、final 修饰符通常和 static 修饰符一起使用来创建类常量。
19、父类中的 final 方法可以被子类继承,但是不能被子类重写。
声明 final 方法的主要目的是防止该方法的内容被修改。
20、final 类不能被继承,没有类能够继承 final 类的任何特性。
21、volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
22、>>> 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
23、
valueOf()
返回一个 Number 对象指定的内置数据类型
parseInt()
将字符串解析为int类型。
ceil()
返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型。
floor()
返回小于等于(<=)给定参数的最大整数 。
24\Character类
是否是一个字母
是否是一个数字字符
是否是一个空白字符
是否是大写字母
是否是小写字母
指定字母的大写形式
指定字母的小写形式
toString()
返回字符的字符串形式,字符串的长度仅为1
25、String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上。String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
char charAt(int index)
返回指定索引处的 char 值。
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引。
int lastIndexOf(int ch)
返回指定字符在此字符串中最后一次出现处的索引。
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式。
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replaceAll(String regex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。
char[] toCharArray()
将此字符串转换为一个新的字符数组。
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String trim()
返回字符串的副本,忽略前导空白和尾部空白。
static String valueOf(primitive data type x)
返回给定data type类型x参数的字符串表示形式。
contains(CharSequence chars)
判断是否包含指定的字符系列。
isEmpty()
判断字符串是否为空。
26、StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
以下列表列出了 StringBuffer 类的其他常用方法:
int capacity()
返回当前容量。
char charAt(int index)
返回此序列中指定索引处的 char 值。
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
void setCharAt(int index, char ch)
将给定索引处的字符设置为 ch。
String substring(int start, int end)
返回一个新的 String,它包含此序列当前所包含的字符子序列。
String toString()
返回此序列中数据的字符串表示形式。
27、Java语言使用new操作符来创建数组
还可以使用如下的方式创建数组。
dataType[] arrayRefVar = {value0, value1, ..., valuek};
java.util.Arrays 类能方便地操作数组
public static int binarySearch(Object[] a, Object key)
用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(
插入点
) - 1)。
public static boolean equals(long[] a, long[] a2)
如果两个指定的 long 型数组彼此
相等
,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
public static void fill(int[] a, int val)
将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
public static void sort(Object[] a)
对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。
28、Date 对象创建以后,可以调用下面的方法。
long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
29、Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
public boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
Pattern pattern = Pattern.compile("^\\s*([+-]?\\d+)");
Matcher matcher = pattern.matcher(" 42");
if (matcher.find()) {
String numStr = matcher.group(1); // "42"
int num = Integer.parseInt(numStr);
}
# ^ :匹配字符串开头
# [\+\-]:代表一个+字符或-字符
# ? :前面一个字符可有可无
# \d :一个数字
# + :前面一个字符的一个或多个
# \D :一个非数字字符
# * :前面一个字符的0个或多个
29、Scanner s = new Scanner(System.in);
hasNext 与 hasNextLine 判断是否还有输入的数据
next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
30、
public String toString()
返回此 Throwable 的简短描述。
JDK7 之后,Java 新增的 try-with-resource 语法结构,旨在自动管理资源,确保资源在使用后能够及时关闭,避免资源泄露 。
try-with-resources 是一种异常处理机制,它能够自动关闭在 try 块中声明的资源,无需显式地在 finally 块中关闭。
在 try-with-resources 语句中,你只需要在 try 关键字后面声明资源,然后跟随一个代码块。无论代码块中的操作是否成功,资源都会在 try 代码块执行完毕后自动关闭。。
try (resource declaration) {
// 使用的资源
} catch (ExceptionType e1) {
// 异常块
}
31、多态就是同一个接口,使用不同的实例而执行不同操作

多态存在的三个必要条件
继承
重写
父类引用指向子类对象:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
虚函数
虚函数的存在是为了多态。
Java 中其实没有虚函数的概念,它的普通函数就相当于 C++ 的虚函数,动态绑定是Java的默认行为。如果 Java 中不希望某个函数具有虚函数特性,可以加上 final 关键字变成非虚函数。
32、如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
33、反射
在写代码时,不能直接调用,只知道类的名字和方法
运行时,可以作为依赖
34、集合(Sets)用于存储不重复的元素,常见的实现有 HashSet 和 TreeSet。
HashSet:无序集合,基于HashMap实现。不保证顺序。高效的查找和插入操作。
TreeSet 是有序集合,底层基于红黑树实现,不允许重复元素。 性能相对较差,不允许插入 null 元素。
HashMap:
特点: 基于哈希表实现的键值对存储结构。
优点: 高效的查找、插入和删除操作。
缺点: 无序,不保证顺序。
TreeMap:
特点: 基于红黑树实现的有序键值对存储结构。
优点: 有序,支持按照键的顺序遍历。
缺点: 插入和删除相对较慢。
队列(Queue)遵循先进先出(FIFO)原则,常见的实现有 LinkedList, PriorityQueue, ArrayDeque。
堆(Heap)优先队列的基础,可以实现最大堆和最小堆。
PriorityQueue minHeap = new PriorityQueue<>();
PriorityQueue maxHeap = new PriorityQueue<>(Collections.reverseOrder());