Java Android中常见的比较

Java篇

1,HashMap和HashTable的区别

相同点:
实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用
不同点:
1-1,Hashtable是早期提供的接口,HashMap是新版JDK提供的接口。
1-2,Hashtable继承Dictionary类,HashMap实现Map接口。
1-3,Hashtable线程安全,HashMap非线程安全。
1-4,Hashtable不允许null值,HashMap允许null值。

2,HashMap与HashSet的区别

2-1,HashMap实现了Map接口;HashSet实现了Set接口。
2-2,HashMap储存键值对;HashSet仅仅存储对象。
2-3,HashMap使用put()方法将元素放入map中;HashSet使用add()方法将元素放入set中。
2-4,HashMap中使用键对象来计算hashcode值;HashSet使用成员对象来计算hashcode值,
对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,
如果两个对象不同的话,那么返回false。
2-5,HashMap比较快,因为是使用唯一的键来获取对象;HashSet较HashMap来说比较慢。

3,ArrayList和LinkedList的区别

3-1,底层数据结构:ArrayList是基于数组来实现的;LinkedList是基于双向链表来实现。
3-2,线程安全:ArrayList 和 LinkedList 都是不同步的,即非线程安全;
3-3,是否支持快速随机访问:对于随机访问,ArrayList优于LinkedList。
3-4,插入和删除操作:对于插入和删除操作,LinkedList优于ArrayList。
3-5,内存空间占用: ArrayList的空间浪费主要体现在在list列表的结尾会预留一定的容量空间;而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。)

4,StringBuffer和StringBuilder、String的区别

4-1,String内部结构是字符串常量;StringBuffer、StringBuilder内部机构是字符串变量。
4-2,StringBuffer是线程安全的;StringBuilder是非线程安全的。
4-3,StringBuffer是JDK1.0版本中的;StringBuilder是JDK5.0版本中的。

5,int和Integer的区别

5-1,Integer是int的包装类;int则是java的一种基本数据类型。
5-2,Integer变量必须实例化后才能使用;而int变量不需要。
5-3,Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
5-4,Integer的默认值是null;int的默认值是0。

6,重写和重载的区别

6-1,重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。
6-2,重写表示子类中的方法可以与父类中的某个方法的名称和参数完全相同。

7,成员变量和局部变量的区别以及形参问题

7-1,在类中的位置不同:成员变量位于类中、方法外;局部变量位于方法内部或者方法声明上。
7-2,在内存中的位置不同:成员变量位于对内存;局部变量位于栈内存。
7-3,生命周期不同:成员变量随着对象的存在而存在,随着对象的消失而消失;局部变量随着方法的调用而存在,随着方法的调用完毕而消失。
7-4,初始化值不同:成员变量有默认的初始化值;局部变量没有默认的初始化值,必须先定义、赋值,才能使用。

行参问题:

行参的定义:行参出现在函数定义中,在整个函数体内部都可以使用,离开该函数则不能使用。
问题一:基本类型:形式参数的改变不影响实际参数。
问题二:引用类型:形式参数的改变直接影响实际参数。

8,==和equals的区别

8-1,对象类型不同:equals()是超类Object中的方法;==是操作符。
8-2,比较的对象不同:equals()用来检测两个对象是否相等,即两个对象的内容是否相等;等号用于比较引用和比较基本数据类型时具有不同的功能。
(用于基本数据类型,==比较的是他们的值;用于引用数据类型,==比较的是他们在内存中的存放地址。)
8-3,运行速度不同:equals()没有等号运行速度快。

9,Serializable 和Parcelable 的区别

9-1,作用:Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的;而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
9-2,效率及选择:Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据;而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
9-3,编程实现:对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可;而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

10,final,finally,finalize的区别

10-1,final用于声明属性、方法和类,分别表示属性不可变(这里指的是引用不可变,不是对象不可变)、方法不可覆盖、类不可被继承。
10-2,finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。
10-3,finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

11,抽象类和接口区别

11-1,抽象类要被子类继承,接口要被类实现。
11-2,接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
11-3,接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
11-4,接口是设计的结果,抽象类是重构的结果。
11-5,抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
11-6,抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变常量。
11-7,抽象类主要用来抽象类别,接口主要用来抽象功能。

12,synchronized和volatile的区别

