JAVA后端面试整理-基础类

212 阅读23分钟
  • 本文主要记录一些网上收集到的面试题。
  • 主要收录一些初级面试题。
  • 为了强化记忆并且集中注意力,所以我手打录入所有试题和答案
  • 标准答案下会有一些我的理解,本人小白请轻喷

1.JDK和JRE有什么区别?

JRE:Java Runtime Environment Java运行环境

JDK:Java Development Kit Java开发环境包

JRE:Java运行时环境,包含了Java虚拟机,Java基础库类。是Java程序运行所需要的环境,使用者只需要JRE就能运行Java程序。

JDK:Java开发工具包,编写Java程序所需要的开发工具包。JDK内含有JRE,编译器javac,还有很多Java程序调试解析工具,Java程序所需要的文档deml例子程序。

2. == 和 equals的区别?

1.功能不同

==是判断对象间的地址是否相同(基本类型比较值,引用类型比较内存地址)

equals()是比较对象间数值是否相同

2.定义不同

==是java运算符

equals是方法

3.两个对象的hashCode()相同,equals()是否为ture?

不一定,equals相同则hashCode()相同,反之则不然

重写equals()方法,必须重写hashCode()方法

例子:取余num%3,num为1或4时结果都为1,此时equals不同。

4.final在Java中的作用

1.修饰类:表示该类不能被继承;

2.修饰方法:表示该方法不能被重写;

3.修饰变量;表示变量只能一次赋值,之后值不能被修改。拓展:当修饰一个对象时,引用在初始化后将被锁定 内存地址,但内存地址中的值可改变;

5.Java中的Math.round(-1.5)等于多少(答:-1)

将小数变成整数:

round():四舍五入

ceil():取较大整数;0以上整数+1,0以下整数+0;

tail():取较小整数;与ceil()相反

6.String属于基础类型吗

不属于,String是常用的引用类型

Java8种基础类型:byte、short、char、int、long、float、double、boolean

7.Java种操作字符串都有哪些类?它们之间有什么关系?

String、 StringBuffer、StringBuilder

String 是不可变对象,每次更改会生成新的对象

StringBuffer与StringBuilder是可改变对象的

StringBuffer:线程安全,可用于多线程

StringBuilder:线程不安全,单线程

运行速度:越安全的越慢。StringBuilder > StringBuffer > String

8.String str=“i”与String str=new String(“i”)一样吗?

不一样,前者是将i存储在常量池中,i的值相同时,地址也会相同。可用==。new一个i后会在堆中创建新对象,就类似于将i放在了其它地方,地址不相同。

9.如何将字符串反转?

将String转成StringBuffer(这会使字符串转变为字符集合),然后用reverse()方法就实现了字符集合的顺序反转,然后toString。

10.String 类的常用方法有哪些?

  • equals:比较字符串是否相同;
  • equalslgnoreCase:无视大小写比较字符串是否相同;
  • indexOf(String str,String formIndex):目标字符或字符串在源字符串中的位置(下标);
  • lastIndexOf:目标字符或字符串最后一次出现的位置(下标);
  • valueOf():其它类型转字符串;
  • charAt():获取指定位置(下标)的字符;
  • isEmpty:字符串长度是否为0;
  • $.contains() :判断源字符串是否含有目标字符串;
  • strartsWith(str,beg,end):在beg与end间查看是否已目标字符串开头;
  • endsWith:是否以目标字符串结束;
  • formart:格式化字符串(要记转换符);
  • getChars(strBegin,strEnd,[],detBegin):获取字符串的制定长度字符数组;
  • toCharArray:获取字符串的字符数组;
  • join:以某字符串连接某字符串数组;
  • length:字符串字符数;
  • reolace:字符串替换;
  • toLowerCase:字符串全部变为小写;
  • toUpperCase:字符串全部变为大写;
  • trim:首位去除空格;

11.抽象类必须有抽象方法吗?

抽象类中不一定要有抽象方法,但有抽象方法一定是抽象类

12.普通类和抽象类有些区别?

1.普通类可以被实例化(new),抽象类不行

2.抽象方法的必须有子类实现所有抽象方法

13.抽象类能使用final修饰吗?

final不能修饰抽象类,final修饰不能继承,但是抽象类必须要继承

14.接口和抽象类的区别

  • 这个居然有秒懂百科

1.抽象类要被继承,接口要被实现

