Android面试题汇总(二)

一、Java集合

1、谈谈 Java 中 List、Set 以及 Map 的区别?

List:有序的,数据可以重复。。

Set:无序的,数据不能重复。

Map:键值对存储。键是唯一的,值不是唯一的。

2、谈谈 ArrayList 和 LinkedList 的区别?

ArrayList:底层是基于数组的,数组占用的是一个连续的内存空间。在新增和删除的时候效率低,因为新增的时候需要有扩容判断在新增元素,在删除的时候因为是连续的内存空间除了删除最后一个元素外,删除其他元素都会是数组元素发生移动。查询和修改效率高,可以直接根据index去直接进行定位。

LinkList:底层是基于链表的,占用的是分散的内存空间。在新增和删除的时候效率高。新增的时候不需要考虑扩容问题,删除的时候只需要被删除的后一个节点的指向发生改变。查询和修改的效率低,因为没有index下标

3、请说一下 HashMap 与 HashTable 的区别?

1、父类不同,HashMap是继承于AbstractMap,HashTable是Dictionary的子类

2、HashMap的key和value可以是null,但是HashTab不可以

3、HashMap是线程不安全的,HashTab是线程安全的可以在多线程下操作,但是JAVA后ConcurrentHashMap可以代替,比TashTab的扩展性更好

4、HashMap速度快,因为是线程不安全的,HashTab速度慢

5、HashMap不能保证元素的次序不变,因为每次扩容的时候会重新排序

6、HashMap初始大小16,HashTab初始大小11

4、说一说 ArrayList 的扩容机制?

ArrayLsit的初始容量是10,每次超过的时候都*1.5

5、HashMap 的实现原理?

HashMap底层是数组和链表的形式,只要是为了解决数据和链表的痛点,更好的进行增删改查。

首先是根据K来计算HashCode然后在确定数组的下标,实际上就是Node<K,V>[] 链表数据,在添加数据的时候判断如果下标位置没有数据直接添加上,如果有数据判断key的hash值和equalus相同则覆盖,否则添加到链表的尾部

6、请简述LinkedHashMap的原理

底层是数据+双链表的形式,使用上和HashMap一样,他是HashMap的子类。只是它是有序的,而HashMap是无需的。因为底层是双链表所以内存占用会大一些

7、ConcurrentHashMap理解

ConcurrentHashMap比起Hashmap,是线程安全的,比起HashTable是高效的使用分段锁。

二、JAVA多线程

1、Java 中使用多线程的方式有哪些?

1、Thread重新run方法创建线程

2、实现Runnable接口,传给Thread使用

3、ExecutorService 线程池来使用线程

4、FutureTask+Executors 实现带有返回值的线程

2、说一下线程的几种状态?

创建状态:线程被创建的时候就是创建窗体

就绪状态:线程执行的了strat方法,调度的线程还没有把此线程设置为当前线程时 还没有执行run中的代码。线程重新启动的时候也会进度就绪状态

执行状态:开始指定run方法中的代码了  就是执行状态

阻塞状态:当调用sleep或者wait方法阻塞线程后,线程会进入阻塞状态

死亡状态:当调用stop方法后,线程会停止运行,进入死亡状态

3、如何实现多线程中的同步?

volatile关键词 -- 某种简单的逻辑下, 是可以的,只能修饰变量。保证变量的可见性

synchronized -- 重量级,会遭成线程阻塞

4、Thread 中 run() 与 start() 方法的区别?

run就是一个普通方法,调用一下执行一次,可以无限调用

start方法只能调用一次,是启动线程的方法,然后会自动执行run方法,执行完毕后线程销毁。

5、说一下 synchronized 和 volatile 关键字的区别?

1、synchronized重量级的可以修饰类、方法、变量。volatile轻量级只能修饰变量,volatile本质就是告诉jvm 寄存器中的值是不准确的,需要在主内存中读取

2、synchronized是具有原子性和可见性的,volatile只具备可见性

3、synchronized会造成线程阻塞,volatile不会

4、synchronized标记的变量会被编译器优化,volatile不会

6、如何保证线程安全?

根据具体的场景进行加锁(volatile或者synchronized),保证原子性,可见性和有序性

7、谈谈 Java 线程中 notify 和 notifyAll 方法有什么区别?

notify:只会唤醒等待该锁的其中一个线程。notifyAll:会唤醒等待该锁的所有线程。

8、什么是线程池?

线程池:就是线程的管理工具。

线程是为了执行任务的每个任务都需要重建一个线程,执行完就销毁掉。

线程池会管理所有线程,当某个线程空闲的时候会自动分配任务,如果等待的时间久也能自动回收,线程不够的时候也可以自动创建

9、谈一谈线程 sleep() 和 wait() 方法的区别?

1、sleep是Thread的方法,wait是Object的方法

2、sleep不释放锁,wait会释放锁

3、sleep不需要Synchronized,wait需要Synchronized

4、sleep不需要唤醒,wait需要唤醒

10、什么是悲观锁和乐观锁?

