软构lab2学习笔记

本篇是写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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值