集合面试

集合又称为对象的容器

常见的数据结构

  • 数组:查询快,增删慢
  • 链表:增删快,查询慢
  • 双向链表:
  • 哈希表:哈希值除以16取余,得到的结果作为索引放在对应的数组中。
    • 两个数据除以16余数相同,比较哈希值是否相同。
      • 哈希值不同,第二个数据放在第一个数据下方,构成链表数据结构
      • 哈希值相同,比较内容是否相同,内容不同,构成链表结构。内容相同,不予存储。

Java的容器有哪些

  • Collection(单列集合): List、Set

  • Map(双列集合):HashMap

  • List:ArrayList、LinkedList、Vector

  • Set:HashSet、TreeSet

数组和集合的区别:

  • 数组:数组一经创建,长度无法改变。数组能存储基础类型数据和引用类型数据
  • 集合:集合长度可变。集合只能存储引用数据类型(集合存储基本数据类型存在一个自动装箱过程)

List和Set、Map的区别:

  • List:有序(存入数据和取出数据顺序相同),有索引,元素可以重复

  • Set:无序(存入数据和取出数据顺序不同),无索引,元素不能重复

  • Map:键值对形式存放数据,每一个键值对称为一个entry

    • 键:无序,无下标,不允许重复
    • 值:无序,无下标,可以重复

迭代器Iterator和增强for循环

  • 迭代器的使用:集合对象调用iterator()方法获取一个迭代器

    Collection<String > list =new ArrayList<>();
    list.add("spring");
    list.add("summer");
    list.add("fall");
    //获取集合的迭代器
    Iterator<String> it=list.iterator();
    //遍历集合数据
    while(it.hasNext()){
        System.out.println(it.next());
    }
    
  • 增强for循环:是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的,它的内部原理其实是个Iterator迭代器,所以在遍历过程中,不能对集合中的元素进行增删操作。

    ArrayList<String> list=new ArrayList<>();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    for(String s:list){
        System.out.println(s);
    }
    
  • 通过迭代器或者增强for循环(for-each)遍历集合时,集合内的元素不能发生改变,否则会报并发修改异常,使用普通for循环即可解决该问题。

Iterator 和 ListIterator 有什么区别

  • Iterator :可以遍历list和set集合,从前往后进行遍历。遍历期间不能对集合中的元素进行操作。
  • ListIterator :只能遍历list集合,既可以向前遍历也可以向后遍历。遍历期间可以对元素进行操作。

ArrayList 和 LinkedList 的区别是什么

  • ArrayList :底层数据结构是数组,有索引,查询快,增删慢。
  • LinkedList :底层数据结构是双向循环链表(每个节点包含上一个元素和下一个元素的地址),查询慢,增删快。有对头节点和尾节点操作的一些方法。

HashMap的原理

HashMap使用的是hash表数据结构。(数组+链表)

  • JDK1.8之后(包括1.8),当数组长度大于64,且链表长度大于8时,链表结构转换为红黑树结构。提高查询效率。

put方法

  • 当向hashMap中放入元素时,会对该元素进行哈希计算。根据结果放在相应的数组位置。
  • 如果第2个元素和第1个元素的哈希计算结果相同,JDK1.8之后采用尾插法,该元素放在第一个元素后面形成链表结构。如果链表长度大于8且数组长度大于64,该链表自动转换为红黑树结构。

get方法

  • 当从hashMap中取数据时,会根据该数据的哈希计算结果确定所在数组位置,然后从链表头部开始向下查询,找到内容和所查找内容相同的数据。

HashSet的原理

  • HashSet底层就是创建一个HashMap
  • HashSet的数据存放在HashMap的key中,Value的值都为PRESENT

如何实现数组和集合之间的转换

  • 数组转集合:Arrays.asList()
  • 集合转数组:ArrayList中的toArray()方法。

如何遍历HashMap中的数据

- keySet():获取所有的key值,然后通过get(key)获取值
- entrySet():获取所有的entry,然后通过getKey(),getValue()获取键和值。

如何确保集合内容不能被修改。

- 通过Collections.unmodifiableCollection(list)方法。
- 使用Arrays.asList(array)把数组转换为集合。

写一个冒泡排序

public int[] sort(int[] args){
    for(int i=0;i<args.length-1;i++){
        for(int j=0;j<args.length-1-i;j++){
            //创建一个临时变量,如果左边大于右边,互换位置
            if(args[j]>args[j+1]){
                int temp = args[j];
                args[j]=args[j+1];
                args[j+1]=temp;
            }
        }         
    }
 return int[];
}

用JAVA代码实现如下要求:给定一个整数数组,要求返回其中两个整数,使得这两个整数相加能得到一个特定的结果,示例如下:

给定整数数组: nums = [2, 7, 11, 15] ,
给定特定结果: target = 9,
因为2 + 7 = 9, 因此程序返回[2, 7]

public int[]  test(int[] nums, int target)
  {
      int a, b;
      for (int i = 0; i < nums.length; i++)
      {
          a = nums[i];
          b = target - a;
          for (int j = 0; j < nums.length; j++)
          {
              if (i != j)
              {
                  if (b == nums[j])
                  {
                      int[] ints = new int[2];
                      ints[0]=a;
                      ints[1]=b;
                      return ints;
                  }
              }
          }
      }
     return null;
  }

创建数组的几种方式

//创建一个长度为2的空数组
int[] arr=new int[2];
arr[0]=1;
arr[1]=2;


//创建数组的时候就为其赋值
int[] arr2={1,2};

int[] arr3=new int[]{1,2};

posted @ 2022-03-11 14:29  初夏那片海  阅读(116)  评论(0)    收藏  举报