性能测试知识点总结-JAVA

Java 数组(Arrays)

int[] age = new int[5];
int[] age;
age = new int[5];

多维数组

double[][] matrix = {{1.2, 4.3, 4.0},        {4.1, -1.1} };

如何使用List?

在Java中,必须导入 java.util.List 包才能使用List。

//List 的ArrayList 实现
List<String> list1 = new ArrayList<>();

// List 的LinkedList 实现
List<String> list2 = new LinkedList<>();

创建一个LinkedHashMap

为了创建双向链表,我们必须先导入java.util.LinkedHashMap包。导入程序包后,可以使用以下方法在Java中创建双向链表。

//LinkedHashMap的初始容量为8,负载因子为0.6
LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>(8, 0.6f);

Java 方法重载

在Java中,如果两个或多个方法的参数不同(不同数量的参数,不同类型的参数或两者都不同),则它们可以具有相同的名称。这些方法称为重载方法,此功能称为方法重载。

Java 中的几种基本数据类型了解么?

基本类型和包装类型的区别?

①用途:包装类型可用于泛型,而基本类型不可以;

②存储方式:基本数据类型的局部变量存放在JVM栈中的局部变量表里,基本数据类型的未被static修饰的成员变量存放在JVM的堆中,而包装类型属于对象,基本都存放在堆中;

③占用空间:相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小;

④默认值:成员变量包装类型不赋值就是 null ,而基本类型有默认值且不是 null

⑤比较方式:对于基本数据类型来说,== 比较的是值。对于包装数据类型来说,== 比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用 equals() 方法

成员变量与局部变量的区别?

①语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;

成员变量可以被 public,private等权限修饰符以及static 所修饰,而局部变量不能被权限修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;

②存储方式:从变量在内存中的存储方式来看,成员变量如果是使用 static 修饰的,则存放于方法区中,如果没有使用 static 修饰,则存放于堆中;

而局部变量全部存放于栈中;

③生存时间:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡;

④默认值:从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 final 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值;

重载和重写有什么区别?

①重载是发生在同一个类中的,而重写是发生在父类和子类中的;

②重载要求参数列表必须修改,而重写要求参数列表不能修改;

③重载修改返回值、抛出的异常、权限修饰符且没有限制,

而重写要求子类返回值类型、抛出的异常必须比父类更小或相等,访问权限必须比父类更大或相等;(如果方法的返回类型是 void 和基本数据类型,则返回值重写时不可修改)

④重载发生在编译器,而重写发生在运行期;

面向对象的特征:继承、封装和多态

请写出 5 种常见到的 runtime exception

int 和 Integer 有什么区别,Integer 的值缓存范围

 面向对象的特征:继承、封装和多态

接口Interface和抽象类abstract有什么共同点和区别?

共同点

  • 都不能被实例化。
  • 都可以包含抽象方法。
  • 都可以有默认实现的方法(Java 8 可以用 default 关键字在接口中定义默认方法)

区别

  • 接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。
  • 一个类只能继承一个类,但是可以实现多个接口。
  • 接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值;

final, finally, finalize 的区别

一、final:

1、修饰符(关键字)如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承。因此一个类不能及被声明为abstract,又被声明为final的。

2、将变量或方法声明为final,可以保证他们使用中不被改变。被声明为final的变量必须在声明时给定初值,而以后的引用中只能读取,不可修改,被声明为final的方法也同样只能使用,不能重载。

二、finally:

在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,那么相匹配的catch语句就会执行,然后控制就会进入finally块,如果有的话。

三、finalize:

是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是在垃圾收集器在确定了,被清理对象没有被引用的情况下调用的。

finalize是在Object类中定义的,因此,所有的类都继承了它。子类可以覆盖finalize()方法,来整理系统资源或者执行其他清理工作。

Exception、Error、运行时异常与一般异常有何异同

请写出你最常见的5个RuntimeException 

NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常

1)IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数
2)NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常
3)ArrayIndexOutOfBoundsException当使用的数组下标超出数组允许范围时,抛出该异常
4)ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常
5)NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
6)ArithmeticException(整数除0时发生)

String、StringBuilder、StringBuffer

重载和重写的区别

抽象类和接口有什么区别

说说反射的用途及实现

说说自定义注解的场景及实现

HTTP 请求的 GET 与 POST 方式的区别

