总体来说:笔试题还是相当简单的,不论前面单选、多选,还是后面的编程题,难度还是挺小的,都是基础知识。因此,想去这个公司工作的同学可以好好准备一下!废话不多说,直接上干货!
第一部分:单选、多选,考的都是Android和JAVA的基础知识。
(1)如何在JAVA代码中获取字符串资源:
具体选项忘了,但是就是选择一个错误的引用字符串资源代码,我目前知道引用如下:
tv.setText(R.string.Microstrong);
String s1=getResources().getString(R.string.Microstrong);
String s2=getString(R.string.Microstrong);
(2)考的是 1920X1080分辨率下,这部手机的dp=128,则换算成px是多少?
补充:为了支持多分辨率,Android从1.6版本开始有drawable-hdpi, drawable-mdpi, drawable-ldpi三个文件夹,xhdpi是从Android2.2 (API Level 8)才开始增加的。
drawable-hdpi文件夹中里面主要放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)。系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
drawable-mdpi放中分辨率的图片,即HVGA ( 320×480)
drawable-ldpi 放低分辨率的图片,即 QVGA (240×320)
drawable-xhdpi放高分辨率的图片,即720p(1280×720)
drawable-xxhdpi放高分辨率的图片,即1080p(1920×1080)
以上都是和屏幕像素密度无关的。
px:pixel,即像素,1px代表屏幕上的一个物理的像素点。但px单位不被建议使用。因为同样像素大小的图片在不同手机显示的实际大小可能不同。要用到px的情况是需要画1像素表格线或阴影线的时候,如果用其他单位画则会显示得模糊。
dip到px的转换公式:px=dip*(density/160);
1920X1080分辨率下,这部手机的dp=128,即每英寸具有128个像素点,px=128*(480/160)=384px;
(3)问题是:下列哪个选项不是Object类的方法?
(4)考察的是实例对象的问题:
题目:
String A="Microstrong";
String B="Microstrong";
String C="Micro";
String D="strong";
String E=C+D;
String F=new String("Microstrong");
String G="Micro"+"strong";
String H=F.intern();
问题:a、String F=new String("Microstrong");创建了几个String对象。
答案是两个,一个是字符串字面常数,在字符串池中。一个是new出来的字符串对象,在堆中。
问题:b、A==B? A==E? A==F? A==G? A==H?
注意: 当我们使用双引号创建一个字符串时,JVM会先在字符串池中查找是否其他任何字符串存储具有相同的值。如果找到了,返回它的引用,否则创建一个新的String对象,并将其存储在字符串池中。
当我们使用new运算符时创建String对象,但JVM不会将其存储到String Pool中。除非我们使用intern()方法将String对象存储到字符串池中,值如果已经存在String则返回引用。
答案:A==B,首先解释一下什么是字符串字面常数,字面常数就是你写在源代码里的值,如String s="Microstrong";"Microstrong"就是一个字符串字面常量。JAVA中,所有的字符串字面常数都放在字符串池里面,是可以共享的。也就是说A、B都引用的是同一个字符串对象。字符串字面常数是在Load Class时候实例化并放到字符串池里面去的。
A和E引用的不是一个对象。E是在程序运行时通过连接(+)计算出来的字符串对象,是新创建的,他们不是字面常数,就算他们值相同,他们也不在字符串池里面,他们在堆内存里面,因此引用的对象各不相同。
A和F可定不相等,A是在字符串池中,F是在堆中。
A==G,G是通过常量表达式计算出来的,他等同于字符串字面常数,在字符串池中。注意:通过常量表达式计算出来的字符串,也算是字符串字面常数,也是在字符串池中。
A==H, F.intern()方法是返回字符串在字符串池中的引用。
(5)Android中真实宽高,getWidth和getMeasuredWidth的区别:哪个计算的是真实的宽?
getWidth():得到的是View在父Layout中布局好后的宽度值,如果没有父布局,那么默认的父布局就是整个屏幕。
getMeasuredWidth():得到的是最近一次调用measure()方法测量后得到的是View的宽度,它仅仅用在测量和Layout的计算中。所以此方法得到的是View的内容占据的实际宽度。
总结:
getWidth(): View在设定好布局后整个View的宽度。
getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);否则你得到的结果和getWidth()得到的结果是一样的。
(6)静态变量存储区:
静态变量属于类的属性,存储在方法区。方法区保存一个类的模板,堆存放类的实例。栈用来函数计算。
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
栈区:
1.每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用(不是对象),对象都放在堆区中。
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
(7)考的是Http与Https的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
具体的Http与Https的区别和联系,还是好好学习。
(8)JVM类加载器,三种类型类加载器。
1.类与类加载器
对于任何一个类,都需要由加载它的类加载器和这个类来确立其在JVM中的唯一性。也就是说,两个类来源于同一个Class文件,并且被同一个类加载器加载,这两个类才相等。
2.双亲委派模型
从虚拟机的角度来说,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),该类加载器使用C++语言实现,属于虚拟机自身的一部分。另外一种就是所有其它的类加载器,这些类加载器是由Java语言实现,独立于JVM外部,并且全部继承自抽象类java.lang.ClassLoader。
大部分Java程序一般会使用到以下三种系统提供的类加载器:
1)启动类加载器(Bootstrap ClassLoader):负责加载JAVA_HOME\lib目录中并且能被虚拟机识别的类库到JVM内存中,如果名称不符合的类库即使放在lib目录中也不会被加载。该类加载器无法被Java程序直接引用。
2)扩展类加载器(Extension ClassLoader):该加载器主要是负责加载JAVA_HOME\lib\,该加载器可以被开发者直接使用。
3)应用程序类加载器(Application ClassLoader):该类加载器也称为系统类加载器,它负责加载用户类路径(Classpath)上所指定的类库,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
(9)getMeasureWidth()和getWidth()区别:
这个问题前边也考了一次,看来这个问题很重要,需要好好研究一下。
(10) 哪一个不属于白盒测试方法?
强度由低到高:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。
(11)intent传值类型:
题:Intent传递数据时,下列的数据类型不可以被传递的是()
A:Serializable
B:File
C:Parcelable
D:Thread
解析:1. 8种基本数据类型及其数组
2. String(String实现了Serializable)/CharSequence实例类型的数据及其数组
3. 实现了Parcelable的对象及其数组( 操作较复杂, 但速度快)。android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。
4. 实现了Serializable的对象及其数组(操作简单, 但速度慢)。Serializable:将 Java 对象序列化为二进制文件的 Java 序列化技术,是Java系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable接口,使用ObjectInputStream 和 ObjectOutputStream 进行对象的读写。
File在Java里也是类,在Android里也实现了Serializable接口
(12)Android 中remoteView的使用场景
(13)设计模式中,哪种模式是结构型模式
第二部分:简答题:
第一道简答题问一个优秀的app需要什么功能, 感觉是问产品思维,
第二道简答题:给了一段代码,让找出代码里的错误:知识点有:子线程更新UI、读取SD卡中的内容。感觉是要开启子线程,然后在子线程中用流读取数据,把读取的数据通过Handler的Postdelayed更新UI。
第三部分:一道及其简单的编程题:
大概题意是:给你一个数组,这个数组:1、2、3、5、6、8、1、5、8,求出这个数组中最长的递增序列长度。最长递增序列:1、2、3、5、6、8,长度为6.