2.抽象类可以做方法申明或方法实现,接口只能做方法申明

3.抽象类的变量是普通变量,接口只能用公共静态变量

4.抽象是重构的结果,接口是设计的结果

5.抽象类和接口都是抽象具体对象,但接口的抽象级别最高

6.抽象类可以有具体方法属性,接口只能有抽象方法和不可变常量

7.抽象类主要用来抽象类别,接口主要用来抽象功能

15.Java中IO流分为几种?

1.按流向分:输入流和输出流 Input/OutputStream

2.按操作单元分:字节流和字符流 InputStream/Reader/Writer

3.按流的角色:节点流和处理流

16.BIO、AIO、NIO的区别

烧开水场景模型

N.B.AIO (☄⊙ω⊙)☄

NIO:同步非阻塞I/O;不断轮回询问事物是否发生改变,改变后再进行下一步

BIO:同步阻塞I/O;一次只做一件事

AIO:异步非阻塞I/O;当事物发生变化后,系统通知线程,然后再进行下一步

17.File的常用方法

  • Files.exists()检测文件;路径是否存在
  • Files.createFile()创建文件
  • Files.createDirectory()创建文件夹
  • Files.delete()删除文件或者目录
  • .copy()复制文件
  • .move()移动文件
  • .size()查看文件个数
  • .read()读取文件
  • .write()写入文件

18.基本类型和包装类对象使用 == 和 equals

1.变量值不同是为false

2.变量值相同时:

  • 基本类型与基本类型比,==返回true
  • 基本与包装比,两者返回true
  • 包装与包装比,==返回false,equals返回true

19.什么是装箱?什么事拆箱?装箱和拆箱的执行过程?

装箱:基本类变成包装类 拆箱:包装类变为基本类

执行过程:

  • 装箱时调用包装器类的ValueOf方法实现
  • 拆箱是通过调用包装器类的 ***Value方法实现的

常见问题:

  • 整数型包装leivalueOf方法返回对象时,在常用的取值范围内,会返回缓存对象
  • 浮点型包装类valueOf方法返回新的对象
  • 布尔型的包装类valueOf方法Boolean类的静态常量true|false
  • 算数运算会触发自动拆箱

20.final finally finalize()区别

  • fianl:用于修饰类,方法,变量。修饰变量,变量的地址无法修改;修饰方法,方法不能被重写;修饰类,该类不能被继承
  • finally:用于try/catch语句中,表示无论发生什么一定会执行
  • finalize():finalize()是Object里的方法,当垃圾收集器将对象从内存中清除出去前被调用,一般有JVM调用

21.finally语句块一定执行吗?

不一定

这些情况下不行:

  • 运行try前就返回值,则执行不try/catch语句块
  • 运行异常
  • 退出系统,exit强制退出

22.return与finally的执行顺序对返回值得影响

  • fianlly没有return,即使语句内给变量重新赋值也无效
  • try和finally内都含有return,则返回finally语句内的return值

23.String对象中的replace与replaceAll的区别

  • replace 方法: 可用于字符或字符串的替换
  • replaceAll方法:基于正则表达式的字符串替换

7月24日

24.throw和throes的区别?

throw:

  • 表示方法内抛出某种异常对象(一个)
  • 用于程序员自行产生并抛出异常
  • 位于方法体内部,可以作为单独语句使用
  • 如果异常对象是非RuntimeException 则需要在方法申明时加上该异常的抛出,即需要加上throw是语句或者在方法体内try/catch处理该异常,否则编译报错
  • 执行到throw语句则后面的语句块不再执行

throws:

  • 方法的定义上使用throws表示这个方法可能抛出某些异常(可多个)
  • 用于声明在该方法内抛出异常
  • 必须跟在方法参数列表的后面,不能单独使用
  • 需要有方法的调用者进行异常处理

25.常见的异常类有哪些?

错误error和异常exception 异常分为一般异常和运行时异常

26.什么是java内部类

1.成员内部类

2.方法内部类

3.匿名内部类:继承;接口;参数

4.静态嵌套类

内部类的作用:

  • 内部类提供了莫衷进入其继承的类或现实的接口的窗口
  • 与外部类无关,独立继承其他类或实现接口
  • 内部类提供了java的“多重继承”的解决方案,弥补了java类是单继承的不足

