Android面试题总结(一)JAVA基础篇

Android面试 - Java基础-未完待续 ArraylistObject[]数组VectorObject[]数组LinkedList: 双向链表。 阅读详情

1.Java中==,equal和hashCode的区别

 

  • == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系
  • equals : Object 的 实例方法,比较两个对象的content是否相同,
    • equals方法本意是用来判断引用的对象是否一致
  • hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数,
    • hashcode是系统用来快速检索对象而使用

2.int和Integer的区别

(1)Integer是int的包装类;int是基本数据类型; 
(2)Integer变量必须实例化后才能使用;int变量不需要; 
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 

(4)Integer的默认值是null;int的默认值是0。

3.Java中基本类型占用字节数

在Java中一共有8种基本数据类型,其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型和1种用于表示真值的boolean类型。(一个字节等于8个bit)

1.整型
类型              存储需求     bit数    取值范围      备注
int                 4字节           4*8 
short             2字节           2*8    -32768~32767
long              8字节           8*8
byte              1字节           1*8     -128~127

2.浮点型
类型              存储需求     bit数    取值范围      备注
float              4字节           4*8                  float类型的数值有一个后缀F(例如:3.14F)
double          8字节           8*8                       没有后缀F的浮点数值(如3.14)默认为double类型

3.char类型
类型              存储需求     bit数     取值范围      备注
char              2字节          2*8

4.boolean类型
类型              存储需求    bit数    取值范围      备注

boolean        1字节          1*8      false、true

4.对java多态的理解

 

  1. 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
  2. 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
  3. 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  4. 多态的作用:消除类型之间的耦合关系。
  5. 现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

下面是多态存在的三个必要条件,要求大家做梦时都能背出来!

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

 多态的好处:

1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

例子:

void doSomething(Shape shape){
        shape.draw();
         .
         .
         shape.erase();
}

Circle circle = new Cricle();

Traingle traingle = new Traingle();

Line line = new Line();

doSonething(circle);

doSonething(traingle);

doSonething(line);

当Cricle被传入到Shape时,Cricle 会被doSomething()看做是Shape,也就是说doSomething发送给Shape的任何消息,都会被Circle接受到,这样就是合乎逻辑的。在此过程中用到了向上转型(upcasting).

5.String,StringBuffer,StringBuilder的区别

 

java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。

1.可变与不可变

  String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

    private final char value[];

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

    char[] value;

2.是否多线程安全

  String中的对象是不可变的,也就可以理解为常量,显然线程安全。

  AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:

复制代码

1 public synchronized StringBuffer reverse() {
2     super.reverse();
3     return this;
4 }
5 
6 public int indexOf(String str) {
7     return indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8 }

复制代码

  StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

 3.StringBuilder与StringBuffer共同点

  StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。

  抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。

  StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。

  最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

6.什么是内部类,内部类的作用?

 

内部类为什么存在

内部类 ( inner class ) : 定义在另一个类中的类

我们为什么需要内部类?或者说内部类为啥要存在?其主要原因有如下几点:

  • 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
  • 内部类可以对同一包中的其他类隐藏起来
  • 内部类可以实现 java 单继承的缺陷
  • 当我们想要定义一个回调函数却不想写大量代码的时候我们可以选择使用匿名内部类来实现

内部类可以实现 java 单继承的缺陷

通过匿名内部类来"优化"简单的接口实现

静态内部类和非静态内部类的区别

  1. 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。
  2. 静态内部类可以访问外部类的静态变量,而不可访问外部类的非静态变量;
  3. 非静态内部类的非静态成员可以访问外部类的非静态变量。
  4. 静态内部类的创建不依赖于外部类,而非静态内部类必须依赖于外部类的创建而创建。

7.抽象类和接口的区别

 

1、 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

 2、 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。

  3、抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

      抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。

8.抽象类的意义

 

1,为子类提供一个公共的类型;

2,封装子类中重复内容(成员变量和方法);

3,定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。

9.抽象类与接口的应用场景

 

  1. 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
    如果你想实现多重继承,那么你必须使用接口。
    由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
    如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
  1. 抽象类表示共有许要实现的方法 接口用来特定类有需要才实现 人都会吃饭 但有的人抽烟

  2. 抽象类是用来捕捉子类的通用特性的

  3. 抽象类是 is a关系;而接口是has a关系

  4. 看看jdk的api会发现大部分接口都是able结尾的,表示一种能力。马士兵曰过:当你不知道用抽象类还是接口好时就用接口

10.泛型中extends和super的区别

 

extends 可用于返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。
>带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。

11.父类中的静态方法能否被子类重写

不能,

因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。(最后一句话是自己理解,不知道说的对不对,欢迎大家批评指正)

 

12.进程和线程的区别

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

13.final,finally,finalize的区别

final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
finally 是异常处理语句结构的一部分,表示总是执行.

finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.

14.什么是序列化,以及Serializable和Parcelable 的区别

简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流、内存或者通过网络传输给其他端。

 