乐观锁:执行任务的时候默认同一时间不会出现其他线程一起处理任务的情况,会处理完任务后看一下数据有没有被修改过

悲观锁:执行任务的时候默认同一时间一定有其他线程一起处理任务,在处理任务的时候会直接上锁

11、谈一谈 Java 线程安全的集合有哪些?各有什么特点?

hashTab:加锁的hashMap,方法上直接加synchronized

concurrentHashMap:会在具体的位置加锁使用分段锁,保证效率,是HashTab的升级

三、Java虚拟机

1、请简要谈一谈 Java 中的垃圾回收机制?

垃圾回收机制:当堆内存中的某块区域没有对象引用的时候,这个内存区域将变成垃圾,等待垃圾回收器的收回

强制垃圾回收:程序中可以控制某个对象不被引用,但是绝对不能控制他的回收。System.gc()和Runtime.getRuntime().gc,可以建议垃圾回收器进行回收,但是可能回收也可能不回收。

finalize:对象的复活可以通过finalize()方法来实现,如果子类覆盖了此方法,垃圾回收器就会将他放入队列中,优先级低的线程来执行此方法,执行完毕垃圾回收器在看此对象是否可达,可达的话就复活否则回收。

2、回答一下什么是强、软、弱、虚引用以及它们之间的区别?

1、强引用:就是最普遍使用的。如果一个对象具有强引用,那么垃圾回收器是不会去回收他的,即使内存溢出了也不会随意的去回收强引用来保证内存。

2、软引用:软引用的对象当内存空间不足的时候,垃圾回收器才会回收,内存空间充足则不回收。软引用一般和RefereceQueue联合使用,如果软引用引用对象被回,JAVA虚拟机就会把软引用加入到与之关联的队列中

3、弱引用:弱引用对象无论内存空间是否充足,只要是垃圾回收器发现弱引用对象就会去回收,垃圾回收器的线程优先级很低因此也不会很快的去执行并回收。弱引用一般和RefereceQueue联合使用,如果弱引用引用对象被回收,JAVA虚拟机就会把弱引用加入到与之关联的队列中

4、虚引用:虚引用对象就是如同虚设的意识,随时可以被回收。虚引用一般是用来跟踪对象被垃圾回收器回收的活动,虚引用是必须和RefereceQueue联合使用的,当垃圾回收器回收虚引用对象前,Java虚拟机就会把虚引用放入与之关联的队列中

3、JVM、Dalvik、ART 三者的原理和区别?

JVM:是java虚拟器,运行java字节码

Dalvik:是google设计的用于Android平台的虚拟机,运行转换为.dex的java程序。

JVM和Dalvik的区别:

1、Dalvik是基于寄存器的,JVM是基于堆和栈的

2、Dalvik有自己的字节码

3、Dalvik在Android2.2后   支持JIT即时编译加载的

ART:ART是现流行的Android虚拟器,与Dalivk的区别

1、ART支持AOT预编译技术,而Dalvik是JIT即时加载技术

2、AOT预编译技术,是在程序安装的时候,把所有的字节码编译成机器码,应用运行的时候就无需实时编译,直接调用

3、JIT即时加载技术,是在程序启动的时候,通过性能分析优化代码执行;在应用运行的时候,实时将字节码编译成机器码

所以,ART 程序运行的时候效率会更高,因为在安装的时候已经全部编译完成。但是安装的时间会变长,会产生很多的机器码,所以占用的内存也会变大

4、请谈谈 Java 的内存回收机制?

在JAVA中内存管理分为2个方面,内存分配和内存回收。所有的内存管理工作都是由JVM负责的,避免了像C/C++那种直接操作内存带来的风险还有就是降低了我们的学习难度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题~二叉搜索树中的众数

题目链接&#xff1a;501. 二叉搜索树中的众数 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 由题可知&#xff0c;题目中所给的树是一颗二叉搜索树&#xff0c;二叉搜索树的中序遍历结果是一个从小到大的数据集&#xff0c;那么我们可…

「聊设计模式」之抽象工厂模式(Abstract Factory)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 在软件开发中&#xff0c;设计模式是一种被广泛使用的经验…

C++(day4)

思维导图 封装Mystring #include <iostream> #include<cstring>using namespace std;class Mystring{ public://无参构造函数Mystring():size(10){strnew char[size];strcpy(str,"");cout<<"无参构造函数"<<endl;}//有参构造函数…

平衡二叉树删除结点后的调整操作

1.回顾插入操作 插入新结点后&#xff0c;要保持二叉排序树的特性不变&#xff08;左<中<右)若插入新结点导致不平衡&#xff0c;则需要调整平衡。 2.删除操作 删除结点后&#xff0c;要保持二叉排序树的特性不变&#xff08;左<中<右)若删除结点导致不平衡&…

MySQL只同步单个表或多个表,非全部同步!