特点:

  • 内部类任然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
  • 内部类不能用普通的访问方式。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private
  • 内部类声明成静态的,就不能随便的刚问外部类的成员变量,此时内部类只能访问外部类的静态成员变量

27.什么是反射?有什么作用?

java反射,就是运行状态中

  • 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器、modifiers(public、static)、父类、现实接口等
  • 获取任意对象的属性,并且能改变对象的属性
  • 调用任意对象的方法
  • 判断任意一个对象所属的类
  • 实例化任意一个类的对象

java的动态就体现在反射。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的国度使用会严重消耗系统资源

JDK中java.lang.Class类,就是为了实现反射提供的核心类之一

一个JVM中一种Class只会被加载一次

28.动态代理是什么?应用场景?

动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法

应用场景:

  • 统计每个api的请求耗时
  • 统一的日志输出
  • 校验被调用的api是否已经登录和权限鉴定
  • Spring的AOP功能模块就是采用动态代理的机制来实现切面编程

29.怎样实现动态代理

  • JDK动态代理
  • CGLib动态代理
  • 使用Soring aop 模块完成动态代理功能

30.什么是java序列化?什么情况下需要序列化?

序列化:将java对象转换成字节流的过程 反序列化:将字节流转换成Java对象的过程

当java对象需要在网络上传输或者持久化存储到文件中,就需要进行序列化操作

注意事项:

  • 某个类可以被序列化,则其子类也可以被序列化
  • 对象中的某个属性是对象类型,需要序列化也必须实现Serializable接口
  • 声明static和transient的成员变量,不能被序列化。static成员变量是描述类级别的属性,transient表示临时数据
  • 反序列化读取序列化对象的顺序要保持一致

31.什么场景要对象克隆

  • 方法需要return引用类型,但又不希望自己持有引用类型的对象被修饰
  • 程序之间方法的调用时参数的传递。威力保证引用累心的参数不被其他方法修改

32.深拷贝与浅拷贝的区别

浅拷贝:复制基本类型的属性; 引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象指针,不复制堆内存中的对象

深拷贝:复制基本类型的属性; 引用类型的属性复制,复制栈中的变量和变量指向堆内存中的对象的指针和堆内存中的对象

33.java跨平台运行的原理

  1. java源文件要先编译成与操作系统无关的.class字节码文件,然后字节码文件再通过java虚拟机解释成机器码运行

  2. .class字节码文件面向虚拟机,不面向任何操作系统

  3. 不同平台的虚拟机是不同的,但它们给JDK提供了相同的接口

  4. java的跨平台依赖于不同系统的java虚拟机★

34.i++和++i的区别

  • i++先运算后加1
  • ++i先加1后运算

35.&和&&的区别

&:

  1. 逻辑与;&两边的表达式都会进行运算
  2. 整数的为运算符

&&: 短路与;&&左边表达式结果为false时,&&右边的表达式不参与计算

36.|与||的区别

都表示或;参考&与&&区别

37.java中基本类型转换规则

自动转换:低级向高级转换 强制转换:高级向低级转换,会丢失精度

38.if*else与switch区别

if-else:

  • 适合分支较少情况
  • 判断条件类型不单一
  • 满足条件即停止对后续分支语句的执行

switch:

  • 适合分支较多情况
  • 判断条件单一
  • 没有break,则会使每个分支都运行

39.while和do-while区别

  • while先判断后执行,第一次判断为false,循环体一次都不执行
  • do-while先执行后判断,无论判断结果都会先执行一次;常被while(true)取代;

40.java中数组有什么特性

  • 在内存中申请一块连续空间
  • 数组下标从0开始
  • 每个数组元素都有默认值,基本类:0、0.0、false;引用:null
  • 数组的类型只能是一个,且固定,在申明时确定
  • 数组的长度已经确定,无法改变。

41.类和对象的关系

  • 类是对象的抽象;对象是类的具体实例
  • 类是抽象的,不占用内存;对象是具体的,占用存储空间
  • 类是一个定义包括在一类对象中的方法和变量的模板

42.方法重载和重写是什么?有什么区别?

  • 重写:在子类中将父类的成员方法的名称保留,重新编写成员方法的实现内容,更改方法的访问权限,修改返回类型的为父类返回类型的子类

    • 重写发生在子类继承父类
    • 重写父类方法时,修改方法的权限只能从小范围到大范围
    • final、static、private修饰的方法不能被重写
  • 重载:一个类中允许同时存在一个以上的同名方法,这些方法的参数或者类型不同

    • 重载条件:方法名相同;参数类型不同或个数不同或顺序不同
    • 可以修改返回类型
    • 可以修改访问修饰符
    • 可以修改异常抛出
    • 能在同一个类中或者在一个子类中被重载

