面试题

Posted macht

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题相关的知识,希望对你有一定的参考价值。

面试题

增强for循环

增强for循环,循环的一种,主要用于遍历容器。而且只能进行一层容器的循环。
格式:

```java
for(容器内元素类型 变量i:容器名数据源){
    他会把容器里面的内容,依次的赋给变量i,这是后i就是容器中元素的类型。
}
```
```
    for(int x:arr) {
    System.out.print(x + " ");//foreach循环逐个输入数组元素的值
    }
```

注:

  • 没有下标
  • 当遍历的是容器,并且不需要下标控制时,采用foreach

Collection Iterable Iterator Map Set List的关系

声明介绍:

  • Set、List是接口,父接口是Collection,Collection的父接口是Iterable。
  • Iterator是类是迭代器类里面提供了三个方法,就是为了实现一个遍历的功能罢了,是一个功能工具类。
  • Map是接口没有父级接口没有父类,它是他这个体系的顶级接口。和Collection、Iterator、Iterable没有任何关系。
  • Iterable是接口是他这个体系的顶级接口。其下有Collection下有Set、List
  1. Iterable这个接口里面提供了一个iterator()抽象方法,这个方法是能够创造一个Iterator这个对象。这能够直接实现迭代实现遍历。因为iterator()这个方法,这就导致他的所有子孙都具有直接遍历的功能。
  2. 因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
    • 如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
    • 当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
    • 除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
    • 但即时这样,Collection也只能同时存在一个当前迭代位置。
    • 而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
    • 多个迭代器是互不干扰的。
      总结:Iterator是迭代器类他可以让我们进行遍历功能。Iterable是接口它里面有个方法叫iterator()。这个方法能够在内部创建Iterator类的对象,这样他就和Iterator取得了联系能够使用其中的方法,具备了迭代的功能,子类也具备了。但是Map没有这个内部没有提供Iterator()方法所以无法直接进行遍历,但是他有keySet()方法和entrySet()方法能够获得键和关系然后和Set进行结合可以间接的使用Iterator类来遍历Map。

Map遍历

Map集合遍历的四种方式理解和简单使用
Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值

1:无非就是通过map.keySet()获取到值,然后根据键获取到值

  for(String s:map.keySet()){
System.out.println("key : "+s+" value : "+map.get(s));
}

2:通过Map.Entry(String,String) 获取,然后使用entry.getKey()获取到键,通过entry.getValue()获取到值

  for(Map.Entry<String, String> entry : map.entrySet()){
System.out.println("键 key :"+entry.getKey()+" 值value :"+entry.getValue());
}

3:其中通过Iterator也是为了最终获得entry,所以理解其用法,可以很好的使用和掌握

package com.bie;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/** 
* @author BieHongLi 
* @version 创建时间:2017年2月25日 下午8:58:54 
* 
*/
public class MapTest01 {

    public static void main(String[] args) {
        Map<String, String> map=new HashMap<String, String>();
        map.put("张三1", "男");
        map.put("张三2", "男");
        map.put("张三3", "男");
        map.put("张三4", "男");
        map.put("张三5", "男");
        
        //第一种遍历map的方法,通过加强for循环map.keySet(),然后通过键key获取到value值
        for(String s:map.keySet()){
            System.out.println("key : "+s+" value : "+map.get(s));
        }
        System.out.println("====================================");
        
        //第二种只遍历键或者值,通过加强for循环
        for(String s1:map.keySet()){//遍历map的键
            System.out.println("键key :"+s1);
        }
        for(String s2:map.values()){//遍历map的值
            System.out.println("值value :"+s2);
        }
        System.out.println("====================================");    
        
        //第三种方式Map.Entry<String, String>的加强for循环遍历输出键key和值value
        for(Map.Entry<String, String> entry : map.entrySet()){
            System.out.println("键 key :"+entry.getKey()+" 值value :"+entry.getValue());
        }
        System.out.println("====================================");
        
        //第四种Iterator遍历获取,然后获取到Map.Entry<String, String>,再得到getKey()和getValue()
        Iterator<Map.Entry<String, String>> it=map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry<String, String> entry=it.next();
            System.out.println("键key :"+entry.getKey()+" value :"+entry.getValue());
        }
        System.out.println("====================================");
        
    }
    
    
}

4:Map的一些常用的知识点,和取值的变形形式,都需要掌握和了解

package com.bie;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/** 
* @author BieHongLi 
* @version 创建时间:2017年2月26日 上午11:29:59 
* 
*/
public class MapTest02 {

    public static void main(String[] args) {
        //1:key,value都是object类型的
        //2:key必须是唯一的,不唯一,那么后面的value会把前面的value覆盖
        //3:对于HashMap,key可以为空
        //4:value可以为空,也可以为空
        //5:HashTable的key和value不能为空
        //6:properties的key和value必须为String类型的
        Map<String , String> map=new HashMap<>();
        map.put("null", "this is null 1");
        map.put("null", "this is null 2");
        System.out.println(map.size());
        System.out.println(map.get(null));
        
        System.out.println("=============================");
        //循环显示map类型的key以及对应的value
        //三个集合,key的集合,value的集合,键值对的集合
        Set<String> keys=map.keySet();
        for(String s:keys){
            System.out.println(s);
        }
        System.out.println("=============================");
        Collection<String> values=map.values();//值的集合
        System.out.println(values);
        System.out.println("=============================");
        Set<Map.Entry<String, String>> entrys=map.entrySet();//键值对的集合
        for(Map.Entry<String, String> entry:entrys){
            System.out.println(entry.getKey()+" "+entry.getValue());
        }
        
    }
}

其他注意

  1. 当取得类名和jdk中的类名相同时,当然这是不合法的,但是也可以。那么调用的时候,可以用包.类名来精确的调用一个特别的类。
  2. Scanner 的next 方法是不能接受空格的,他把空格作为结束符。line()可以接受空格。
  3. 注意:关资源的时候先开的后关,注意原则,因为他们有一种依赖关系在。
  4. 非常值得注意的是,Map的entrySet()返回的是一个Map关系,所以一定要使用Map.Entry<>类型的进行接收。一定要记住它是一个关系。
  5. keySet()获取的是键值,只要键是什么类型就要用什么类型来存储,获取之后可以用键值获取value值。
  6. 在阿里巴巴开发指南中不建议使用keySet因为keySet是要循环两次所以浪费了。

Java的内存分配上,主要分4个块!

  1. 一块是用来装代码的,就是编译的东西。
  2. 一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
  3. 一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
  4. 一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!
    所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!
  5. Java中的类是放在方法栈中的

==和equals

基本类型==比较的是值,int比较的是值,若两个都是int比的是值,一个int一个integer会自动拆箱比较值。两个都是integer比较的是地址。

以上是关于面试题的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶之光!2021必看-Java高级面试题总结

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

一道经典面试题:字符串在Java中如何通过“引用”传递

Mybatis最全的高质量面试题和答案—3

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

前端面试题-