面试题
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
- Iterable这个接口里面提供了一个iterator()抽象方法,这个方法是能够创造一个Iterator这个对象。这能够直接实现迭代实现遍历。因为iterator()这个方法,这就导致他的所有子孙都具有直接遍历的功能。
- 因为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());
}
}
}
其他注意
- 当取得类名和jdk中的类名相同时,当然这是不合法的,但是也可以。那么调用的时候,可以用包.类名来精确的调用一个特别的类。
- Scanner 的next 方法是不能接受空格的,他把空格作为结束符。line()可以接受空格。
- 注意:关资源的时候先开的后关,注意原则,因为他们有一种依赖关系在。
- 非常值得注意的是,Map的entrySet()返回的是一个Map关系,所以一定要使用Map.Entry<>类型的进行接收。一定要记住它是一个关系。
- keySet()获取的是键值,只要键是什么类型就要用什么类型来存储,获取之后可以用键值获取value值。
- 在阿里巴巴开发指南中不建议使用keySet因为keySet是要循环两次所以浪费了。
Java的内存分配上,主要分4个块!
- 一块是用来装代码的,就是编译的东西。
- 一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
- 一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
- 一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!
所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西! - Java中的类是放在方法栈中的
==和equals
基本类型==
比较的是值,int比较的是值,若两个都是int比的是值,一个int一个integer会自动拆箱比较值。两个都是integer比较的是地址。
以上是关于面试题的主要内容,如果未能解决你的问题,请参考以下文章
经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试