12-1,synchronized可以使用在变量、方法和类级别;volatile仅能使用在变量级别。
12-2,synchronized可以保证变量的修改可见性和原子性;volatile仅能实现变量的修改可见性,并不能保证原子性。
12-3,synchronized可能回造成线程的阻塞;volatile不会造成线程的阻塞。
12-4,synchronized标记的变量可以被编译器优化;volatile标记的变量不会被编译器优化。

13,wait()和sleep()的区别

13-1,sleep()是Thread类中的方法;wait()是Object类中的方法。
13-2,sleep()不释放锁;wait()释放锁。
13-3,sleep()必须捕获异常;wait()不需要捕获异常。
13-4,sleep()可用于任何地方;wait()只用于同步方法或同步块中。

14,run()和start()方法区别

14-1,start()方法来启动线程,真正实现了多线程运行,这时无需等待。run方法体代码执行完毕而直接继续执行下面的代码:通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。
14-2,run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
14-3,调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
14-4,还有就是尽管线程的调度顺序是不固定的,但是如果有很多线程被阻塞等待运行,调度程序将会让优先级高的线程先执行,而优先级低的线程执行的频率会低一些。

15,进程和线程的区别

什么是进程,什么是线程?

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程。

进程线程的区别

15-1,地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
15-2,资源拥有:同一进程内的线程共享本进程的资源,但是进程之间的资源是独立的。
15-3,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
15-4,进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
15-5,执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
15-6,线程是处理器调度的基本单位,但是进程不是。
15-7、两者均可并发执行。

优缺点:

线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。
进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

16,数组和链表的区别

16-1,链表是链式的存储结构;数组是顺序的存储结构。
16-2,链表通过指针来连接元素与元素;数组则是把所有元素按次序依次存储。
16-3,链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。

17,Exception和Error的区别

在这里插入图片描述

相同点:
Error类和Exception类的父类都是throwable类。
不同点:
17-1,Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。
对于这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
17-2,Exception类表示程序可以处理的异常,可以捕获且可能恢复。
遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
17-3,Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception )。运行时异常:ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。
而受检查的异常,要么用try catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

18,Java虚拟机和Dalvik虚拟机的区别

18-1,java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码;传统的Java程序经过编译,生成Java字节码保存在class文件中,java虚拟机通过解码class文件中的内容来运行程序。而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中Dalvik虚拟机通过解释Dex文件来执行这些字节码。
18-2,Dalvik可执行文件体积更小。SDK中有一个叫dx的工具负责将java字节码转换为Dalvik字节码。
18-3,java虚拟机与Dalvik虚拟机架构不同。java虚拟机基于栈架构。程序在运行时虚拟机需要频繁的从栈上读取或写入数据。这过程需要更多的指令分派与内存访问次数,会耗费不少CPU时间,对于像手机设备资源有限的设备来说,这是相当大的一笔开销。Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式快的多。

19,public、private、protected和默认的区别

19-1,public:表示所有其他类都可以访问。
19-2,protected:当前类或子类可以访问,相同包内的其他类也可以访问protected成员。
19-3,default:默认(没有修饰符),表示本包内可以使用。
19-4,private:表示在本类内可以使用。

20,return,break和continue的区别

20-1,break:终止整个循环。
20-2,continue:跳过本次循环,继续下一次循环。
20-3,return:跳出当前函数而不往下继续执行。

21,基本类型与封装类型的区别

21-1,传递方式不同:封装类是引用类型;基本类型(原始数据类型)在传递参数时都是按值传递,而封装类型是按引用传递的(其实“引用也是按值传递的”,传递的是对象的地址)。由于包装类型都是不可变量,因此没有提供改变它值的方法,增加了对“按引用传递”的理解难度。int是基本类型,直接存放数值;Integer是类,产生对象时用一个引用指向这个对象。
21-2,封装类可以有方法和属性:封装类可以有方法和属性,利用这些方法和属性来处理数据,如Integer.parseInt(Strings)。基本数据类型都是final修饰的,不能继承扩展新的类、新的方法。
21-3,默认值不同:基本类型跟封装类型的默认值是不一样的。如int i,i的预设为0;Integer j,j的预设为null,因为封装类产生的是对象,对象默认值为null。
21-4,存储位置不同:基本类型在内存中是存储在栈中,引用类型的引用(值的地址)存储在栈中,而实际的对象(值)是存在堆中。

Android篇

1,Application 和 Activity 的 Context 对象的区别

2,Fragment的add与replace的区别

3,Service和IntentService的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值