try-catch后只要有finally,那么finally就一定会被执行;不管try-catch是否有return,finally仍然会执行,如果finally中有return,则只会返回finally中的return的值。
try {
//代码块
} catch (Exception e) {
//代码块
} finally {
//代码块
}
添加链接描述
NullPointerException:
空指针异常,当操作一个 null 对象的方法或属性时会抛出这个异常。是一个很头疼的异常,因为它是运行时异常,不需要手动捕获,但运行时碰到这个异常会中断程序。
OutOfMemoryError:
内存溢出异常,这不是程序能控制的,当需要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。
IOException:
IO,即:Input、Output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。
IOException表示发出某种I/O,即输入输出操作期间异常发生的信号,此异常是由失败或中断的I/O操作产生的一般异常。
当Java程序尝试读取或写入文件、网络连接、数据库或其他外部资源时,可能会出现 IOException。这些异常可能是由于文件不存在、无法访问文件、网络连接中断、磁盘空间不足等原因引起的。
FileNotFoundException:
找不到文件异常,如果文件不存在就会抛出这种异常。
IndexOutOfBoundsException:
索引越界异常,当操作一个字符串或者数组的时候经常遇到的异常。
length() 方法:返回字符串字符序列的长度(空格也算),返回值为 int 类型
String str = new String(“Hello World”);
System.out.println(str.length());//11
charAt(int index) 方法:用于返回字符串指定位置的字符,返回值为 char 类型,参数为 int 类型
String str = new String(“Hello World”);
for (int i = 0; i < str.length(); i++) {
System.out.println(“下标为” + i + “的元素为:” + str.charAt(i));//打印的是每个字母
}
isEmpty() 方法:判断字符串是否为空,返回值为 boolean 类型
equals() 方法:比较字符串内容是否相等并返回,返回值为 boolean 类型
concat(String str):将指定字符串合并到原字符串末尾。
String str = “Hello”.concat(“World”).concat(“!”); // HelloWorld!
indexOf(char ch):返回指定字符在字符串中第一次出现的索引。
Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector 接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└HashSet 使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序
Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap
线程的五大状态:创建状态、就绪状态、运行状态、阻塞状态、死亡状态
1创建状态(新生状态):new 线程对象Thread t = new Thread();线程对象一旦创建,就进入了新生状态。
2.就绪状态:new出来以后,当调用start()方法,线程就会立即进入就绪状态,但不意味着立即调度执行。
3.运行状态:处于就绪状态的线程,经过CPU调度就会进入运行状态,线程才会真正执行线程体的代码块。
4.阻塞状态:当调用sleep、wait或同步锁定时,线程进入阻塞状态,就是代码块不往下执行,阻塞事件解除后,重新进入就绪状态,等待CPU调度执行。
5.死亡状态:线程中断或结束,一旦进入死亡状态,就不能再次启动。
并行是指同时执行多个线程或进程,每个线程或进程有自己的处理器资源。并行可以提高程序的执行效率,但需要更多的硬件资源。
并发是指多个线程或进程交替执行,共享同一个处理器资源。而并发则可以在有限的硬件资源下提高程序的吞吐量。
==比较的是两者的地址值,equals比较的是两者的内容是否一样
"=="比较的是基本类型的值或引用类型的引用,判断是否完全相同。
"equals()"方法比较的是引用类型的内容,判断是否逻辑上相等。
JDK是java开发工具包,
JRE是java运行时环境(包括Java基础类库,java虚拟机)
两个对象的equals返回true,那么hashcode一定相等;
两个对象的hashcode相等,那么equals不一定为true;
哈希码一样,内容不一样
不一定。
根据Java规范,如果两个对象的equals()
方法返回true
,那么它们的hashCode()
方法必须返回相同的值。这是因为在Java中,当两个对象的hashCode()
相同时,它们被认为是相等的,以便在哈希表等数据结构中进行正确的查找和比较操作。
然而,如果两个对象的hashCode()
相同,它们的equals()
方法并不一定返回true
。这是因为hashCode()
方法只是用来确定对象的哈希码,而equals()
方法则用于比较对象的内容是否相同。两个不同的对象可以具有相同的哈希码,但它们的内容可能不相同。
因此,如果两个对象的hashCode()
相同,则不能保证它们的equals()
方法也返回true
。
修饰类:表明该类不可被继承,类中的所有成员方法都隐式的被指定为final方法
修饰方法:不可被重写,JVM会尝试将其内联,以提高运行效率
修饰变量:不可被改变,修饰引用变量表示引用不可变,引用指向的内容可变
修饰常量:在编译阶段会存入常量池中
String:是只读字符串,每次对string的操作都会产生一个新的对象
StringBuilder:可变的字符数组,线程不安全
StringBuffer:可变的字符数组,对方法加了同步锁,线程安全
在Java中,常用的操作字符串的类有以下几个:
String
:String
类是Java中最基本的字符串类,它是不可变的(immutable),也就是说一旦创建后就不能被修改。对于每次对字符串进行修改,都会生成一个新的String
对象。StringBuilder
:StringBuilder
类是可变的(mutable)字符串类,它提供了修改字符串的方法,比如添加、插入、删除字符等操作。StringBuilder
类适用于频繁修改字符串内容的场景,因为它的操作是在原字符串上直接进行的,避免了创建大量临时对象的开销。StringBuffer
:StringBuffer
类与StringBuilder
类功能基本相同,也是可变的字符串类。唯一的区别是,StringBuffer
是线程安全的,适用于多线程环境下的字符串操作,并且性能相对较低。这些类之间的主要区别包括:
String
是不可变的,StringBuilder
和StringBuffer
是可变的。String
、StringBuilder
是非线程安全的,而StringBuffer
是线程安全的。String
的不可变性,每次对字符串进行修改都会创建一个新的对象,导致性能较差。相比之下,StringBuilder
和StringBuffer
直接在原字符串上进行修改,性能较好。因此,在选择使用哪个类时,需要根据具体的需求来判断。如果字符串是不变的且不需要频繁修改,可以使用String
;如果需要频繁修改字符串或者在单线程环境下,可以使用StringBuilder
;如果在多线程环境下,可以使用StringBuffer
以保证线程安全性。