replicate-do-table 是 MySQL 复制配置中的一个选项&#xff0c;它允许您指定要在从服务器上复制的表。如果您想要只复制主服务器上特定的表到从服务器&#xff0c;您可以使用这个选项。 以下是如何操作 replicate-do-table 的步骤&#xff1a; 停止从服务器: 在从服务器上执行…

C++---链表

1、链表 1.1、链表的结构 每个链表开头都有一个头指针Head尾节点的指针域为NULL&#xff0c;用于判断此列表是否结束 如果一个链表开始就为NULL&#xff0c;那么该链表为空链表 链表中的先后不代表在真实内存中的位置&#xff0c;只是单纯的逻辑上关系 1.2、创建链表 我们首…

网络编程 day1

1->x.mind网络编程基础 2->简述字节序的概念&#xff0c;并用共用体&#xff08;联合体&#xff09;的方式计算本机的字节序 1.字节序是指不同类型的CPU主机&#xff0c;内存存储多字节整数序列的方式 2.小端字节序&#xff1a;低序字节存储在低地址上 3.大端字节序&a…

day19正则表达式

今日内容 正则表达式 教学目标 能够理解正则表达式的作用 能够使用正则表达式的字符类 能够使用正则表达式的逻辑运算符 能够使用正则表达式的预定义字符类 能够使用正则表达式的限定符 能够使用正则表达式的分组 能够在String的split方法中使用正则表达式 正则表达式 1.1 …

C++:constexpr 和 const 的区别

constexpr 是 C 11 标准新添加的关键字&#xff0c;原先的标准中是只有const关键字的&#xff0c;作用是表示只读常量。但是&#xff0c;其实只读常量是两个属性&#xff0c;分为只读和常量&#xff0c;都用const来表示会产生歧义。 看下面的例子 #include <iostream> …

Layui + Flask | 弹出层(组件篇)(04)

提示:点击阅读原文体验更佳 https://layui.dev/docs/2.8/layer/ 弹出层组件 layer 是 Layui 最古老的组件,也是使用覆盖面最广泛的代表性组件。在实现网页弹出层的首选交互方案,使用的非常频繁。 打开弹层 layer.open(options); 参数 options : 基础属性配置项。打开弹层的核…

定制化图标——Element UI 组件图标替换指南

本篇博客将介绍如何在使用 Element UI 组件时对原生图标进行定制化替换&#xff0c;提供了适用于满足个性化需求的方法和技巧。 引言 Element UI 是一款基于 Vue.js 的流行 UI 组件库&#xff0c;在前端开发中得到广泛应用。然而&#xff0c;在使用 Element UI 的组件时&#…

中小型教育机构这样做,让你轻松抓住受众注意力

教育一直都是家长对于孩子最关心的事情&#xff0c;对于部分家庭来说&#xff0c;教育支出占整个家庭支出的50%左右。 而软文作为目前效果比较明显而且性价高的推广方式&#xff0c;也很适合教育培训行业&#xff0c;因为它能让潜在客户可以清楚地了解产品的特性&#xff0c;感…

springcloude gateway的意义

应用场景 1、南北向流量 需要流量网关和微服务网关配合使用&#xff0c;将内部的微服务能力&#xff0c;以统一的 HTTP 接入点对外提供服务。 流量网管主要是接入流量进行负载均衡&#xff0c;上游的微服务网关地址和数量变化不大&#xff0c;对服务发现要求不高。 微服务网…

Java面试八股文宝典:初识数据结构-数组的应用扩展之HashMap

前言 除了基本的数组&#xff0c;还有其他高级的数据结构&#xff0c;用于更复杂的数据存储和检索需求。其中&#xff0c;HashMap 是 Java 集合框架中的一部分&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。HashMap 允许我们通过键来快速查找和检索值&…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

数据库操作-DML/DQL

数据库操作-DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据&#xff08;INSERT&#xff09; 修改数据&#xff08;UPDATE&#xff09; 删除数据&#xff08;DELETE&#xff09; 增加(ins…

python 异常

1.捕获异常 2.密码爆破 3.

基于b/s架构搭建一个支持多路摄像头的实时处理系统 (3) -- Django 结合WebSocket 进行实时图像与消息的展示, 前后端交互与定时任务的重构

文章大纲 consumersself.scope参考文献与学习路径javascript html websocketpython 定时任务Django 实时通信后端 channelconsumers https://channels.readthedocs.io/en/stable/topics/consumers.htmlself.scope consumer在初始化时会接受链接的scope,类似于Django中的reque…

查看云桌面请求linux服务器网络快慢

要查看云桌面请求 Linux 服务器的网络快慢&#xff0c;您可以使用一些网络诊断工具和命令来评估连接的性能。以下是一些方法&#xff1a; 使用 ping 命令&#xff1a; ping 命令可以测试与目标服务器之间的网络连接。在终端中运行以下命令以测试服务器的响应时间&#xff1a; p…

【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

OpenELB部署及应用 一、OpenELB介绍 网址&#xff1a; openelb.io OpenELB 是一个开源的云原生负载均衡器实现&#xff0c;可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区发…