初级android面试2.0

           博主前天又参加了面试,面试情况明显比第一次要的好多啊,但是感觉还是差一点点啊,总体面试的感觉就是,有些自己不用但是看过的东西都不了解,只知道有这个东西,但不知道这东西具体的用法,感觉大家学习的时候得注意一下,下面给大家看一看面试上遇到的一些问题(重复的问题不在列出啦,感觉2.0不全的话还可以去1.0补一补的)

java

  1.  静态变量与非静态变量的区别:    

                 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

                 两者的区别是:
               对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,每次创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

//JVM是Java Virtual Machine的缩写,是java虚拟机的意思。

               具体原理感兴趣的可以自行百度,这里说一下java虚拟机的优势把(多平台性):java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 

 

     2.静态内部类与非静态内部类

               内部类:定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。内部类也可以访问外部类的所有成员与方法(静态与非静态的都可以)。

              静态内部类:说白了就是用static修饰的内部类,静态类中可以有静态方法也可以为非静态方法,静态方法可以直接调用,但非静态的方法是不能直接调用的,必须创建对象才行。而且静态内部类是依赖这外部的类而存在的,如果要是实例化的话与内部类的实例化还是有区别的,如果要调用外部类的变量的化,只能调用静态变量,如果要调用非静态变量需要创建对象。而且只有静态内部类中才能有静态方法与变量(内部类不行),如果要定义静态的方法和变量,必须将其声明为静态内部类(这里说的是内部类与静态内部类,与外部类无关)。

              静态内部类与内部类的实例化区别:

                //A类中有内部类B与静态内部类C

                 内部类B实例化:A.B b=new a().new b();

                 静态内部C类实力化:A.C c=new A.C();

3.hashmap(这个听说很重要啊!!!!):

                 先给上原理:是java中的一种Map集合,HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Node。

                  再给上他的特点:1.是继承Map接口的

                                               2.是非同步的,所以比较高效

                                               3.他的键和值可以为null

                                              4.HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻                                                 址修改。

                最后给上简单的使用方法:

                 Map<String,String> map=new HashMap<String,String>();
                //put用于添加与修改map的值.在map中分为键与数据,前面保存的为键,后面的为数据,查询的时候通过键来寻找数据。                  map.put("1", "value1");
                map.put("2", "value2");
                map.put("3", "value3");
                //对map进行遍历(用高级for循环遍历)
                for(String key:map.keySet())//keySet()可以获得map中所有Key值的列表,Key值就是键值。
                 {
                 System.out.println("Key: "+key+" Value: "+map.get(key));//get(key)是获取key值所对应的数据
                 }
                 //如果直接输出map也是可以的System.out.println(map);会输出{1=value1,2=value2,3=value3}

                 HashMap的其他方法:
                      containsKey(Object key)方法,返回值为boolean,用于判断当前hashmap中是否包含key对应的key-value
                      containsValue(Object value)方法,返回值为boolean,用于判断当前hashmap中是否包含value对应的key-value
//这不是并不是最快的遍历方法,但是应该最好理解了。而且hashMap这里说的只是一些皮毛并不是全部,用法也是最基本的,要想深如理解还是得理解源码才能完全理解,而且hashMap还有很多机制这里没有说到。

4.常用的异常类型

               问这问题时候可真是难住我了,因为就算碰到异常也只是直接catch一个Exception e了,当时写代码时候真的很爽,但  过后发现其实真的很不负责任啊。

             常用的10大异常:

            1  Java.lang.NullPointerException(空指针异常) 

            这个异常大家肯定都经常遇到,异常的解释是 “程序遇上了空指针 “,简单地说就是调用了未经初始化的对象或者是不存                在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等                等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的                初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,
            依然是空的,所以还需要对每个元素都进行初始化(如果要调用的话)

            2 java.lang.ClassNotFoundException(没有指定的类)

            这个出现的情况就是没有导入对应的包。

            3 java.lang.ArithmeticException

            这个异常的解释是 “数学运算异常 “,比如程序中出现(1/0)除以零这样的运算就会出这样的异常,对这种异常,大家就要                好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。

           4 java.lang.ArrayIndexOutOfBoundsException(数组越界异常)

            就是数组的长度太短了,下标越界了,就要好好检查数组的长度了。

          5 java.lang.IllegalArgumentException(方法参数异常)

                    就是说方法中参数不符合规则,比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的会                出现 这个异常,再比如如果参数要求正数,你传递了一个负数也会跳这个异常。

          6 java.lang.IllegalAccessException(没有访问权限异常)
               当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这                个异常。对程序中用了                        Package的情况下要注意这个异常。

           7 java.lang.IncompatibleClassChangeError(不兼容的类变化异常)
                    当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义                    而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。

           8 java.lang.InstantiationError( 实例化异常)
                     当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常。

           9 java.lang.LinkageError(连接异常)
                     该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译                   所有的类,进而引发错误的情况。

           10 java.lang.StackOverflowError(堆栈溢出异常)
                   当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。

