Android面试题汇总(一)

JAVA基础:

1、抽象类和接口区别

关键词定义:抽象类abstract class,接口interface

成员修饰符:抽象类可以是任意类型,接口只能是默认public static final

方法修饰符:抽象类任意类型,接口默认是public不可以用其他修饰

方法实现:抽象类可以有构造方法,抽象方法和具体实现方法,可以有静态代码块,接口只能抽象方法,没有静态代码块和静态方法

继承方式:抽象类单继承,接口可以实现多个

实现方法:抽象类继承子类不是抽象类需要实现抽象方法,接口需要实现所有的抽象方法

效率:抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法;

选择方式:子类都有方法写在抽象类中,即相同的方法封装。子类需要拓展的方法写的接口中,具体的实现类单独去实现接口,可降低耦合度。

2、分别讲讲 final、static 和 synchronized 可以修饰什么,以及修饰后的作用?

final:可以修饰类、方法、成员

        final修饰的类不可以被继承,修饰的方法不能被重写,修饰的成员需要赋值不能被改变,但是成员如果是引用类型那么他将不能引用别的对象,但是其内部的属性值是可以被改变的。

static:可以修饰类、方法、成员
        static修饰内部类这样就不用实现外部类是创建内部类了,static修饰方法这样可以是直接用类.方法来调用,static修饰成员和方法是一样的类.成员获取或者赋值

synchronized:方法、方法块

        synchronized修饰方法,同一时刻只能一个线程进行访问,其他线程会被阻塞直到线程锁被释放。synchronized修饰的代码块也差不多,只是可以使用类锁,如果时类锁方法需要改为静态方法。

3、请简述一下 String、StringBuffer 和 StringBuilder 三者的区别?

String为字符串常量,被创建后无法修改,是线程安全的;因为是final修饰所以不能被继承;String的长度不变,适用于少量操作的字符串

StringBuffer是字符串变量,长度可变,线程安全,适用与多线程下大量字符串操作

StringBuilder是字符串变量,长度可变,线程不安全,适用与单线程下大量字符串操作

字符串操作在执行速度:StringBuilder > StringBuffer > String

4、“equals” 与 “==”、“hashCode” 的区别和使用场景?

==:基本数据类型可以比较值是否相等,如果是引用类型则比较的是地址而不是值。

equals:比较的引用类型中堆内存中真正的值是否相同,但是需要重写equals方法

hashCode:hashCode对比实际上会出现不准确的问题,不同的对象可能hash值是一样的,就是hash冲突。因为equals计算较慢,所以在对比对象的时候首先判断hashCode是否一致,不一致的话就是两个对象不相等,如果一致在去判断equals。

5、Java 中深拷贝与浅拷贝的区别?

克隆:将A实例重新克隆到B实例

浅克隆:将A中的基本数据类型进行值传递,引用类型进行引用传递,2个引用指向同一个堆内存

神克隆:将A中的基本数据类型进行值传递,引用类型复制一份全新的对象,2个引用指向不同的堆内存

6、谈谈 Error 和 Exception 的区别?

Error:是系统性错误,不可以预料的。程序遇到error会直接崩溃,只能排查代码修复

Exception:是异常,可以预料的,可以通过try cacth去捕获或者抛出。异常分为2种,运行时异常和编译时异常,运行时异常忽略异常捕获,编译时异常必须try cacth捕获

7、什么是反射机制?反射机制的应用场景有哪些?

java中的反射机制,是程序运行的时候可以获取和使用到某个类中的所有成员和方法。

应用场景:eventBus框架、Gson框架、Retrofit框架、逆向编程

8、谈谈如何重写 equals() 方法?为什么还要重写 hashCode()?

Object中,equals代表的是==,即地址相同,同样hashCode的计算也是代表地址的hash值。

比如我们自定义A类。这个时候重写了equals我们可以判断他的地址也可以判断他的值,但是如果不重写hashCode方法,某认的hashCode和我们equals代表的含义就不同了默认是object里面的hashCode,计算的是地址。java原则上equals相同的则代表2个对象的hashCode一定相同。

在使用HashMap的时候,例如put或者remove的时候,会判断对象的hashCode、地址和equals联合使用判断对象是否相同。这个时候如果hashCode跟equals不一致则会出现数据问题。

9、IO 流分为几种

字节流

        InputStream(字节输入流)->FileInputStream:read()

        OutputStream(字节输出流)->FileOutputStream:write()

字符流

        Reader(字符输入流)->FileReader:fileReader()

        Writer(字符输出流)->FileWriter:fileWriter()

缓冲流

        字节

        InputStream->FileInputStream->BufferedFileInputStream

        OutputStream->FileOutputStream->BufferedFileOutputStream

        字符

        Reader->FileReader->BufferedReader

        Reader->InputStreamReader(字符转换输入流)字节转字符

        Writer->FileWriter->BufferedWriter

        Writer->OutputStreamWriter(字符转换输出流)字节转字符