区别:

  • 作用范围:重写的作用范围是父类和子类之间;重载时发生在一个类里面
  • 参数列表:重载必须不同;重写不能修改
  • 返回类型:重载可修改;重写返回相同类型或子类
  • 抛出异常:重载可修改:重写只可减少或删除
  • 访问权限:重载可修改;重写一定不能做更严格的限制

43.java中接口的访问修饰符

  • 接口的访问修饰符只能是public 或default
  • 接口中所有方法默认都是abstract,但通常省略

44.this和super关键字作用

this:

  • 对象内部指代自身的引用
  • 解决成员变量和局部变量同名问题
  • 可以调用成员变量
  • 不能调用局部变量
  • 可以调用成员方法
  • 在普通方法中可以省略
  • 在静态方法中不能出现this关键字

super:

  • 代表对当前对象直接父类对象的引用
  • 可以调用父类的费private成员变量和方法
  • super();可调用父类的构造方法,只限构造方法中使用,且必须是第一条语句

45.static关键字的作用是什么?

  • static可以修饰变量、方法、代码块和内部类
  • static变量是这个类所有,由该类创建的所有对象共享同一个static属性
  • 可以通过创建的对象名.属性名和雷明.属性名两种方式访问
  • static变量在内存中只有一份
  • static修饰的变量只能是类的成员变量
  • static方法可以通过对象名.方法名和类名.方法名两种访问
  • static代码块在类被第一次加载时执行静态代码块,且只被执行一次,主要作用hi实现static属性的初始化
  • static内部类属于整个外部类,而不属于外部类的每个对象,只能访问外部类的静态变量和方法

46.abstract关键字的作用是什么?

  • 可以修饰类和方法
  • 不能修饰属性和构造方法
  • abstract修饰的类是抽象类,需要被继承
  • abstract修饰的方法时抽象方法,需要子类被重写

47.java多态

实现多态的是三个条件

  • 继承的存在。继承是多态的基础,没有继承就没有多态
  • 子类重写父类的方法,JVM会调用子类重写后的方法
  • 父类引用变量指向子类对象

向上转型:将一个类的引用指向一个子类对象,自动进行类型转换

  • 通过父类引用变量调用的方法是子类覆盖或继承父类的方法,而不是父类的方法
  • 通过父类引用变量无法调用子类特有的方法

向下转型:将一个指向子类对象的引用赋给一个子类的引用,必须进行强制类型转换

  • 向下转型必须转换为父类引用指向的真实子类类型,不是任意的强制转换,否则会出现ClassCastExcrption
  • 向下转型时可以结合使用instanceof运算符进行判断

**7月27日

48.内存泄漏和内存溢出的区别

  • 内存溢出:指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory
  • 内存泄漏:指程序在申请内存后,无法释放已申请的内存空间,内存泄漏堆积会导致内存被占光。最终导致溢出。

49.Math.random()的返回值

greater than or equal to 0.0 and less than 1.0

50.同步代码块和同步方法的区别

  • 同步方法就是方法前加关键字 synchronize;同步代码块则是在方法内部使用synchronize
  • 加锁对象相同的话,同步方法锁的范围大于等于同步方法块。一般加锁范围越大,性能越差
  • 同步方法如果是static方法,等同与同步方法块加锁在该Class对象上

51.静态内部类和非静态内部类区别

  • 静态内部类不需要指向外部类的引用;非静态内部类需要持有对外部类的引用
  • 静态内部类可以有静态方法、属性;非静态内部类则不能有静态方法、属性
  • 静态内部类只能访问外部类的静态成员,不能访问外部类的非静态成员;非静态内部类能够访问外部类的静态和非静态成员
  • 静态内部类不依赖与外部类的实例,直接实例化内部类对象;非静态内部类通过外部类的对象实例生成内部类对象

52.存在 i+1<i 的数吗?

存在。Integer.XAX_VALUE

53.接口可否继承接口? 抽象类是否可实现接口?抽象类是否是继承实体类?

可以

