本篇是写Lab2时候查找资料的历史遗留,一直忘了发…
学到的东西如下:
1.
assertEquals(String message, Object expected, Object actual)方法:
/**
- Asserts that two objects are equal. If they are not
- an AssertionFailedError is thrown with the given message.
- 如果不抛出带有 message 的异常(AssertionFailedError)信息, 则表明两者相等(这里比较的是Object对象)
*/
static public void assertEquals(String message, Object expected, Object actual) {
if (expected == null && actual == null) {
return;
}
if (expected != null && expected.equals(actual)) {
return;
}
failNotEquals(message, expected, actual);
}
两个if语句, 判断了两者相等的情况: 引用(地址)相等或者内容相等. 如果这两种if情况都不命中, 那么表明1参和2参实际是不相等, 所以代码会往下执行failNotEquals(String message, Object expected, Object actual)方法,并在此方法中抛出异常,
Assert.assertSame(Object expected, Object actual)方法:
查看源码, 其比较的是引用地址是否相等, 并没有对内容进行比较:
/**
- Asserts that two objects refer to the same object. If they are not
- the same an AssertionFailedError is thrown.
/
static public void assertSame(Object expected, Object actual) {
assertSame(null, expected, actual);
}
/* - Asserts that two objects refer to the same object. If they are not
- an AssertionFailedError is thrown with the given message.
*/
static public void assertSame(String message, Object expected, Object actual) {
if (expected == actual) {
return;
}
failNotSame(message, expected, actual);
}
assertTrue()
assertFalse()
2.
static method 与instance method
被static修饰的方法为静态方法,之外的方法为实例方法。静态方法可直接使用类调用,实例方法必须创建实例后才能调用
2. 区别
2.1 类外部调用
静态方法可直接使用类调用,实例方法必须创建实例后才能调用。
2.2 类内部调用
实例方法内可以调用静态方法,但是静态方法只能调用静态方法,不能调用实例方法。
3.
关于抽象类
1.如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。
2.如果一个类出现了抽象的函数,那么该类也必须使用abstract修饰。
3.如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
4.抽象类可以存在抽象方法,也可以存在非抽象方法,还可以不存在抽象方法,但是这样没任何意义,Java是不写废话的。
5.抽象类是不能实例化对象的
6.抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。
疑问:为什么抽象类不能实例化对象?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象类的对象调用抽象方法是没有任何意义的。
引自:抽象类能实例化吗 - 泰斗贤若如 - 博客园 (cnblogs.com)
4.
String、StringBuffer与StringBuilder之间区别
String StringBuffer StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 可变类,速度更快
不可变 可变 可变
线程安全 线程不安全
多线程操作字符串 单线程操作字符串
(1)字符修改上的区别(主要,见上面分析)
(2)初始化上的区别,String可以空赋值,后者不行,报错
①String
String s = null;
String s = “abc”;
②StringBuffer
StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象
StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”
摘自:https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303
Stringbuilder 的常用方法;
在程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号来实现,但是这种方式达到目的的效率比较低,且每执行一次都会创建一个String对象,即耗时,又浪费空间。使用StringBuilder类就可以避免这种问题的发生,下面就Stringbuilder的使用做个简要的总结:
一、创建Stringbuilder对象
StringBuilder strB = new StringBuilder();
1、append(String str)/append(Char c):字符串连接
System.out.println(“StringBuilder:”+strB.append(“ch”).append(“111”).append(‘c’));
//return “StringBuilder:ch111c”
2、toString():返回一个与构建起或缓冲器内容相同的字符串
System.out.println(“String:”+strB.toString());
//return “String:ch111c”
3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this
System.out.println(“StringBuilder.appendCodePoint:”+strB.appendCodePoint(2));
//return “StringBuilder.appendCodePoint:ch111c”
4、setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)
strB.setCharAt(2, ‘d’);
System.out.println(“StringBuilder.setCharAt:” + strB);
//return “StringBuilder.setCharAt:chd11c”
5、insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
System.out.println(“StringBuilder.insertString:”+ strB.insert(2, “LS”));
//return “StringBuilder.insertString:chLSd11c”
System.out.println(“StringBuilder.insertChar:”+ strB.insert(2, ‘L’));
//return “StringBuilder.insertChar:chLLSd11c”
6、delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串
System.out.println(“StringBuilder.delete:”+ strB.delete(2, 4));
//return “StringBuilder.delete:chSd11c”
StringBuilder与String之间的转换
IT_追梦人 2020-06-04 13:56:39 3244 收藏 2
文章标签: java
版权
StringBuilder和String可以相互转换:
1.String–>StringBuilder:可以使用StringBuilder的构造方法。
StringBuilder(String str):构造一个字符串生成器,并初始化为指定的字
符串内容。
2.StringBuilder–>String:可以使用StringBuilder中的toString方法。
public String toString():将当前StringBuilder对象转换为String对象。
public class Demo_1{
public static void main(String[] args){
String str1 = "Hello ";
//String转换为StringBuilder
StringBuilder builder = StringBuilder(str1);
//向StringBuilder中添加字符串
builder.append("World!");
//StringBuilder转换为String
String str2 = builder.toString();
}
}
原文链接:https://blog.csdn.net/qq_46113679/article/details/106544603
5.
ContainsKey函数
6.
IDEA 覆盖率测试报错
https://blog.csdn.net/m0_51407177/article/details/117265312
7.
Java HashMap remove() 方法
remove() 方法用于删除hashMap 中指定键 key 对应的键值对(key-value)。
remove() 方法的语法为:
hashmap.remove(Object key, Object value);
注:hashmap 是 HashMap 类的一个对象。
参数说明:
• key - 键值
• value(可选)- 键值对(key-value)中 key 对应的 value 值
返回值
如果指定 key,返回指定键 key 关联的值,如果指定的 key 映射值为 null 或者该 key 并不存在于该 HashMap 中,此方法将返回null。
如果指定了 key 和 value,删除成功返回 true,否则返回 false。
HashSet 是一个没有重复元素(对象的哈希编码一样)的集合。 它是由HashMap实现的(HashSet中大量调用了HashMap的方法,其内部封装了一个HashMap ),不保证元素的顺序,而且HashSet允许使用 null 元素。
https://blog.csdn.net/jdsjlzx/article/details/51760634
HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。
8.
Java ArrayList addAll() 方法
addAll() 方法将给定集合中的所有元素添加到 arraylist 中。
addAll() 方法的语法为:
arraylist.addAll(int index, Collection c)
注:arraylist 是 ArrayList 类的一个对象。
参数说明:
• index(可选参数)- 表示集合元素插入处的索引值
• c - 要插入的集合元素
如果 index 没有传入实际参数,元素将追加至数组的最末尾。
返回值
如果成功插入元素,返回 true。
如果给定的集合为 null,则超出 NullPointerException 异常。
注意:如果 index 超出范围,则该方法抛出 IndexOutOfBoundsException 异常。
实例
使用 ArrayList addAll() 方法插入元素:
实例
import java.util.ArrayList;
class Main {
public static void main(String[] args){
// 创建一个动态数组
ArrayList<Integer> primeNumbers = new ArrayList<>();
// 往动态数组里添加元素
primeNumbers.add(3);
primeNumbers.add(5);
System.out.println("Prime Numbers: " + primeNumbers);
// 创建另外的一个动态数组
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
// 把 primeNumbers 的所有元素添加到 numbers 的动态数组中
numbers.addAll(primeNumbers);
System.out.println("Numbers: " + numbers);
}
}
执行以上程序输出结果为:
Prime Numbers: [3, 5]
Numbers: [1, 2, 3, 5]
9.
Java 实例 - 队列(Queue)用法
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。