自己感觉常用的2个异常:

           IOException(IO异常又叫读写异常):就是在程序读写数据时出现的错误。

           RunntimeException(运行时异常):程序运行时所产生的异常。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

数据结构

             这次的数据结构问的比较基础,跟1.0是差不多的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------android

1.Handler的用法:

          Handler是android中所用的消息处理机制,用于线程之间的通讯,主要是用于子线程与主线程之间的通讯,当然也有其他的用法,这里就介绍最基本的子线程与主线程的通讯。由于在android中的耗时操作(像是网络请求这样的)需要在子线程中进行,但是一般进行完耗时操作,都要对UI控件进行操作(说白了就是在屏幕上显示耗时操作的结果)。但是由于在子线程中进行UI控件的操作会出现错误,使程序崩溃。所以UI操作只能在主线程中进行,所以就引入了Handler的用法。

          说到了Handler是负责发送与接送的,那么他发送与接收的是什么呢?这里就引出了另一个类Message,Message可以携带一些少量的信息,或者通过Bundle这个中间量来传递一个对象。(为方便理解这里给上最简单最好理解的代码)

         首先创建一个Handler对象:Handler  handler=new Handler(){//一定要定义在为全局变量,定义在最上边。

                                                                                                                 public    void   handleMessage(Message  msg){

                                                                                                                switch(msg.what){

                                                                                                                case    1://当msg.what为1时进行的UI操作

                                                                                                                break;退出循环

                                                                                                                default:break;}

                                                                                                                } 

         //Handler中的sendMessage方法传递的message会到Handler的方法handleMessage中。                                                  

                                                       }  

         然后需要创建一个子线程:new Thread(new Runnable(){

                                                         @Override

                                                         public void run(){

                                                         //耗时操作

                                                        }

                                                        }).start();//比较简单的子线程创建方法,新手推荐先了解原理。

       创建一个Message进行绑定数据:                                Message  Message=new   Message();

        用Message的已有字节来绑定数据:                           message.what=1;

       调用handler中的sendMessage方法把数据传出去:   handler.sendMessage(message);

       子线程的操作就结束了,上面写的主线程会继续执行接下来的UI操作。

    // 这里仅仅说了最简单的用法来方便理解,当然更复杂的方法与用法还是有的,就不都列举出来了。这种处理方法叫异步消息处理机制,当然也不只这一种,还有一种可以使用AsyncTask处理也是可行的,想了解的小伙伴可以了解一下,也是很好用的。

2.android的常用布局:

          android的4种基本布局:

                            1.线性布局:

                                         线性布局为最常用的布局,跟他名字一样就是像一条线一样,横着或竖着排列起来的。

                             2.相对布局:

                                       也是比较常用的,它可以通过相对定位的方式让控件出现在布局的任何位置。比如让一个控件位于整体的                                 左上,左下,右上,右下这样,或者位于另一个控件的左上,左下,右上,右下这样。

                             3.帧布局:

                                      这个就不是很常用了,所有控件会堆在左上角,没错,还会重合。

                              4.百分比布局

                                       这是以前没有的新增布局,为了解决控件平分布局的难题,在这种布局中,不再使用wrap_content和                                            match_parent来指定控件大小,而是直接指定控件在布局中所占百分比,这样就可以轻松实现平分布局甚至任                                  意比例分割布局

3.recylerView的下滑刷新

   说实话,博主也没用过这个功能,基本都是靠切换界面来实现刷新的,但既然问到了就说明还是挺常用的,虽然网上也有实现教程,但自己没用过的东西也不敢说对错,错了就很尴尬了。现在还在面试期,等面试期结束后会研究一下这个下拉刷新的功能,再与大家分享一下啊。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        其实博主这几天面试了不止两家公司,也面了很多公司,有的没什么营养,有的问项目比较多,因为都是自己写的,答的也比较得心应手,也不与大家分享了。还有的应该是招满人了,就与hr谈了20分钟就让走了,反正面试这东西什么样的都有,一个公司一个样,要是第一次面试的小伙伴,建议多看几家在决定,不要给offer就去了,给offer固然是好,但是感觉还是找一个最合适自己的公司最重要啊。这就是博主的经验了(估计还会有3.0),要是接下来的公司还有比较精髓(偏理论的)的面试题的话还会与大家分享的。也祝大家成功啊!!!!

//老规矩,要是博客有错误欢迎随时留言,会马上更改的。

 

 

 

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值