zoukankan      html  css  js  c++  java
  • 软件测试时Java面试题

    目录

    1、Java常用的数据类型

    2、Java中arrayList和array的区别

    3、Java中list、set和map的区别

    4、Object类下常用的方法

    5、equals()方法和“==”的区别

    6、java中创建对象的方式

    7、final关键字

    8、java 中操作字符串都有哪些类?它们之间有什么区别? 

    1、Java常用的数据类型

      分类 数据类型 占用二进制字节 举例 类型默认值 基本数据类型封装类

    基本数据类型

    (四类八种)

    整型 字节型(byte) 8位 byte a = 100 0 Byte
    短整型(shot) 16位 short s = 1000 0 Short
    整型(int) 32位 int a = 100000 0 Integer
    长整型(long) 64位 long a = 100000L 0L Long
    浮点型 单精度(float) 32位 float f1 = 234.5f 0.0f Float
    双精度(double) 64位 double d1 = 123.4 0.0d Double
    字符型 字符型(char) 16位 char letter = 'A' 'u0000' Character
    布尔型 布尔型(boolean) 1位 boolean one = true false Boolean
    引用数据类型 calss     null  
    接口 interface     null  
    数组 arr     null  
    空类型 null     null  

    数据类型转换图标(图片来源:https://www.cnblogs.com/liangxiaofeng/p/5721506.html

    PS:黄色标示需要强制转换,蓝色标示自动转换,白色标识不需要转换

    2、Java中arrayList和array的区别

    array:数组,容量固定不可变,同一个数组只能存放类型一样的数据(基本数据类型/引用数据类型),声明时必须指定长度,使用效率比集合高

    1 int[] a=new int[10];
    2 int a[]=new int[10];
    3 int a[]={1,2,3,4};

    arrayList:动态数组(集合的一种),数组的一种高级实现,容量可变,可动态的添加、删除元素,只能存储引用数据类型,声明时不必须指定其长度,使用效率比数组低。

    1 ArrayList list = new ArrayList(10);
    2 ArrayList list1 = new ArrayList(); 

    3、Java中list、set和map的区别

    list、set和map都属于集合接口,都在java.util包下面:

    接口

    继承的接口 区别 相关常见实现类 实现类的特点
    list列表 collection接口 有序(每个元素对应一个下标)、元素可重复、可插入多个null值作为元素,可用for循环和迭代器进行遍历 ArrayList动态数组 动态数组,不带泛型的时候允许任何符合规则的元素插入,可自动扩容,可根据下标随机访问元素,非同步,查询优于LinkedList,增删逊于LinkedList(需要移动数据)
    LinkedList双向链表 不能随机访问,从链表两端开始遍历查找,非同步
    Vector矢量 操作与ArrayList相同,同步,线程安全
    Stack堆栈,继承自Vector 继承自Vector,后进先出,常用方法push()pop()peek()获取栈顶元素empty()判断堆栈是否为空search()

    set

    集合

    collection接口 无序(本身顺序按照元素本身的hashCode排列),元素不可重复、最多只能有一个null元素,只能用迭代器进行遍历 HashSet 号称查询最快的集合,元素顺序取决于元素的哈希码,不能保证元素顺序不变
    TreeSet 由二叉树对实现,基于TreeMap,不允许由null值,使用元素值的自然顺序排列
    LinkedSet 根据元素的哈希值决定元素的存储位置,同时使用链表维护元素的顺序,遍历时以元素添加时的顺序进行访问,访问速度优于HashSet,插入性能逊于HashSet
    EnumSet

    map

    映射

    map集合中每个元素包含一个键值对,键key不可重复,键对应的值value可重复

    HashMap

    继承自AbstractMap类,可接受为null的键值(key)和值(value),线程不安全 

    HashTable

    继承自Dictionary类,不接受为null的键值(key)和值(value),线程安全

    TreeMap
    WeakHashMap  基于java弱引用,对象随时可能被回收,适用于缓存

    4、Object类下常用的方法

    https://www.cnblogs.com/qwddqy/p/7570850.html(详细)

    Object类是所有类的父类,位于java.lang包中,数组也是Object类的子类。任何类的对象,都可以调用Object类中的方法,包括数组对象。

    Object类的常用方法

    •  toString方法;
      1.    toString方法可以将任何一个对象转换成字符串返回,返回值的生成算法为:getClass().getName() + '@' + Integer.toHexString(hashCode())。
    •  equals方法;
      1.    Object类中的equals方法,用来比较两个引用的虚地址。当且仅当两个引用在物理上是同一个对象时,返回值为true,否则将返回false。
      2. 任何类可以根据实际需要,覆盖toString及equals方法,实现自定义的逻辑。
    • hashCode方法;

      1. 获取对象的哈希码值,为16进制。

    5、equals()方法和“==”的区别

     equals()比较两个对象的地址,“==”比较两个对象的值(内容)

    • equals方法与hashCode方法关系(详细:https://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html
      •  如果两个对象使用equals比较返回true,那么它们的hashCode值一定要相同。
      • 如果两个对象equals比较返回false,那么它们的hashCode值不一定不同,重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。如果你不按照规范来,就不一定相同了。

    6、java中创建对象的方式

     详细:https://www.cnblogs.com/wxd0108/p/5685817.html

    使用new关键字

    最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

    Employee emp1 = new Employee();
    } → 调用了构造函数
    使用Class类的newInstance方法

    可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

    1. Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
    2. 或者
    3. Employee emp2 = Employee.class.newInstance();
    } → 调用了构造函数
    使用Constructor类的newInstance方法

    和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。

    1. Constructor<Employee> constructor = Employee.class.getConstructor();
    2. Employee emp3 = constructor.newInstance();
    } → 调用了构造函数
    使用clone方法

    无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

    要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

    Employee emp4 = (Employee) emp3.clone();
    } → 没有调用构造函数
    使用反序列化

    当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
    为了反序列化一个对象,我们需要让我们的类实现Serializable接口

    1. ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
    2. Employee emp5 = (Employee) in.readObject();
    } → 没有调用构造函数

    7、final关键字

    final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量 )

    被修饰的类不能被继承,被修饰的方法不能被重写,被修饰的变量只能被赋值一次( 基本类型不能修改初始值,引用数据类型不能修改初始址)

    8、java 中操作字符串都有哪些类?它们之间有什么区别? 

    StringStringBufferStringBuilder

    继承关系 特性 常用方法
    String
    1. public final class String
    2. extends Object
    3. implements Serializable, Comparable<String>, CharSequence
    • 常量,创建之后不可变
    • 处理少量数据

    String()

    contains()

    equals()

    format()

    length()

    ...

    StingBuffer
    1. public final class StringBuffer
    2. extends Object
    3. implements Serializable, CharSequence
    • 对象,可变字符序列
    • 线程安全,可用于多线程
    • 处理大量数据 

    append()末尾增加元素

    insert()指定位置插入元素

    ...

    StringBuilder
    1. public final class StringBuilder
    2. extends Object
    3. implements Serializable, CharSequence
    • 对象,可变字符序列
    • 线程不安全,不适合多线程
    • 处理 大量数据 

    append()末尾增加元素

    insert()指定位置插入元素

    ....

  • 相关阅读:
    53. Maximum Subarray
    Search Insert Position
    Single Number II
    260. Single Number III
    136. Single Number
    338. Counting Bits
    axios实现拦截器
    Vuex入门(5)—— 为什么要用Action管理异步操作
    ES6语法(3)—— 用promise()对象优雅的解决异步操作
    Vuex之理解Getters的用法
  • 原文地址:https://www.cnblogs.com/vickyx/p/13821024.html
Copyright © 2011-2022 走看看