2.正常判断null\进制范围,length等。
3.判断第一个字符是否是符号位。
4.循环遍历确定每个字符的十进制值。
5.通过*=和-=进行计算拼接。
6.判断是否为负值返回结果。
代理是一种常用的设计模式,目的是:为其他对象提供一个代理以控制对某个对象的访问,将两个类的关系解耦。代理类和委托类都要实现相同的接口,因为代理真正调用的是委托类的方法。
区别:
**1)静态代理:**由程序员创建或是由特定工具生成,在代码编译时就确定了被代理的类是哪一个是静态代理。静态代理通常只代理一个类;
**2)动态代理:**在代码运行期间,运用反射机制动态创建生成。动态代理代理的是一个接口下的多个实现类;
**实现步骤:**a.实现InvocationHandler接口创建自己的调用处理器;b.给Proxy类提供ClassLoader和代理接口类型数组创建动态代理类;c.利用反射机制得到动态代理类的构造函数;d.利用动态代理类的构造函数创建动态代理类对象;
**使用场景:**Retrofit中直接调用接口的方法;Spring的AOP机制
在运行状态中,对任意一个类,都能知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法和属性。这种能动态获取信息及动态调用对象方法的功能称为java语言的反射机制。
反射的作用:开发过程中,经常会遇到某个类的某个成员变量、方法或属性是私有的,或只对系统应用开放,这里就可以利用java的反射机制通过反射来获取所需的私有成员或是方法。
1)获取类的Class对象实例Classclz=Class.forName(“com.zhenai.api.Apple”);
2)根据Class对象实例获取Constructor对象ConstructorappConstructor=clz.getConstructor();
3)使用Constructor对象的newInstance方法获取反射类对象ObjectappleObj=appConstructor.newInstance();
4)获取方法的Method对象MethodsetPriceMethod=clz.getMethod(“setPrice”,int.class);
5)利用invoke方法调用方法setPriceMethod.invoke(appleObj,14);
6)通过getFields()可以获取Class类的属性,但无法获取私有属性,而getDeclaredFields()可以获取到包括私有属性在内的所有属性。带有Declared修饰的方法可以反射到私有的方法,没有Declared修饰的只能用来反射公有的方法,其他如Annotation\Field\Constructor也是如此。
二、Jvm
内存区域划分:
程序计数器:当前线程的字节码执行位置的指示器,线程私有。
Java虚拟机栈:描述的Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,存储着局部变量、操作数栈、动态链接和方法出口等,线程私有。
本地方法栈:本地方法执行的内存模型,线程私有。
Java堆:所有对象实例分配的区域。
方法区:所有已经被虚拟机加载的类的信息、常量、静态变量和即时编辑器编译后的代码数据。
1.Java规定所有变量的内存都需要存储在主内存。
2.每个线程都有自己的工作内存,线程中使用的所有变量以及对变量的操作都基于工作内存,工作内存中的所有变量都从主内存读取过来的。
3.不同线程间的工作内存无法进行直接交流,必须通过主内存完成。
主内存和工作内存之间的交互协议,即变量如何从主内存传递到工作内存、工作内存如何将变量传递到主内存,Java内存模型定义了8种操作来完成,并且每一种操作都是原子的,不可再分的。
1.指向方法区:"abc"是常量,所以它会在方法区中分配内存,如果方法区已经给"abc"分配过内存,则s1会直接指向这块内存区域。
2.指向Java堆:newString(“abc”)是重新生成了一个Java实例,它会在Java堆中分配一块内存。
所以s1和s2的内存地址肯定不一样,但是内容一样。
判断一个对象可以回收通常采用的算法是引用几算法和可达性算法。由于互相引用导致的计数不好判断,Java采用的可达性算法。
可达性算法的思路是:通过一些列被成为GCRoots的对象作为起始点,自上往下从这些起点往下搜索,搜索所有走过的路径称为引用链,如果一个对象没有跟任何引用链相关联的时候,则证明该对象不可用,所以这些对象就会被判定为可以回收。
可以被当作GCRoots的对象包括:
Java虚拟机栈中的引用的对象
方法区中静态属性引用的对象
方法区中常量引用的对象
本地方法中JNI引用的对象
标记-清除:首先标记出需要回收的对象,标记完成后统一回收所有被标记的对象。容易产生碎片空间。
复制算法:它将可用的内存分为两块,每次只用其中的一块,当需要内存回收的时候,将存活的对象复制到另一块内存,然后将当前已经使用的内存一次性回收掉。需要浪费一半的内存。
标记-整理:让存活的对象向一端移动,之后清除边界外的内存。
分代搜集:根据对象存活的周期,Java堆会被分为新生代和老年代,根据不同年代的特性,选择合适的GC收集算法。
MinarGC:频率高、针对新生代。
FullGC:频率低、发生在老年代、通常会伴随一次MinarGC和速度慢。
强引用:强引用还在,垃圾搜集器就不会回收被引用的对象。
软引用:对于软引用关联的对象,在系统发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
弱引用:被若引用关联的对象只能存活到下一次GC之前。
虚引用:为对象设置虚引用的目的仅仅是为了GC之前收到一个系统通知。
类加载的过程可以分为:
1.加载:将类的全限定名转化为二进制流,再将二进制流转化为方法区中的类型信息,从而生成一个Class对象。
2.验证:对类的验证,包括格式、字节码、属性等。
3.准备:为类变量分配内存并设置初始值。
4.解析:将常量池的符号引用转化为直接引用。
5.初始化:执行类中定义的Java程序代码,包括类变量的赋值动作和构造函数的赋值。
6.使用
7.卸载
只有加载、验证、准备、初始化和卸载的这个五个阶段的顺序是确定的。
类加载的机制是双亲委派模型。大部分Java程序需要使用的类加载器包括:
启动类加载器:由C++语言实现,负责加载Java中的核心类。
扩展类加载器:负责加载Java扩展的核心类之外的类。
应用程序类加载器:负责加载用户类路径上指定的类库。
双亲委派模型如下:
双亲委派模型要求出了顶层的启动类加载器之外,其他的类加载器都有自己的父加载器,通过组合实现。
双亲委派模型的工作流程:
当一个类加载的任务来临的时候,先交给父类加载器完成,父类加载器交给父父类加载器完成,知道传递给启动类加载器,如果完成不了的情况下,再依次往下传递类加载的任务。
这样设计的原因:
双亲委派模型能够保证Java程序的稳定运行,不同层次的类加载器具有不同优先级,所有的对象的父类Object,无论哪一个类加载器加载,最后都会交给启动类加载器,保证安全。
三、计算机网络部分
关于网络部分这里就不细说了,有想看的小伙伴可以看看这位博主写的关于面试的博文https://blog.csdn.net/weixin_47933729/article/details/117120255
四、Android面试题
答:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNotResponding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要这样,这样系统就不会显示ANR给用户。
不同的组件发生ANR的时间不一样,Activity是5秒,BroadCastReceiver是10秒,Service是20秒(均为前台)。
如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。
主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
主线程中存在耗时的计算
主线程中错误的操作,比如Thread.wait或者Thread.sleep等Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框
应用在5秒内未响应用户的输入事件(如按键或者触摸)
BroadcastReceiver未在10秒内完成相关的处理
Service在特定的时间内无法处理完成20秒
修正:
自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。
关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
资料获取方式:前往我的GitHub
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结:
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
[外链图片转存中…(img-EwXuxwRL-1644119491882)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。