对象流

        ObjectInputStream(对象输入流)

        ObjectOutputStream(对象输出流)

打印流

        PrintStream

备注:纯文本用字符流,mp3、word或者其他文件类型用字节流

10、谈谈你对 Java 泛型中类型擦除的理解,并说说其局限性?

擦边就是在编译的时候,所有的泛型会被去掉,默认继承Object

解决的局限:1、ArrayList<String> 加入Integter会编译报错  2、ArrayList<String> 取值的时候会出现类型强转Object->String  3、父类定义泛型,子类实际实现的是重写(不是重载),通过编译器的桥方式

未解决:1、泛型无法是基本数据类型  2、运行时无法知道类型  3、泛型类型(T)无法在静态方法和变量中使用

11、String 为什么要设计成不可变的?

1、常量池问题

字符串创建的时候,如果常量池中被创建了则不会再次被创建,新的引用直接指向已经创建好的。如果说这个值可以被修改,那么其他地方引用可能会出错,所以要保证字符串的唯一性。这也是常量池的优化手段

2、String可以缓存hash值

String的hash值可能被频繁使用,比如HashMap中,如果String不变这样就可以保证Hash值的准确性可以放心缓存,把hash值缓存下来就不需要频繁的生成了也是一种优化策略

3、安全性问题

String通常会代表网球URL或者文件地址等等,如果String变化则不能保证安全性

12、说说你对 Java 注解的理解?

注解:就是一个标识,对代码规范和变量上面打一个标识,注解大概分为3种

source:针对java文件,生成class文件后消失,主要是对代码规范的约束照规范写代码,比如override注解

class:在编译过程中注解生成class文件,跟java生成class文件效率差不多。常见框架butterKnife和ARouter

RunTime:在class文件生成后还是以注解的形式存在,在运行的时候生效,在代码运行的时候通过反编译进行辅助工作,框架xUtils

13、谈一谈 Java 成员变量、局部变量和静态变量的创建和回收时机?

成员变量:存在堆中,随着类对象创建而创建,随着类对象销毁而销毁

静态变量:存在方法区,方法区JVM的一部分。随着类的加载而创建,随着类的回收而回收,但是类只有长时间不使用不关联才有可能被回收,所以静态变量的生命周期特别长几乎不会被回收,因此建议不是共享的变量不要用静态的

局部变量:存在堆中,方法执行的时候创建,执行完标记为可回收

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

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

相关文章

区块链技术:解密去中心化的革命

文章目录 区块链的基础概念什么是区块链&#xff1f;区块链的核心原理1. 分布式账本2. 区块3. 加密技术4. 共识机制 区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用 区块链的应用领域1. 金融服务2. 供应链管理3. 物联网4. 医疗保健5. 政府与公共服务 区块链的未…

Fair下发产物-布局DSL生成原理

一、概述 大家都知道,Flutter在release环境是以AOT模式运行的,这就决定了我们要做动态化的话无法简单的通过动态下发dart代码执行的。根据Fair团队的前期调研,我们对布局动态化和逻辑动态化的实现采用了两套不同的实现方案,对于布局部分,我们在解析dart源文件之后生成DSL…

蓝桥杯 题库 简单 每日十题 day2

01 卡片 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有很多数字卡片&#xff0c;每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数&#xff0c;他想从 1 开始拼出正整数&#xff0c;每拼一个&a…

《如何避免在算法备案中的常见失误?》

在数字时代&#xff0c;算法逐渐渗透到了我们生活的各个方面。为确保算法的透明性、公平性和安全性&#xff0c;许多国家和地区都已经或正在考虑实施算法备案制度。然而&#xff0c;在备案过程中&#xff0c;很多企业和研究者会遇到各种问题&#xff0c;一些常见的失误甚至可能…

RK3568开发笔记(十一):开发版buildroot固件移植一个ffmpeg播放rtsp的播放器Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133022813 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

repo 命令

repo命令是Google开发的用于管理Android版本库的一个工具。 repo命令并不是用于取代git&#xff0c;而是用Python对git进行了一定的封装&#xff0c;简化了对多个Git版本库的管理。 repo init -u -b -m <manifest 文件名称> repo sync 相当于 git clone 获取 git remote…

LeetCode 25. K 个一组翻转链表

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 创建一个哨兵位头结点&#xff0c;然后将其链接在原来头结点的前边&#xff0c;以便于我们后面的便利使用。 每次翻转一小段之前首先判断一下接下里我们要翻转的这一小段的长度是否…

Facebook教程大揭秘!轻松创建公共主页!

公共主页是Facebook上的一种页面&#xff0c;商家或品牌可以借此与粉丝或客户建立紧密联系。简单地说&#xff0c;在Facebook上&#xff0c;个人账号只代表着个体的身份&#xff0c;而公共主页则代表着其所属的网站或品牌。用户在点赞或关注了一个Facebook公共主页后&#xff0…

