面试宝典 — 2022-7-6

我吾等年纪轻轻,一遇挫折,便松懈怠慢,日后怎成大器

成大事者不谋于众,谋于众者必流于庸俗

故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能

java基础

面向对象编程有什么特点

答:面向对象的特征主要有以下几个方面:

  • 抽象
  • 继承
  • 封装
  • 多态性

Object 中常用的方法

  • 1.toString () 方法

  • 2.equals 方法

  • 3. finalize () 方法

  • [4.hashCode ()方法]

java有几种基本数据类型

8 种

1、整型:byte、short、int、long

2、字符型:char

3、浮点型:float、double

4、布尔型:boolean

HashTable怎么底层是怎么实现线程安全的 ConcurrentHashMap

那么,让我们来看看ConcurrentHashMap是如何实现线程安全的,它能实现高效率的线程安全吗/strong>

? 这里我们就不看ConcurrentHashMap的源码了,简单说说线程安全的原理,其实ConcurrentHashMap实现线程安全也是通过synchronized关键字来控制代码同步来实现的,不同于HashTable的是ConcurrentHashMap在线程同步上更加细分化,它不会像HashTable那样一把包揽的将所有数据都锁住。

? 采用分段锁思路

? 我们都知道ConcurrentHashMap的底层数据结构实现原理其实和HashMap没什么两样,都是数组+链表+红黑树。那么我们就从HashMap入手,来理解。

? 具体HashMap的实现原理剖析请看个人博客:https://blog.csdn.net/zhanglei082319/article/details/87872156

? 怎么将HashMap数据结构使用分段锁的思想进行细分化。在jdk1.7及以前,是这样实现的:

? 比如容器HashMap中存在1000个元素,各个元素都放置到HashMap数组的链表或者红黑数中,最后得到的数组大小可能只有128,ConcurrentHashMap会根据这128个数组,对其分段,比如以16个数组为一段,可以分为8段。在实际获取元素,添加元素时,会根据元素的索引(如何获取元素在HashMap数组中的索引请看https://blog.csdn.net/zhanglei082319/article/details/87872156)找到该元素所处的段位,然后只将该段位锁住,并不影响其他段位的数据操作。这样如果按照HashTable的效率为基本单位来计算,ConcurrentHashMap在jdk1.7及以前的效率会提高8倍,当然数据量越大,提高的效率将越多。

面试宝典 --- 2022-7-6

对于ArrayList ,new无参对象时,底层是一个空数组,当添加第一个元素时,会进行扩容,将底层数组长度扩为10,
其中扩容触发的条件是:存元素时,即先让bucketensureCapacityInternal(size+1)的值判断是否大于底层elementData.length的长度,如果大于,则先扩容再添加,
扩容的倍数为1.5倍。

巴克特show 趴cti 英特no

java 中的io流分为几种

流向分,可以分为输入流和输出流;

单元划分,可以划分为字节流和字符流;

角色划分为节点流和处理流。

Files的常用方法都有哪些/h3>
  • Files.exists():检测文件路径是否存在。

  • Files.createFile():创建文件。

  • Files.createDirectory():创建文件夹。

  • Files.delete():删除一个文件或目录。

  • Files.copy():复制文件。

  • Files.move():移动文件。

  • Files.size():查看文件个数。

  • Files.read():读取文件。

  • Files.write():写入文件。

String与StringBuffer的区别

  1. 变量和常量StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
  2. StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等
  3. StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

stringbuffer 和 Stringbuilder 的区别是什么/h3>

1.Stringbuilder线程不安全,Stringbuffer线程安全

2.Stringbuilder效率更快,因为它不需要加锁,不具备多线程安全,相对来说Stringbuffer就效率慢一些

String s = “a”+ new String (“b”); 请问该字符串创建了几个对象 其中 创建了几个字符串

5 个 ; 两个字符串常量 两个堆对象 一个stringbuilder

java是从c++语言重新设计

java 中一个类可以继承多个类吗

不可以 可以被多个类继承

Java什么情况下可以多继承

1.内部类

2.接口

3.多层继承

什么是java反射

在编译时不知道加载的是哪一个类,在运行时可以动态获取类的属性调用对象的方法的机制就叫做反射。

什么是java死锁

就是为了保证资源安全,确保一次仅有一个线程对共享资源进行修改。

java 容器都有哪些/h3>

Collection 和 Map 两大类 又有很多子类继承

? Collection

  • List

    • ArrayList
    • LinkedList
    • Vector
    • Stack

    map

  • Set

    • HashSet
    • LinkedHashSet
    • TreeSet

hash 冲突怎么解决

Java里 Java hashmap采用的是链表,每个节点都是单向链表,有冲突就往链表尾部放

HashMap的工作原理

1.在JDK1.7及之前,是用数组加链表的方式存储的。

2.JDK1.8 把它设计为达到一个特定的阈值之后,就将链表转化为红黑树。

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

HashMap

key,value 形式存储

实际上的数组+链表+红黑树

put : 比如说数组长度16 存储数据 张三 内部调用键对象中的hashcode()方法 (将张三做一个hash)

然后根据16取模 返回一个下标 根据这个下标找到bucket位置存储对象

get : 根据equals()方法去找到正确的键值对,返回键值对对象

HashMap如何保证数据唯一性

  1. hashmap 进行存储数据的时候 会计算hash值
  2. 根据hash值去判断是否有相同的元素 没有 成功赋值 有 存储失败 照成hash冲突
  3. hash冲突 根据元素的equals()方法与该哈希值的元素比较,如果没有相同的元素,就存储。

Hashmap 和 HashTable 可以为空吗

HashMap对象的key、value值均可为null。

HahTable对象的key、value值均不可为null。

hasmap 和hastable 的区别

1.hasmap 是线程不安全

2.hastable 是线程安全

HashMap常用方法

**1、put(K key,V value) **赋值

**2、get(Object key) **取值

**3、size() **返回HashMap集合中的元素数量

**4、clear() **清空HashMap集合

5、isEmpty () 判空

6、remove(Object key) 根据key删除数据

**7、values() ** 返回HashMap集合中所有value组成的以Collection数据类型格式数据

抽象类必须要有抽象方法吗/h3>

不是必须的

请说明Collection 和 Collections的区别

1.Collection:
是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。
Collection接口是Set接口和List接口的父接口

2.Collections
Collections是一个集合框架的帮助类,里面包含一些对集合的排序,搜索以及序列化的操作

线程的 run()和 start()有什么区别/h3>

1.调用 start() 方法是用来启动线程的,轮到该线程执行时,会自动调用 run();直接调用 run() 方法,无法达到启动多线程的目的,相当于主线程线性执行 Thread 对象的 run() 方法。
2.一个线程对线的 start() 方法只能调用一次,多次调用会抛出 java.lang.IllegalThreadStateException 异常;run() 方法没有限制

线程和进程的区别

进程:是指一个内存中运行的应用程序(已经在内存中运行的程序). 一个进程都有一个独立的内存空间,一个电脑(手机)可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;

线程:是进程中的一个执行单元(线程是依赖于进程的),负责当前进程中程序的执行,一个进程中至少有一个线程(单线程程序)。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

线程创建的方式

第一种: 通过继承Thread类创建线程 重写run()

第二种: 通过实现Runnable接口创建线程 重写run()

第三种: 实现Callable接口 重写 call( )

sleep和wait的区别是面试中一个非常常见的问题

1、sleep是线程中的方法,但是wait是Object中的方法。

2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。

3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。

4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。

JVM基础面试题

jvm是什么/h3>

JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统

Spring 基础面试题

spring 框架是什么

Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求

spring 框架使用了哪些设计模式

1.单例设计模式 spring bean 默认都是单例

2.代理设计模式 spring aop 的实现

3.工厂设计模式 spring 使用工厂设计模式创建bean对象

4.模板方法模式 spring 中 jdbcTemplate redisTemplate 等以Template结尾的对数据库操作的类 采用模板设计模式

spring 有什么有优点

1.减少开发,测试时间来源:aq_money

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年6月5日
下一篇 2022年6月5日

相关推荐