54.fianl修饰变量,是引用能变还是引用的对象不能变?

  • final修饰基本类型变量,值不能变
  • final修饰引用类型变量,栈内存中的引用不能改变,锁指向的堆内存中的对象的属性值可能改变

55.如果有两个类A、B,如何编写C类同时使用这两个类的功能

让A、B成为父子类,C类继承子类

56.构造方法是否能被重载、重写?

能被重载不能被重写

57.基本类型byte范围

-128至127

58.switch语句中没有break语句会穿透之后的条件

59.System.out.println('a'+1);

结果是:98 a转为ASCII,值97

60.二进制,小数点右移一位,值会怎样?

相当于乘以2

61.short s = 1;s = s + 1;

表达式错误,需要强转int 可写为s += 1;

62.内部类可以引用它的外部类的成员吗?

  • 内部类对象可以访问创建它的外部类对象的成员,包括私有成员
  • 访问外部类的局部变量,此时局部变量必须使用final修饰

63.Class类的作用是什么?如何获取Class对象

Class类是Java反射机制的起源火和入口,用于获取与类相关的各种信息,提供了获取类信息的相关方法 class类存放类的结构信息,能够通过Class对象的方法去相应信息:类的名字、属性、方法、构造方法、父类、接口和注解等信息

  • 对象名.getClass()
  • 对象名.getSuperClass()
  • Class.forName("oracle.jdbc.driver.OracleDriver")
  • 类名.class
  • 包装类.TYPE
  • CLASS.getPrimitiveClass()

64.面向对象的设计原则

  • 单一职责原则SRP
  • 开闭原则OCP
  • 里氏替换原则LSP
  • 依赖注入原则DIP
  • 接口分离原则ISP
  • 迪米特原则LOD
  • 组合/聚合原则CARP

65.String[] strArr = new String[10];

引用类型默认值为null; strArr.length,长度为10

66.String类是否可以被继承

不可以,String是被final修饰的

67.类的实例化方法调用顺序'

类加载器实例化时进行的操作不走:加载>连接>初始化

  • 代码书写顺序加载父类静态变量和父类静态代码块
  • 代码书写顺序加载子类静态变量和子类静态代码块
  • 父类非静态变量
  • 父类构造函数
  • 子类非静态变量
  • 子类构造函数

68.什么是泛型?为什么要使用泛型?

泛型:

  • "参数化类型",将类型有具体的类型参数化,把类型也定义成参数形式(类型参数),然后在使用/调用时传入具体的类型
  • 是JDK5中引入的一个新特性,提供了编译时类型安全监测机制,该机制允许程序员在编译时监测非法的类型
  • 泛型的本质是吧参数的类型参数化,也就是锁操作的数据类型被指定为一个参数,可用在类,接口,方法中

为什么要用泛型:

  • 使用泛型编写的程序代码,要比使用Object变量再进行强制类型转换的代码,具有更好的安全性和可读性
  • 多种数据类型执行相同的代码使用泛型可服用代码

7月28日

集合

69.java有哪些常用容器

容器有两大类:Collection和Map,各自都有很多子类

collection:

  • AbstractCollection:对Collection接口的最小化抽象实现
  • List:
    • AbstractList 有序集合的最小化抽象实现
    • ArrayList 基于数组实现的有序集合
    • LinkedList基于链表实现的有序集合
    • Vector 矢量队列
  • set 不重复集合
    • AbstractSet 不重复集合的最小化抽象实现
    • HashSet 基于hash实现的不重复集合,无序
    • LinkedHashSet基于hash实现的不重复集合,有序
    • SortedSet 可排序不重复集合
  • Queue队列
    • AbstractQueue 队列的核心表现
    • BlockingQueue 阻塞队列
    • Deque 可两端操作线性集合

Map:

  • AbstractMap 键值映射集合最小化抽象实现
  • Hashtable 基于哈希表实现的键值映射集合,key,value不可为null
  • HashMap 类似Hashtable,但方法不同步,key,value可为null
    • LinkedMap 根据插入顺序实现键值映射集合
  • IdentityHashMap 基于哈希表实现的键值映射集合,两个可以引用相等==,认为是同一个key
  • SortedMap 可排序键值映射集合
    • NavigableMap 可导航搜索的键值映射集合
  • WeakHashMap 若引用键,不阻塞被垃圾回收器回收,key回收后自动移除键值对

70.ArrayList和Vector的联系和区别