Session 与 Cookie 区别

列出自己常用的 JDK 包

jdk中的中除了java.lang包 其他的包用的话都得在Java文件中import语句来引入包。
在jdk中常用的包包括:
1、java.lang:Java语言包
2、java.util:Java实用包
3、java.awt:Java窗口工具包
4、javax.swing:轻量级的窗口工具包,JavaGUI程序设计包
5、java.io:Java读写包
6、java.net:网络函数包

equals 与 == 的区别

hashCode 和 equals 方法的区别与联系

为什么需要 hashCode 和 equals 方法?

hashCode() 方法和 equal() 方法的作用其实一样,在 Java 里都是用来对比两个对象是否相等一致,一般来说 equals() 相等,那么我们可以直接说对比的两个对象是完全相等的了。那么既然 equal() 已经能实现对比的功能了,为什么还要 hashCode() 呢?

因为重写的 equal() 里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode() 进行对比,则只要生成一个 hash 值进行比较就可以了,效率很高,那么hashCode() 既然效率这么高为什么还要 equal() 呢?

这是由于 hashCode() 并不是完全可靠的,有时候不同的对象他们生成的 hashcode 也会一样(生成 hashcode 值的公式可能存在的问题),这也对应了上面提到的结论 1。所以 hashCode() 只能说是大部分时候可靠,并不是绝对可靠。

因此,比较好的方法是:每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!

这种大量的并且快速的对象对比一般使用的 hash 容器中,比如 hashset, hashmap, hashtable 等等。比如 hashset 里要求对象不能重复,则他内部必然要对添加进去的每个对象进行对比,而他的对比规则就是像上面说的那样,先 hashCode(),如果 hashCode()相同,再用 equals() 验证,如果 hashCode() 都不同,则肯定不同,这样对比的效率就很高了。

什么是 Java 序列化和反序列化,如何实现 Java 序列化?或者请解释 Serializable 接口的作用

Object 类中常见的方法,为什么 wait notify 会放在 Object 里边?

Java 的平台无关性如何体现出来的

  • 这种支持是通过Java语言规范、Class文件和Java虚拟机(VM) 等组成Java体系结构的重要组件来实现的。

 JDK 和 JRE 的区别

Java 枚举(Enum)

在Java中,枚举是一种具有固定的可能值集的类型。我们使用enum关键字来声明枚举。例如,

enum Size { 
   SMALL, MEDIUM, LARGE, EXTRALARGE 
}

如何实现数组和 List 之间的转换?


List转数组:String[] list = List.toArray(array);//array为List

数组转List:List list = java.util.Arrays.asList(array);//array为数组

Array 和 ArrayList 有何区别?

Array类型的变量在声明时必须实例化,(至少得初始化数组的大小);ArrayList可以只是先声明;

int[] array = new array[5];
或 int[] array = {1,2,3,4,5};
或 ArrayList myList = new ArrayList();
这些都是合法的,而直接使用 int[] array;是不行的。

Array大小是固定的,而ArrayList的大小是动态变化的;

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型

(2) Array只能存储同构的对象,而ArrayList可以存储异构的对象。
同构的对象:指类型相同

Java 集合框架

在本教程中,我们将学习Java集合框架的不同接口。

Java 集合框架提供了一组接口和类,以实现各种数据结构和算法。

1、List 接口

List接口是一个有序的集合,它允许我们像数组一样添加和删除元素。

2、Set 接口

Set接口允许我们将元素存储在不同的集合中,类似于数学中的集合。它不能有重复的元素。

3、Queue 接口

当我们要以先进先出的方式存储和访问元素时,可以使用Queue接口。

4、Java Map 接口

在Java中,Map接口允许元素以键/值对的形式存储。键是唯一的名称,可用于访问map中的特定元素。而且,每个键都有一个与之关联的值。

5、Java Iterator 接口

在Java中,Iterator接口提供了用于访问集合元素的方法。

Iterator接口提供了4种方法,可用于对集合元素执行各种操作。

  • hasNext() - 如果集合中存在元素,则返回true

  • next() - 返回集合的下一个元素

  • remove() -删除next()返回的最后一个元素

  • forEachRemaining() - 对集合的每个剩余元素执行指定的操作

集合框架的接口

Java集合框架提供了各种接口。这些接口包括几种对集合执行不同操作的方法。