文件挂载nas挂载

准备资源 nas服务器&#xff1a; 192.168.1.2 分配的nas卷名&#xff1a; mynasvolumename 在本地机器挂载nas卷 mkdir -p /mnt/localmountdir 执行挂载 mount -t nfs 192.168.1.2:mynasvolumename/ /mnt/localmountdir 本地进入nas目录 cd /mnt/localmountdir 可以…

书剑宠物疫苗接种管理软件操作教程

【软件简介】 书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具&#xff0c;适合宠物诊所使用。具有动物主人建档、宠物疫苗接种登记管理、每日提醒、打印疫苗接种通知卡、自定义短信提醒模板等完善的功能。 另外本软件的特色是同时具有手机网页版功能&#xff0c;手机…

uni-app获取元素具体位置获取失败

场景&#xff1a;想要通过链接跳转传递catid&catid2类别id,商品类别id 跳到这一页左侧对应的类别栏上面,同时跳到右侧列表滚动到对应商品那一块区域。 遇到的问题&#xff1a;在for循环中通过绑定id获取不到商品列表的具体位置。 原因&#xff1a;在onReady函数和mounted函…

pywinauto:Windows桌面应用自动化测试(三)

前言 上一篇文章地址&#xff1a; pywinauto&#xff1a;Windows桌面应用自动化测试&#xff08;二&#xff09;_Lion King的博客-CSDN博客 下一篇文章地址&#xff1a; 暂无 一、win应用的后端技术 1、官方文档 安装了 pywinauto 后&#xff0c;如何开始使用呢&#xf…

Java线程池ExecutorService和Executors应用(Spring Boot微服务)

记录&#xff1a;476 场景&#xff1a;在Spring Boot微服务中使用ExecutorService管理Java线程池。使用Executors创建线程池。使用Runnable接口实现类提交线程任务到线程池执行。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3。 1.线程和线程池基础 JDK自带线程和线程池包位…

常用与业务密切相关的prompt

可以在 Bard、Bing、Claude 2、ChatGPT和 Llama 2 上使用 定义您的业务目的和愿景。 提示&#xff1a;“我正在[插入行业]创业。我的重点是定义与我的受众产生共鸣的明确目标和愿景。你能指导我制定有意义的愿景声明吗&#xff1f;” 研究和分析您的目标市场。 提示&#x…

可视化图表组件之股票数据分析应用

股市是市场经济的必然产物&#xff0c;在一个国家的金融领域之中有着举足轻重的地位。在过去&#xff0c;人们对于市场走势的把握主要依赖于经验和直觉&#xff0c;往往容易受到主观因素的影响&#xff0c;导致决策上出现偏差。如今&#xff0c;通过数据可视化呈现&#xff0c;…

Puppeter与Electron的结合,使用Electron创建可视化界面

前言 上一篇文章&#xff1a;Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本&#xff0c;简单介绍了Puppeteer的基本使用&#xff0c;以及如何编写一个脚本。 但是呢脚本的运行需要在node环境里&#xff0c;开发人员可能没什么问题。但是如果你写的这个脚本要给…

java学习笔记------接口

接口&#xff1a;就是一种规则&#xff08;是对行为的抽象&#xff09; 接口的定义和使用&#xff1a; 接口用关键字interface来定义 public interface 接口名{}接口不能实例化接口和类之间是实现关系&#xff0c;通过implements关键字表示 public class 类名 …

Selenium 4.11 正式发布--再也不用手动更新chrome driver 了

Selenium 4.11.0 正式发布了&#xff0c;先来看一下主要特性。 Chrome DevTools支持的版本现在是&#xff1a;v113、v114和v115&#xff08;Firefox仍然对所有版本使用v85&#xff09; 通过Selenium Manager支持Chrome For Testing&#xff08;CfT&#xff09; Selenium Manag…

RabbitMQ —— 初窥门径

前言 RabbitMQ作为当下主流的消息中间件之一&#xff0c;无疑是我们Java后端开发技术成长路线的重要一环&#xff0c;在这篇文章中荔枝将会梳理入门RabbitMQ的知识&#xff0c;文章涉及RabbitMQ的基本概念及其环境配置&#xff0c;荔枝的RabbitMQ是在Docker上部署的&#xff0c…

《TCP/IP网络编程》阅读笔记--多线程服务器端的实现

目录 1--多线程的优点 2--进程和线程的差异 3--线程创建 4--线程使用 5--线程安全问题 6--互斥量 7--信号量 8--线程销毁 9--多线程并发聊天程序 9-1--服务器端 9-2--客户端 9-3--测试结果 1--多线程的优点 多进程服务器的缺点&#xff1a; ① 创建进程的过程会带来…