相同点:

  • 底层都使用数组实现
  • 功能相同,实现增删改查等操作的方法类似
  • 长度可变的数组结构

不同点:

  • Vector是早期JDK版提供,ArrayList是新版本替代Vector的
  • Vector的方法都是同步的,线程安全;ArrayList非线程安全,但性能更好
  • 默认初始容量都是10,Vector扩容会翻倍,可指定大小;ArrayList只增加50%

71.Collection和Collections哟什么区别

Collection是JDK中集合层次结构中的最根本的接口。定义了集合类的基本方法

Collections是一个包装类。它包含各种有关集合操作的静态方法,不能实例化。像一个Collection集合框架中的工具类

72.List、Set、Map之间的区别

  • List:有序集合,元素可重复
  • Set:不重复集合,LinkedHashSet按照插入排序,SortedSet可排序。HashSet无序
  • Map:键值对集合,存储键、值和之间的映射;key无序,唯一;value不要求有序,允许重复

73.HashMap和Hashtable之间的区别

JDK1.8中:

  • HashMap线程不安全;Hashtable中的方法是Synchronize的
  • HashMap的key和value都是可以为null的(key只允许一个null);Hashtable不行
  • HashMap的IT二胺投入是fail-fast迭代器;Has和table使用enumerator迭代器
  • HashMap计算hash值;Hashtable使用了hashCode的方法
  • HashMap计默认初始大小为16,容量必须是2的整数次方,扩容为原先的两倍;Hashtable默认大小为11,扩容为原先的2倍+1
  • HashMap没有contains方法;Hashtable有
  • HashMap继承自AbstractMap;Hashtable继承自Dictionary

74.如何决定使用HashMap还是TreeMap

  • 都是非线程安全
  • HashMap基于数组和链表实现;TreeMap基于红黑树实现
  • HashMap不支持排序;TreeMap默认是按照可以值升序排序
  • HashMap大多数情况下有更好的性能,尤其是读数据

75.ArrayList和LinkedList的区别

  • ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于双向链表实现的非线程安全的集合
  • 扩容问题:ArrayList使用数组实现,无参构造函数,默认初始长度为10,扩容为原本的1.5倍;LinkedList不存在扩容问题,新增元素自动放在尾部
  • LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用节点
  • 对于随机index访问get和set方法,一般ArrayList比LinkedList快。因为ArrayList有下标
  • 新增和删除元素,一般LinkedList比ArrayList快。
  • LinkList集合不支持高效随机访问
  • 都是非线程安全,允许存放null

76.Array和ArrayList的区别

Array即数组 ArrayList是动态数组,长度可变,自动扩容

77.迭代器Iterator是什么

  • 它是java中常用的设计模式之一。用于顺序访问所有集合对象的元素,无需知道集合对象的底层实现
  • Iterator是可以便利集合的对象,为各种容器提供了公共的操作接口,隔离对容器的便利操作和底层实现,从而解耦
  • 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成堆增加

78.Iterator怎么使用?有什么特点

主要方法:

  1. Boolean hasNext(); 判断Iterator内是否存在一个元素,如果存在,返回true
  2. Object next(); 删除Iterator内下一个元素,同时指针向后移动一位
  3. void remore(); 删除Iterator内指针的前一个元素,前提是至少执行过一次next();

79.什么类型不能作为HashMap的键值

  • java中是使用泛型来约束HashMap中的key和value的类型的
  • 泛型在java的规定中必须是对象Object类型的,基本数据类型不是Object类型,不能作为键值
  • map.put(0,"123")中编译器已将key值0进行自动装箱,变为Integer类型

80.HashMap的键值需要注意什么

HashMap的key相等的条件是,条件1必须满足,条件2和3必须满足一个

1.key的hash值相等
2.内存中是同一个对象,即使用==判断key相等
3.key不为null,且使用equals判断key相等

自定义类作为HashMap的key,需要注意按照自己的设计逻辑,重写定义类的hashCode()方法和equals()方法

81.Java中已经有数组类型,为什么还要有集合

数组优点:

  • 数组效率高与集合类
  • 数组能存放基本数据类型和对象;集合中只能放对象

数组的缺点:

  • 不是面向对象,存在明显的缺陷
  • 数组长度固定且无法动态改变;集合类容量动态改变
  • 数组无法判断其中市级存了多少元素,只能通过length属性获取数组的申明长度
  • 数组存储的特点是顺序的连续内存;集合的数据结构丰富