Serializable 有以下几个特点:

  • 可序列化类中,未实现 Serializable 的属性状态无法被序列化/反序列化
  • 也就是说,反序列化一个类的过程中,它的非可序列化的属性将会调用无参构造函数重新创建
  • 因此这个属性的无参构造函数必须可以访问,否者运行时会报错
  • 一个实现序列化的类,它的子类也是可序列化的

实现了 Parcelable 接口的类在序列化和反序列化时会被转换为 Parcel 类型的数据

15.静态属性和静态方法是否可以被继承,是否可以被重写,以及原因

父类的静态属性和方法可以被子类继承,但不能被重写,

原因 
static修饰函数/变量时,其实是全局函数/变量,它只是因为java强调对象的要 
挂,它与任何类都没有关系。靠这个类的好处就是这个类的成员函数调用static方法不用带类名。

注意:static关键字可以用修饰代码块.static代码块可以置于类中的任何一个位置,并可以有多个static代码块。在类初次被加载时,会按照静态代码块的顺序来执行,并且只会执行一次。

16.内部类和闭包

方法中的局部变量会在执行结束后就会被释放,但是内部类访问此变量就形成了闭包

内部类使用外部的局部变量,实际上形成了闭包,也就是捕获了所在方法内的变量,这个被捕获的变量不能随着方法的执行完毕而消失,因为内部类的实例可能还会用到这个变量,所以需要 final 关键字来让这个变量不消失(final 修饰的变量会转为常量,因此不会随着方法的执行完毕而消失)。 

如果在内部类中使用到了外部方法的变量,需要使用 final 修饰,否则无法编译通过,但如果使用的是 JDK8,那么即便你不加final 修饰,也是可以编译过的,因为编译器替你加上了。

17.String转换成Integer的方式及原理

integer.parseInt(string str)方法调用Integer内部的 
parseInt(string str,10)方法,默认基数为10,parseInt内部首先 
判断字符串是否包含符号(-或者+),则对相应的negative和limit进行 
赋值,然后再循环字符串,对单个char进行数值计算Character.digit(char ch, int radix) 
在这个方法中,函数肯定进入到0-9字符的判断(相对于string转换到int), 

否则会抛出异常,数字就是如上面进行拼接然后生成的int类型数值。

18.继承和实现的区别

继承是类的关系,单继承,实现是类和接口之间的关系,多实现

单继承有局限性,多实现避免了单继承的局限性

继承后,普通的方法可以直接使用,实现后,方法全重写(因为方法全抽象)

19.抽象类和接口的区别

抽象类中可以有方法,抽象方法,构造方法

接口中,全部是抽象方法

子类继承抽象类,重写抽象方法,建立子类对象

接口实现类,实现接口,重写全部抽象方法,建立实现类的对象

抽象类有普通方法,子类集成后,可以直接使用

接口全抽象,实现类之后,全重写

抽象类是单继承

接口是多实现,接口之间多实现

抽象类是继承体系的共性内容,is...a 关系

接口是继承体系中的额外功能,扩展功能,和继承体系之间的关系是 like....a 关系

此上内容是经过资料查询和自己理解,加工总结而成,仅供参考(不喜勿喷)

Android面试准备之Java基础 一、Java基础知识 1 什么是面向对象,谈谈你对面向对象的理解 对比面向过程,是两种不同的处理问题的角度,面向过程更注重事情的每一个步骤及顺序,面向对象更注重事情有哪些参与者、及各自需要做什么。 三大特性:封装、继承、多态 封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,内部细节对外部调用透明,外部调用无需修改或者关心内部实现。例:JavaBean 继承:继承基类的方法,并做出自己的改变和/或扩展。子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的。 多态 阅读详情

相关推荐

Android 高频面试必问之Java基础

Java的类加载器可以分为BootstrapClassLoader、ExtClassLoader和AppClassLoader,它们的作用如下。:Bootstrap类加载器负责加载rt.jar中的JDK类文件,它是所有类加载器的父加载器。Bootstrap类加载器没有任何父类加载器,如果调用String.class.getClassLoader(),会返回null,任何基于此的代码会抛出NUllPointerException异常,因此Bootstrap加载器又被称为初始类加载器。

2501_90265132的博客 869

【Android -- 面试】Android 面试题集锦(Java 基础)

面试前准备一下,事半功倍哟~

Kevin Learn Android 2134

Android 面试题(一)Java基础篇

Java基础篇前言1、Java基本数据类型2、String ,Stringbuffer ,Stringbulider的区别?3、final ,finally ,fianlize的区别?4、静态变量和成员变量的不同?5、集合框架,list,map,set都有哪些具体的实现类,区别都是什么?6、ArrayList和LinkedList有什么区别?7、HashMap和Hashtable有什么区别?8、J...

一名互联网时代苟且偷生的 Android码农 2312

常见的android和java面试题及答案

在这个过程中,Android系统会调用各个组件的不同生命周期方法,如onCreate()、onStart()、onResume()等。答:资源是指在Android应用程序中使用的各种非代码文件,如图片、布局文件、字符串等。R类是由Android系统自动生成的一个类,用于访问应用程序中的资源。答:反射是指在运行时动态获取类的信息,并可以在运行时创建对象、调用方法等。什么是Android中的布局?答:布局是指Android中用于定义UI界面的一种方式。答:多态是指同一种方法可以在不同的对象上产生不同的行为。