Collection 方法

Collection 接口包括各种可用于对对象执行不同操作的方法。这些方法在其所有子接口中均可用。

  • add() - 将指定的元素插入到集合中

  • size() - 返回集合的大小

  • remove() - 从集合中删除指定的元素

  • iterator() - 返回一个迭代器以访问集合的元素

  • addAll() - 将指定集合的所有元素添加到集合中

  • removeAll() - 从集合中删除指定集合的所有元素

  • clear() - 删除集合中的所有元素

List方法

List接口包括Collection接口的所有方法。 这是因为Collection是List的超级接口。

Collection接口中还提供了一些常用的List接口方法:

  • add() - 将元素添加到列表

  • addAll() - 将一个列表的所有元素添加到另一个

  • get() - 有助于从列表中随机访问元素

  • iterator() - 返回迭代器对象,该对象可用于顺序访问列表的元素

  • set() - 更改列表的元素

  • remove() - 从列表中删除一个元素

  • removeAll() - 从列表中删除所有元素

  • clear() - 从列表中删除所有元素(比removeAll()效率更高)

  • size() - 返回列表的长度

  • toArray() - 将列表转换为数组

  • contains() -  如果列表包含指定的元素,则返回true

Set的方法

  • Set接口包含Collection接口的所有方法。 这是因为Collection是Set的超级接口。

    Set接口中还提供了Collection接口的一些常用方法:

  • add() - 将指定的元素添加到集合中

  • addAll() - 将指定集合的所有元素添加到集合中

  • iterator() -返回一个迭代器,该迭代器可用于顺序访问集合中的元素

  • remove() - 从集合中移除指定的元素

  • removeAll() - 从存在于另一个指定集合中的集合中删除所有元素

  • keepAll()  -保留集合中所有还存在于另一个指定集合中的所有元素

  • clear() - 从集合中删除所有元素

  • size() - 返回集合的长度(元素数)

  • toArray() - 返回包含集合中所有元素的数组

  • contains() -  如果集合包含指定的元素,则返回true

  • containsAll() - 如果集合包含指定集合的所有元素,则返回true

  • hashCode() -返回哈希码值(集合中元素的地址)

    map方法

  • Map接口包括Collection接口的所有方法。这是因为Collection是Map的超级接口。

    除了Collection接口中可用的方法之外,Map接口还包括以下方法:

  • put(K,V) - 将键K和值V的关联插入到map中。如果键已经存在,则新值将替换旧值。

  • putAll() - 将指定Map集合中的所有条目插入此Map集合中。

  • putIfAbsent(K,V) - 如果键K尚未与value关联,则插入关联V。

  • get(K) - 返回与指定键K关联的值。如果找不到该键,则返回null。

  • getOrDefault(K,defaultValue) - 返回与指定键K关联的值。如果找不到键,则返回defaultValue。

  • containsKey(K) - 检查指定的键K是否在map中。

  • containsValue(V) - 检查指定的值V是否存在于map中。

  • replace(K,V) - 将键K的值替换为新的指定值V。

  • replace(K,oldValue,newValue) - 仅当键K与值oldValue相关联时,才用新值newValue替换键K的值。

  • remove(K) - 从键K表示的Map中删除条目。

  • remove(K,V) - 从Map集合中删除键K与值V相关联的条目。。

  • keySet() -返回Map集合中存在的所有键的集合。

  • values() -返回一组包含在Map集合中的所有值。

  • entrySet() -返回map中存在的所有键/值映射的集合。

    List接口和Set接口都继承了Collection接口。 但是,它们之间存在一些差异。

  • List可以包含重复的元素。但是,Set不能有重复的元素。

  • List中的元素以某种顺序存储。但是,Set中的元素以组的形式存储,就像数学中的集合一样。

链表(Linked List)是一种常见的数据结构,用于存储和组织数据。它由一系列节点(Node)组成,每个节点包含两个主要部分:数据域(Data)和指针域(Pointer)。


一、LinkedList 和 ArrayList 的区别

LinkedList和ArrayList是Java集合框架中的两种不同的List实现,它们有以下几个区别:

底层数据结构:LinkedList底层基于链表实现,而ArrayList底层基于动态数组实现。