JDK提供集合的意义:

  • 集合乙类的形式存在,符合面向对象,通过简单的方法和属性调用可实现各种复杂操作
  • 集合有多种数据结构,不同类型的集合可适用于不同场合
  • 弥补了数组的一些缺点,比数组更灵活、实用,可提高开发效率

82.TreeSet的原理是什么?使用需要注意什么?

TreeSet基于TreeMap实现,TreeMap基于红黑树实现

红黑树简单模型:

zhuanlan.zhihu.com/p/79980618?…

(个人理解:基于二叉树,用来应对二叉树瘸腿的一种策略。使数据查找速度更快,完全替代了平衡二叉树)

特点:

  1. 有序
  2. 无重复
  3. 添加、删除元素、判断元素是否存在,效率较高
  • TreeSetmore构造方法,调用add()方法时会调用对象类实现的Comparable接口的compare To()方法和集合中的对象比较,根据方法返回的结果有序存储
  • TreeSet默认构造方法,存入对象的类未实现Comparable接口,抛出ClassCastException
  • TreeSet支持构造方法指定Comparator接口,按照Comparator实现类的比较逻辑进行有序存储

83.HashSet实现原理是什么?有什么特点?

  • HashSet是基于HashMap实现的,查询速度快
  • HashMap是支持key为null的,多以HashSet支持添加null值
  • HashSe存放自定义类时,自定义类需要重写hashCode()和equals()方法
  • 无序,不可重复

84.List、Set、Map那个继承自Collection接口

  • List和Set继承自Collection接口
  • Map继承了Object类

85.Map的实现类中,哪些是有序的,哪些是无序的,如何保证有序性

  • Map的实现类有HashMap、LinkedHashMap、TreeMap
  • HashMap是无序的
  • LinkedHashMap和TreeMap是有序的。LinkedHashMap记录了添加数据的顺序;TreeMap默认是升序的
  • LinkedHashMap底层存储结构是哈希表+链表,链表记录了添加数据的顺序
  • TreeMap底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性

86.List里如何提出相同的对象

将数组存入HashSet后再输出

HashSet特点:

  • 存放不重复的数据
  • 底层基于hash表实现
  • 内部基于hashMap

87.List、Map、Set三个接口,存取元素时,各有什么特点?

  • List以索引来存取元素,元素可重复
  • Set不能存放重复元素
  • Map保存键值对映射,映射关系可以一对一、多对一
  • List有基于数组和链表实现两种方式
  • Set、Map容器有基于哈希存储和红黑树两种方式实现
  • Set基于Map实现,Set里的元素值就是Map里key

88.Map的遍历方式

  • Map的keySet()方法,单纯拿到所有的key的Set
  • Map的values()方法,单纯拿所有值的Collection
  • keySet()获取到key的Set,遍历Set根据key找值(不推荐)
  • 获取所有的键值对集合,迭代器遍历
  • 获取所有的键值对集合,for循环遍历

89.List、Set、Map接口的特点和常用的实现类

List和Set实现了Collection接口

List:

  • 允许重复对象
  • 可插入多个null元素
  • 是有序容器,保持了每个元素的插入顺序
  • 常用的实现类有ArrayList、LinkedList和Vector。ArrayList提供了使用索引的随意访问,LinkedList更适合经常添加或删除元素的场景

Set:

  • 不允许重复对象
  • 只允许一个null元素
  • Set接口最常用的几个实现类是HashSet、LinkedHashSet以及TreeSet。HashSet基于HashMap实现;LinkedHashSet按照插入顺序;TreeSet通过Comparator或Comparable接口实现排序

Map:

  • 是单独的顶级接口,不是Collection的子接口
  • Map是每个Entry都持有两个对象,key和value,key唯一,value可为null或重复
  • Map接口常用的实现类有HashMap、LinkedHashMap、Hashtable和TreeMap
  • Hashtable和未指定Comparator的TreeMap不可为null;HashMap、LinkedHashMap、指定Comparator的TreeMap的key可为null

90.ConcurrentHashMap了解吗?说说实现原理

HashMap 是线程不安全的,效率高;HashTable 是线程安全的,效率低。

ConcurrentHashMap 可以做到既是线程安全的,同时也可以有很高的效率,得益于使用了分段锁。

参考:

www.cnblogs.com/fsychen/p/9…