m0_63096587的博客 618

安卓面试题一:java基础

安卓面试题一:java基础 提出问题: 简单描述什么是面向对象。 什么是多态?多态的实现机制是什么 接口(Interface)和抽象类(Abstract Class)的区别 重写(Override)和重载(Overload)的区别 什么是内部类?静态内部类、匿名内部类以及局部内部类的区别和作用 ==、equals()、hashCode的区别 简述八大基本数据类型。简述Integer和int的区别...

m0_37194191的博客 2529

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇

qq_41692931的博客 4217

java stringbuilder从头部,Android面试题(一)Java基础篇

1.GC核心思想:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能。2.GC roots来源:① 虚拟机栈中引用的对象。② 方法区中类静态属性引用的对象。③ 方法区中常量引用的对象。④ 本地方法栈中JNI引用的对象3....

weixin_39686634的博客 138

Android面试题之Java基础篇

前言秋招在即,计蒙准备在国庆假期结束前整理一套Android初级面试题籍,希望对大家有所帮助提示:以下是本篇文章正文内容Java基础1.什么是重载,什么是重写,有什么区别?(1)Overloading 是一个类中多态性的一种表现,让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。(2)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同,也可以不相同。无法以返回型别作为重载函数的区分标准。

2401_84148942的博客 472

Android面试题集(2020)

Android面试题模板前言目录总结 前言 秋招在即,计蒙在国庆期间为粉丝整理了一套Android初级面试题集 如需获取pdf版本,可于公众号:《计蒙不吃鱼》进行下载 目录 1.Android面试题之Activity篇 2.Android面试题之Service篇 3.Android面试题之Broadcast Receiver篇 4.Android面试题之ContentProvider篇 5.Activity面试题之Intent篇 6.Android面试题之Listview篇 7.Android面试题之Fr

计蒙不吃鱼的博客 9929

Android 面试题整理总结(一)Java 基础

目录 1、final 修饰一个对象,能否调用对象修改属性的方法? 2、fina l和 static关键字的区别? 3、static 修饰的方法可以被子类重写吗?为什么? 4、final、finally、finalize 分别表示什么含义? 5、抽象类能否实例化,理论依据是什么? 6、抽象类跟接口的区别,接口的默认修饰符? 7、面向对象编程的特点,多态性如何体现,Java虚拟机中的多态执行机制? 8...

我的学习笔记 1090

Android面试题(一)Java高频面试题

一、Java基础: Java的基本数据类型有哪些,各自占有多少个字节: 基本类型 字节 byte 1 char 2 short 2 int 4 long 8 float 4 double 8 boolean - "=="与equals的区别: 1)对于"==",比较的是值是否相等: ...

红日 3023

Android面试题Java基础篇

Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: Android面试题View篇 Android面试题进程篇 Android面试题线程篇 Android面试题网络篇 Android面试题架构篇 Android面试题系统原理篇 Andr...

kingwjh的专栏 1480

AI嵌入式系统测试:从确定性验证到概率性评估的体系构建

软件测试是保障系统质量的关键环节,其核心在于验证功能是否符合预期。传统嵌入式测试聚焦于确定性逻辑,通过代码覆盖、边界值分析等方法确保时序、内存等指标的精确性。随着人工智能技术的普及,深度学习模型以其概率性输出和复杂非线性映射的特性,为嵌入式系统带来了新的能力,也彻底改变了测试的范式。AI模型的‘黑盒’特性使得测试目标从‘绝对正确’转向‘置信度满足’,并催生了准确率、F1分数等新指标。在工程实践中,这种融合要求测试体系必须扩展维度,将数据质量、模型量化损失、资源约束下的精度与性能权衡纳入核心考量。尤其在嵌入式

weixin_26766559的博客 381

【安卓开发系列 -- APP】Android 学习路线与面试题集锦

Android 面试 (经验篇) Android2017-2018最新面试题(3-5年经验个人面试经历) Android 面试 (JAVA 篇) Android(2017-2018)BAT面试题整理(java篇,含答案) Android 面试 (Android 篇) Android(2017-2018)BAT面试题整理(Android篇,含答案) ...

CopperSun 技术博客 520

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 956

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8063

android面试题选择题,有java基础学android

由于题量较多,篇幅的限制,文章中的面试题分享没有全部附上详细的解析,但是整理成了一份详细的PDF文档可分享给大家,文末获取免费领取方式。需要了解其实现原理,还要灵活运用,如:自己实现 LinkedList、两个栈实现一个队列,数组实现栈,队列实现栈等。看面试题可以是为了面试,也可以是对自己学到的东西的一种查漏补缺,更加深刻的去了解一些核心知识点。

m0_60666841的博客 897

Angular 相关的知识点和项目汇总

Angular 知识点和项目汇总

weixin_45428910的博客 577
上一篇: java基础练习题
下一篇: Android面试题总结(二) java深入复习
风暴search
博客等级 码龄14年 28粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值