插入和删除操作:由于LinkedList是基于链表的数据结构,插入和删除元素的操作比较高效,时间复杂度为O(1),因为只需要调整节点的指针。而ArrayList的底层是动态数组,插入和删除操作需要移动其他元素,时间复杂度为O(n),其中n是元素的数量。

随机访问:ArrayList支持高效的随机访问,可以通过索引快速获取元素,时间复杂度为O(1)。而LinkedList需要从头开始遍历链表才能找到指定位置的元素,时间复杂度为O(n),其中n是索引位置。

内存消耗:由于LinkedList需要额外的指针来维护节点之间的连接关系,因此在存储相同数量的元素时,LinkedList通常会占用更多的内存空间。而ArrayList只需要连续的内存空间来存储元素。

迭代器性能:对于迭代器遍历操作,LinkedList的性能较好,因为只需要遍历链表中的节点即可。而ArrayList在使用迭代器遍历时,由于底层是数组,可能会导致性能稍差。

总而言之,当需要频繁进行插入和删除操作,而对于随机访问的需求较少时,LinkedList可能是更好的选择。而当需要频繁进行随机访问,而插入和删除操作较少时,ArrayList更为适合。

在Java集合框架中,Queue接口代表了一个队列,它是一种特殊的线性表,只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。队列是一种先进先出(FIFO)的数据结构,即最先插入的元素将最先被删除。Java中的Queue接口提供了多种方法来操作队列中的元素,并且有多种实现类来满足不同的使用场景。

二、Queue常用实现类

LinkedList
LinkedList类实现了Queue接口,因此它可以作为队列使用。由于其内部使用双向链表实现,所以插入和删除操作都具有较高的效率。

PriorityQueue
PriorityQueue是一个基于优先级堆的无界队列。它的头部是按指定排序方式确定的最小元素。如果多个元素都是最小值,则任何一个都可能被找到。

ArrayDeque
ArrayDeque是一个双端队列,实现了Queue接口,也可以当作栈来使用。它通常比LinkedList提供更高的性能,是并发编程中首选的队列实现之一。

ConcurrentLinkedQueue
ConcurrentLinkedQueue是一个适用于多线程编程的线程安全队列,它使用高效的非阻塞算法来实现并发访问。

SynchronousQueue
SynchronousQueue是一个没有存储空间的阻塞队列,它每个插入操作必须等待一个相应的删除操作,反之亦然。

二、Map接口的常用实现类

Java集合框架提供了多种Map接口的实现类,每种实现类都有其特定的使用场景。以下是一些常用的Map实现类:

HashMap:HashMap是Map接口最常用的实现类之一。它基于哈希表实现,提供了快速的插入和查找操作。HashMap允许使用null作为键和值,但不保证元素的顺序。

LinkedHashMap:LinkedHashMap是HashMap的一个子类,它维护了一个双向链表来记录插入的顺序,因此它提供了按照插入顺序遍历元素的功能。

TreeMap:TreeMap是一个有序的Map实现类,它基于红黑树实现。TreeMap会按照键的自然顺序进行排序,也可以通过构造函数传入自定义的Comparator来定义排序规则。

Hashtable:Hashtable是一个线程安全的Map实现类,它不允许使用null作为键和值。Hashtable的性能略低于HashMap,但在多线程环境下更为安全。

ConcurrentHashMap:ConcurrentHashMap是Java 5引入的一个线程安全的Map实现类,它提供了比Hashtable更高的并发性能。ConcurrentHashMap使用了分段锁技术来实现线程安全,并且允许并发地读和写数据。
 

Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。  

特点:

  • 存入顺序和取出顺序不一致,不保证顺序不变,且元素唯一,底层由HashMap实现。

 二、Set接口常用实现类:

  • HashSet:无序并且性能比TreeSet高效,适用于基本的添加、查询元素的场合。
  • TreeSet:采用的二叉树的数据结构,需要采用红黑树算法维护数据的排序,对Set的数据类型有要求(需要实现Comparable接口或者是在TreeSet构造的时候定义排序),性能较HashSet低效,比较适用于需要保持排序的场景。
  • LinkedHashSet:采用的链表维护插入元素的顺序,其他与HashSet无太大差异,性能较HashSet略低(链表开销)。
  • EnumSet:这四种常见Set实现类中最高效的,采用的是位向量的数据结构存储元素(存储高效、紧凑),要求存储元素必须是一个Enum(约束大),适用于枚举值执行批量操作的场景。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值