- 一、java
- 1、== 和 equals 的区别是什么?
- 2、final 在 java 中有什么作用?
- 3、String 属于基础的数据类型吗?
- 4、String str="i"与 String str=new String(“i”)一样吗?
- 5、如何将字符串反转?
- 6、String 类的常用方法都有那些?
- 7、普通类和抽象类有哪些区别?
- 8、接口和抽象类有什么区别?
- 9、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?
- 10、throw 和 throws 的区别?
- 11、try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 12、final、finally、finalize 有什么区别?
- 13、常见的异常类有哪些?
- 14、hashcode是什么?有什么作用?
- 15、Java 容器都有哪些?
- 16、Collection 和 Collections 有什么区别?
- 17、list与Set区别
- 18、HashMap 和 Hashtable 有什么区别?
- 19、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上?
- 20、static注意事项
- 21、 break ,continue ,return 的区别及作用
- 22、
- 参考文章
- https://blog.csdn.net/guorui_java/article/details/108049191
- https://blog.csdn.net/guorui_java/article/details/108076036
- https://blog.csdn.net/guorui_java/article/details/108121583
- https://blog.csdn.net/guorui_java/article/details/108153368
- https://blog.csdn.net/guorui_java/article/details/108151596
- https://blog.csdn.net/guorui_java/article/details/109043769
- https://www.cnblogs.com/QLCZ/p/14968925.html
- https://www.cnblogs.com/QLCZ/p/15041523.html
- https://www.cnblogs.com/QLCZ/p/14977264.html
- https://www.cnblogs.com/QLCZ/p/14968927.html
- https://wenku.baidu.com/view/71380354f142336c1eb91a37f111f18583d00c66.html
- 对于基本类型,== 比较的是值。
- 对于引用类型, == 比较的是地址。
- equals不能用于基本类型的比较。
- 如果没有重写equals,equals就相当于 == 。
- 如果重写了equals方法,equals比较的是对象的内容。
// 若依重写的StringUtils下的equals
public static boolean equals(CharSequence cs1, CharSequence cs2) {
if (cs1 == cs2) {
return true;
} else if (cs1 != null && cs2 != null) {
if (cs1.length() != cs2.length()) {
return false;
} else if (cs1 instanceof String && cs2 instanceof String) {
return cs1.equals(cs2);
} else {
int length = cs1.length();
for(int i = 0; i < length; ++i) {
if (cs1.charAt(i) != cs2.charAt(i)) {
return false;
}
}
return true;
}
} else {
return false;
}
}
2、final 在 java 中有什么作用?
- final修饰的成员变量,必须在声明的同时赋值,一旦创建不能修改。
- final修饰的方法,不能被子类重写。
- final类中的方法默认是final的。
- private类型的方法默认是final的。
不属于。
八种基本数据类型:byte short int long char float double boolean。
String str =“i” 会将其分配到常量池中,常量池中没有重复的元素。
如果常量池中存在i,就将 i 的地址直接赋给变量; 如果没有就创建一个再赋给变量。
String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。
String s = new String(a);
创建1个或2个对象。
若常量池中已经存在"a",那么就不会再在常量池中创建对象,⽽是执⾏new操作,在堆中创建⼀个存储"a"的String对象,对象的引⽤
赋值给s,这样就创建了1个对象;
若常量池中没有"a",就会在常量池中创建⼀个对象"a",然后再执⾏new操作,在堆中创建⼀个存储"a"的String对象,对象的引⽤赋值给s,这样就创建了2个对象。
注意: 这⾥的情况其实堆中的String对象的char value[]属性指向常量池中的char> value[],可以通过debug的形式查看两个String对象的> value值的引⽤相同,也就是说,虽然是两个对象,但它们的value值均指向常量池中的同⼀个地址。上述过程中检查常量池是否有相同Unicode的字符串常量时,使⽤的⽅法便是String中的intern()⽅法。
String s ="a"+"b";
这⾥涉及到字符串常量重载“+”的问题,当⼀个字符串由多个字符串常量拼接成⼀个字符串时,它⾃⼰也肯定是字符串常量。字符串常量的“+”号连接Java虚拟机会在程序编译期将其优化为连接后的值。 在编译时已经被合并成“ab”字符串,因此,只会创建1个对象。并没有创建临时字符串对象a和b,这样减轻了垃圾收集器的压⼒。
String s ="a"+new String("b");
创建5个对象。
上述的代码Java虚拟机在编译的时候同样会优化,会创建⼀个StringBuilder来进⾏字符串的拼接,实际效果类似:
String s =new String("b");
new StringBuilder().append("a").append(s).toString()
很显然,常量池中分别有“a”和“b”,堆中对象new String(“b”)和“ab”,还多出了⼀个StringBuilder对象,那就应该是5个对象。
疑问:
为什么会有⼈说,StringBuilder最后toString()之后的“ab”难道不在常量池存⼀份吗?这样不就是6个对象?
解析:
答案是不对的。
StringBuilder的toString()⽅法是如何将拼接的结果转化为字符串的:
@Override
public String toString(){
// Create a copy, don't share the array
return new String(value,0, count);
}
很显然,在toString⽅法中⼜新创建了⼀个String对象,⽽该String对象传递数组的构造⽅法来创建的:
public String(char value[],int offset,int count)
也就是说,String对象的value值直接指向了⼀个已经存在的数组,⽽并没有指向常量池中的字符串。
5、如何将字符串反转?将对象封装到stringBuilder中,调用reverse方法反转。
String str = "asdfg";
StringBuilder stringBuilder = new StringBuilder(str);
String ret =stringBuilder.reverse().toString();
System.out.println(ret); //gfdsa
6、String 类的常用方法都有那些?
- 常见String类的获取功能
- length:获取字符串长度;
- charAt(int index):获取指定索引位置的字符;
- indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;
- substring(int start):从指定位置开始截取字符串,默认到末尾;
- substring(int start,int end):从指定位置开始到指定位置结束截取字符串;
- 常见String类的判断功能
- equals(Object obj): 比较字符串的内容是否相同,区分大小写;
- contains(String str): 判断字符串中是否包含传递进来的字符串;
- startsWith(String str): 判断字符串是否以传递进来的字符串开头;
- endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
- isEmpty(): 判断字符串的内容是否为空串"";
- 常见String类的转换功能
- byte[] getBytes(): 把字符串转换为字节数组;
- char[] toCharArray(): 把字符串转换为字符数组;
- String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;
- toLowerCase(): 把字符串转成小写;
- toUpperCase(): 把字符串转成大写;
- concat(String str): 把字符串拼接;
- 常见String类的其他常用功能
- replace(char old,char new) 将指定字符进行互换
- replace(String old,String new) 将指定字符串进行互换
- trim() 去除两端空格
- int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。
- 抽象类不能被实例化。
- 抽象类可以有抽象方法,只需声明,无须实现。
- 有抽象方法的,类一定是抽象类。
- 抽象类的子类必须实现抽象类中的所有抽象方法,否则子类仍然是抽象类。
- 抽象方法不能声明为静态,并且不能被static、final修饰。
- 接口
- 接口使用interface修饰
- 接口不能实例化
- 类可以实现多个接口
- ①java8之前,接口中的方法都是抽象方法,省略了public abstract。
②java8之后;接口中可以定义静态方法,静态方法必须有方法体。
- 抽象类
- 抽象类使用abstract修饰;
- 抽象类不能被实例化;
- 抽象类只能单继承;
- 抽象类中可以包含抽象方法和非抽象方法,非抽象方法需要有方法体;
- 如果一个类继承了抽象类,①如果实现了所有的抽象方法,子类可以不是抽象类;②如果没有实现所有的抽象方法,子类仍然是抽象类。
- 什么要使用克隆?
想对一个对象进行复制,又想保留原有的对象进行接下来的操作,这个时候就需要克隆了。 - 如何实现对象克隆。
- 实现Cloneable接口,重写clone方法;
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。
- BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆。
- 深拷贝和浅拷贝的区别。
- 浅拷贝
- 深拷贝
- throw
- 作用在方法内,表示抛出具体异常,由方法体内的语句处理;
- 一定抛出了异常;
- throws
- 作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
- 可能出现异常,不一定会发生异常;
- final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
- finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。
- finalize方法用于垃圾回收。
一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。
- NullPointerException:空指针异常;
- SQLException:数据库相关的异常;
- IndexOutOfBoundsException:数组下角标越界异常;
- FileNotFoundException:打开文件失败时抛出;
- IOException:当发生某种IO异常时抛出;
- ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
- NoSuchMethodException:无法找到某一方法时,抛出;
- ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
- NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
- IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
- ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
Java中Object有一个方法:
public native int hashcode();
- hashcode()方法的作用
hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。
当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。 - equals和hashcode的关系
如果equals为true,hashcode一定相等;
如果equals为false,hashcode不一定不相等;
如果hashcode值相等,equals不一定相等;
如果hashcode值不等,equals一定不等; - 重写equals方法时,一定要重写hashcode方法。
- Collection
(1) set :HashSet 、 TreeSet
(2) list : ArrayList、LinkedList、Vector - Map
HashMap、HashTable、TreeMap
-
Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。
-
Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。
此类不能实例化,就像一个工具类,服务于Collection框架。
1、List简介
实际上有两种List:一种是基本的ArrayList,其优点在于随机访问元素,另一种是LinkedList,它并不是为快速随机访问设计的,而是快速的插入或删除。
ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。
还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
2、Set简介
Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。这是继承与多态思想的典型应用:表现不同的行为。Set不保存重复的元素(至于如何判断元素相同则较为负责) 。
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
3、list与Set区别
(1)List,Set都是继承自Collection接口
(2)List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
(3)Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
- HashMap是线程不安全的,HashTable是线程安全的;
- HashMap中允许键和值为null,HashTable不允许;
- HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2倍+1扩容;
1、静态只能访问静态。
2、非静态既可以访问非静态的,也可以访问静态的
- break 跳出总上一层循环,不再执行循环(结束当前的循环体)
- continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
- return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
二、 java集合
三、springboot
四、mysql
mybatisPlus
redis
rabbitmq
linux
Nginx
sprincloud



