进程和线程之间的主要区别在于它们以不同的方式管理操作系统资源。进程有独立的地址空间,一个进程崩溃后,不会影响保护模式下的其他进程,而线程只是进程内不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。因此,一个线程的终止相当于整个进程的终止。然而,多进程程序比多线程程序更健壮。切换流程需要花费大量时间,降低效率。然而,一些需要并发操作和共享某些变量的并发操作只能使用线程而不是进程。如需了解更多信息,我们建议访问《现代操作系统》 或《操作系统的设计与实现》。对于这个问题我们非常清楚。
10、Java中==和equals的区别,以及equals和hashCode的区别(乐视网)
http://blog.csdn.net/tiantiandjava/article/details/46988461
11.常见排序算法的时间复杂度(小米)
12.HashMap(美团)实现原理
HashMap概述:HashMap是基于哈希表的Map接口的异步实现。该实现提供了所有可选的映射操作并允许空值和空键。此类不保证映射的顺序,特别是不保证顺序不可变。
HashMap数据结构:Java编程语言有两种最基本的结构:数组和模拟指针(引用),这两种基本结构用于创建所有可构造的数据结构。 HashMap 也不例外。 HashMap实际上是一种结合了数组和链表的“链表哈希”数据结构。
从上图中可以看出,HashMap的底层是一个数组结构,数组中的每一项都是一个链表。当创建一个新的HashMap 时,数组就会被初始化。
13.Java状态机
http://www.jdon.com/designpatterns/designpattern_State.htm
14、Java中int char long 占用多少字节?
字节位数8 字节数1
短16 2
整型32 4
长64 8
浮点数32 4
双64 8
字符16 2
15.Java int 和integer 的区别
http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226903.html
16. string stringbuffer和stringbuilder的区别(小米、乐视、百度)
字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简单地说,String和StringBuffer类型之间的主要性能差异在于String是一个不可变的对象,因此每次String类型发生变化时,它实际上都会创建一个新的String对象并将其指针传递给新的String,因为它是一个对象。我们建议您避免将String 用于内容经常变化的字符串。这是因为每次创建对象都会影响JVM的系统性能,尤其是内存中未引用的对象过多时。毫无疑问,一旦GC开始运行,系统的性能就会下降。
当您使用StringBuffer类时,每次操作StringBuffer对象本身,而不是创建一个新对象并更改对象引用时,结果都是不同的。因此,一般建议使用StringBuffer,尤其是字符串对象经常变化的情况下。在一些特殊情况下,String对象的字符串串联实际上被JVM解释为StringBuffer对象的串联,因此在这些情况下String对象可能比StringBuffer对象慢,尤其是String的效率比StringBuffer快得多。对于以下字符串对象:
String S1=\”这只是\” + \”简单\” + \”测试\”;
StringBuffer Sb=new StringBuilder(\”This is just a\”).append(\”simple\”).append(\”test\”); 您会对String S1 对象的创建速度感到惊讶。 time StringBuffer 其实在速度上根本没有优势。事实上,这是JVM 的一个技巧,从JVM 的角度来看,这个String S1=“This is just a” + “simple” + “test” 看起来像这样: ”;所以当然不会花太长时间。但是,这里需要注意的一件事是,如果字符串来自另一个String 对象,则速度不会那么快。 \”; String S1=S2 +S3 + S4; 然后JVM 以自己的方式执行此操作。
大多数情况下,StringBuffer是字符串
字符串缓冲区
java.lang.StringBuffer 线程安全的变量字符序列。与String类似的字符串缓冲区,但不能修改。它在任何给定时间都包含特定的字符序列,但该序列的长度和内容可以通过特定的方法调用来更改。
字符串缓冲区可以被多个线程安全地使用。这些方法可以选择同步,以便给定实例上的所有操作看起来都按与每个参与线程进行的方法调用顺序相匹配的串行顺序发生。
StringBuffer的主要操作是append和insert方法,可以重载它们来接受任何类型的数据。每个方法都有效地将指定的数据转换为字符串,并将该字符串的字符附加或插入到字符串缓冲区中。 append 方法总是将这些字符添加到缓冲区的末尾,而insert 方法则将字符添加到指定位置。
例如,如果z 引用当前内容为“start”的字符串缓冲区对象,则此方法调用z.append(\”le\”) 会导致字符串缓冲区包含“startle”; z.insert(4, \” le\”)修改字符串缓冲区以包含“starlet”。
大多数情况下,StringBuilder StringBuffer
java.lang.StringBuilder
java.lang.StringBuilder,可变字符序列,是5.0 中的新增内容。此类提供了与StringBuffer 兼容的API,但不保证同步。当字符串缓冲区由单个线程使用时(这是一种常见情况),此类被设计为StringBuffer 的直接替代品。大多数实现都比StringBuffer 更快,因此我们建议如果可能的话首选此类。两种方法基本相同
17.Java多态(乐视网)
理解Java多态性
在Java中实现多态性
什么是多态性?
面向对象的三个主要特征:封装、继承、多态。从一个角度来看,封装和继承几乎总是为我们提供多态性。这是最后一个概念,也是最重要的知识点。
多态定义:指允许不同类型的对象响应同一消息。这意味着同一条消息的行为可能会有所不同,具体取决于您将其发送给谁。 (发送消息是一个函数调用)
实现多态性的技术称为动态绑定,它在运行时确定所引用对象的实际类型,并根据实际类型调用相应的方法。
多态性的作用:消除类型之间的关联关系。
现实中,多态的例子有很多。例如,当您按F1 时,AS 3 帮助文档将出现在Flash 界面下方,Word 帮助将出现在Word 下方,Windows 帮助和支持将出现在Windows 下方。同一事件发生在不同的对象上,会产生不同的结果。 以下是多态性存在的三个必要条件,每个人在做梦时都应该能够背诵。
多态存在的必要条件有3个:1.继承存在,2.重写存在,3.父类中的引用指向子类中的对象。
多态性的优点:
1、可替代性。多态性允许替换现有代码。例如,多态性适用于Circle 类,但它也适用于其他圆形几何形状,例如圆环。
2.可扩展性。多态性使您的代码可扩展。添加新的子类不会影响对现有类的多态性、继承性和其他特性的操作或操作。事实上,添加新的子类来获得多态函数更容易。例如,在实现了圆锥体、半圆锥体和半球体的多态性之后,很容易为球体类添加多态性。
3、接口能力。当超类通过方法签名向子类提供公共接口(子类完成或重写)时,就实现了多态性。如图8.3所示。图中的超类Shape指定了两个实现多态性的接口方法:computeArea()和computeVolume()。 Circle 和Sphere 等子类改进或重写了这两个接口方法以实现多态性。
4、灵活性。实现应用程序灵活多样的操作,提高使用效率。
5.简单。多态性简化了编写和修改应用软件代码的过程。在处理大量对象的计算和操作时,此功能尤其引人注目和重要。
Java中的多态性是通过实现接口、通过父类继承重写方法以及在同一个类内重载方法来实现的。
18、线程阻塞的原因(58、美团)
阻塞线程
为了解决访问共享存储区域的冲突,Java引入了同步机制。接下来,让我们检查多个线程对共享资源的访问。仅同步机制是不够的,因为所需的资源并不总是可用。可以同时准备多个资源以供访问。为了解决这种情况下的访问控制问题,Java引入了对阻塞机制的支持。
阻塞是指暂停线程的执行以等待特定条件的发生,例如资源准备就绪。学过操作系统的同学对此都会很熟悉。 Java 提供了许多支持阻塞的方法。我们来一一分析。
sleep() 方法: sleep() 允许您指定以毫秒为单位的时间作为参数。这会导致线程阻塞指定的时间,并且在指定的时间过去后,线程不再获得任何CPU 时间。 -进入可执行状态。 sleep() 通常用于等待资源准备就绪。测试表明不满足条件后,将线程阻塞一段时间,然后重新测试,直到满足条件。
suspend() 和resume() 方法:这两个方法一起使用。 suspend()使线程进入阻塞状态,必须调用相应的resume()才能将线程返回到可运行状态。 suspend() 和resume() 通常在等待另一个线程产生的结果时使用。测试发现没有结果产生后,线程阻塞,另一个线程产生结果,然后调用resume()。我们将恢复。
当我们谈论阻塞时,我们也不得不谈论死锁。快速分析表明,不指定超时时间的stop() 和wait() 方法调用都可能导致死锁。不幸的是,Java不支持语言级别的死锁避免,因此编程时必须小心避免死锁。
上面我们分析了Java中线程阻塞的各种方法,但是我们重点分析了wait()和Notify()方法,因为它们功能最强大,使用起来也最灵活。然而,这也导致效率降低。更容易出错。在实际操作中,你需要灵活运用不同的方法,才能更好地实现你的目标。
19.抽象类接口之间的区别(360)
默认方法实现抽象类可以具有完全抽象的默认方法实现。该接口没有实现任何方法
实现子类使用extends关键字从抽象类继承。如果子类不是抽象类,则它必须提供抽象类中声明的所有方法的实现。
子类使用关键字implements 来实现接口。您必须为接口中声明的所有方法提供实现
构造函数
抽象类可以有构造函数
接口不能有构造函数
与常规Java 类的区别
抽象类和常规Java 类之间没有明显的类型区别,只是它无法实例化。
访问修饰符
本次面试答案,以及收集到的大厂必问面试题分享:
现在
实现子类使用extends关键字从抽象类继承。如果子类不是抽象类,则它必须提供抽象类中声明的所有方法的实现。
子类使用关键字implements 来实现接口。您必须为接口中声明的所有方法提供实现
构造函数
抽象类可以有构造函数
接口不能有构造函数
与常规Java 类的区别
抽象类和常规Java 类之间没有真正的类型区别,只是它无法实例化。
访问修饰符
本次面试答案,以及收集到的大厂必问面试题分享:
[外部链接图像正在传输.(img-oeryLFbe-1719482489862)]
#以上国内某顶尖互联网公司2024年内部题库Android面试相关内容摘自网络,供大家参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92605.html