面试常见问题及相关答案整理(持续更新中)

2024Java面试八股文及答案整理(持续更新) String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。 阅读详情

1.Int a =1;

 Int result = a+++3<2;

 Result = 16

其中<<是左位运算 num<<1相当于乘以2 

>>是右位运算     num>>1 相当于num除以2

2.写出两种单列模式

饿汉式

class Single{

Private Single(){}

Private static Single s = new Single();

Public static Single getInstance(){

Return s;

}}

懒汉式

Class Single2{

Private Single2()

Private static Single2 s = null;

Public static Single2 getInstance(){

If(s==null)

S = new Single2();

Return s;}}

Activity的生命周期

onCreate() 在这里创建界面,做一些数据的初始化工作

onStart() 变成用户可见,不可交互的状态

onResume()变成和用户可以交互的状态

onPause()是可见的,但是不可以交互的

onStop()变得不可见,被下一个Activity覆盖

onDestory()

Back键 onPause()onStop()onDestory()

Home键onPause()onStop(),再次启动onRestary()onStart()onResume()

BroadcastReceiver的生命周期

Broadcastreceiver生命周期中有一个回调方法onReceiver(Context context,Intent boardcast)当接收器收到一条broadcast消息,Android就会调用onReceiver,并创递给它一个Intent对象,这个对象携带着那条broadcast消息,我们认为仅当执行这个方法的时候,BroadcastReceiver是活动的,这个方法返回时,它就终止了。这就是BroadcastReceiver的生命周期

由于BroadcastReceiver的生命周期很短,一个带有活动的BroadcastReceiver的进程时受保护的,以免被干掉,但是Android会在任意适合干到那些携带不在活动的剪裁,解决上述方案,采用一个Service来完成这项工作,Android会认为哪个进程中仍然有活动的组件,生命周期只有10s面左右,如果在onReceiver内做超过10s的事,就会报ANR。

在配置文件中声明broadcast Receiver几乎总是需要intent filter在配置文件中完成声明后,及时应用当前未运行,只要有匹配的broadcast intent的发来,broadcast Receiver就会接收,一收到intent,broadcast receiver的onReceiver方法开始运行,然后broadcast receiver就会被销毁。

注册和接收BroadCastReceiver两种方式的区别:

两种方式分别是在程序中动态注册和在xml中指定,区别就是范围不同,程序中动态注册的接收者只能在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动都会起作用

写出几种Service和Activity的交互方式

共有3种交互方式:

1.广播交互:

通过广播的方式实现Activity和Service的交互操作,简单而且容易实现,可以胜任简单级的应用,但是缺点也十分明显,发送广播受到系统制约系统会优先发送系统级的广播,造成我们自定义的广播功能会延迟,同时广播接收器中不能处理长时间耗时的操作,否则就会ANR

2.共享文件交互:

这里提到的共享文件是指,Activity和Service使用同一个文件来达到传递数据的目的,使用sp来实现共享,也可以使用IO。但是实现交互的时候需要注意,对于文件的读写,同一时间只能一方读,一方写,不能两方同时写,当写入数据较为复杂或者数据量比较大的时候,就有可能导致写入和读取的数据不一致的错误。

3.Message交互

引用一个Handler对象和平时使用Handler和Thread通信的方式相同

UI线程和非UI线程的交互方式

不要在UI线程里面写写耗时的操作,导致UI线程堵塞

不在在UI线程里面绘图

交互方式有:

Handler;Activity.runonthread;view.post(Runnable);view.postDelayed(Runnable);AsnyTask

requestLayout,invalidate和postInvalidate的异同

Android中显现View的更新有俩种方法,一种是invalidate另一种是postInvalidate其中,前者是在UI线程自身中使用,而后者是在非UI线程中使用。

使用invalidate刷新,需要配合Handler使用,使用异步非UI线程转到UI线程中调用,如果要在非UI线程中直接使用,就会用postInvalidate方法,省去使用Handler

requestLayout使用,当View确定自身已经不再适合现有这个区域时,给View本身调用这个方法,要求parentview(父类的视图)重新调用它的onMeasure onLayout来重新设置自己的位置,特别是当View的Layoutparameter发生改变,并且它的值还没能应用到View上时,适合调用这个方法

http怎么加入超时和代理

http链接的超时机制能够方式联系线程的无限等待

HttpClient httpclient = new DefaultHttpClient();

HttpParams patams = htttpClient.getParams();

HttpConectionParams.setConnectionTimeOut(params,HTTP_CONNECT_TIMEOUT);

HttpConnectionParams.setSoTimeou(params.HTTP_SOCKET_TIMEOUT);

 

HttpURLConnection

Try{

URL url = new URL(“www.baidu.com”);

HttpURLConnection coon = (HTTPURLConnection)url.openConnection();

coon.setConnectionTimeout(HTTP_SOCKET_TIMEOUT);

}

Catch(Exception e)

e.printException}

设置代理

Httpclient httpclient = new DefaultHttpClient();

String host = Proxy.getDefaultHost();

Int port = android.net.Proxy.getDeaultPort();

SocketAddress sockAddr = new InetSockAddress(host,port);

java.net.Proxy proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP,sockAddr);

Try{

URL url = new URL(“www.baidu.com”);

HttpURLConnection conn = (HttpUrlConnection)url.openConnection(proxy);

Catch(Excepiton e){

e.printStackTrace()}}

Sleep,wait,notify的区别

Sleep是线程类的方法,是Thread的静态方法,需要传参数,导致线程暂停指定的时间,给执行其他线程,但是监控状态依然会保持,到时候会自动恢复,调用sleep不会释放对象锁。

Wait是Obeject类的方法,可以不用传参数,对此对象调用wait方法导致此对象放弃对象锁,进入等待此对象的等待锁定池,只有对此对象发出notify方法治好,本线程才进入对象锁定池,准备获得对象锁进入运行状态。在其他线程调用此对象的notify()方法或者notifyAll()方法前,导致当前线程等待

View和viewGroup的关系

View是所有UI组件的基类,而ViewGroup是容纳这些组件的容器,也是View的子类

如何定位和解决Android的内存溢出问题

当项目中包含大量的图片,或者图片过大的时候会导致oom,等比例缩小,对图片进行软引用,及时进行recycle操作

对复杂的listview进行合理的设计和编码

单个页面,横竖屏切换N次会导致OOM,在代码中引用,并在onDestory时候及时释放,避免xml的重复加载

简述Observer设计模式,并且画出Oberver模式的典型结构类图

定义了一种一对多的依赖光纤,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化,会通知所有观察者对象,自己更新自己

&&和&的区别

这两个都是逻辑运算符,判断两边为真则语句成立,但是&&是第一个条件不成立之后,后面的都不执行了,但是&则是要继续执行。

静态成员类,非静态成员类有什么区别?什么是匿名内部类?

静态成员类就是该类的所有对象可以共享,非静态成员类是普通成员

匿名内部类就是没有名字的内部类,因为没有名字,所有匿名内部类只能使用一次,用来简化代码

一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组

int maxnum = A[0]+A[1]

For(int i =0;i<N;i++){

Int tempnum = A[i-1]+A[i];

If(maxnum<temnum){

Maxnum = temnum;}}

Handler机制原理,内部类是如何实现的,消息队列的实现机制

UI更新只能在UI线程,即主线程,子线程更新UI要用Handler

 

什么是ANR,如何定位和避免

Anr application not responding 在Android中,活动管理器和窗口管理器这两个系统负责监视应用程序的相应出现对输入事件(按键,触屏事件)响应超过5s,意向接收器超过10s仍然有未完成执行,在主线程中有大量耗时操作。

简述Android的启动过程

Init进程启动 Native服务启动 System Service Android服务启动 Home启动

线程的同步

有可能线程间相互干涉和内存一致性的问题,采用synchronized关键字

getHeight和getMeasureHeight的区别

getMeasureHeight是在Measue()过程结束之后就可以获取到的,而getHeight方法要在onLayout之后才能获取

根据源码,getwidth返回的是右边坐标减去左边坐标,这里需要布局之后才能确定它们的坐标,也就是说在布局之后调用getwidth方法,所以getwidth获得的宽度是View在设定好布局之后的整个View的宽度。

getMeasureWidth:

得到的是最近一次调用measure()方法测量后得到的是View的宽度,它应该仅仅用在测量和Layout的计算getMeasuredWidth()是对View上的内容进行测量后得到的View内容占据的宽度。 前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。

如何实现View判断单击和双击?自定义view的OnDraw方法主要做什么

实现OnTouchListener复写onTouch方法,如果两次间隔小于300ms,则为两次点击

onDraw()ViewRoot中的代码会继续执行,并创建一个Cancas对象,然后在调用View的draw()方法,来进行绘制

在绘制过程中,先得到一个mBGDrawable对象,来根据layout过程确定的视图位置来设置背景的绘制区域,之后调用Drawable的draw()方法来完成背景的绘制工作,在onDraw()的方法里传入Canvas这个类

图片的缓存机制,如何做到高效和稳定

获取图片

是否在内存中(LRU最近最少使用算法)中有图

Return

文件中获取(加入到内存当中)

开启网络下载,网络下载过程中成功下载图片储存到内存当中,储存到本地当中

通过bitmap.compress写入文件

有一个数列,奇数个,其中有3个是单个的, 其它都是成对的,怎么找出其中任意一个单个的数

public static void singleNum(){

      int a[] = new int[]{5,-2,4,4,5,3,-9,-2};

      //记录不用参加比较的索引

      int b[] = new int[a.length/2];

      int i=0;

      int piv = a[0];

      int j=1;

      int n=0;

      while(j<a.length){

        if(piv==a[j]){

           i++;

           piv = a[i];

           b[n] = j;

           n++;

           j=i+1;

        }else if(contains(b,j)){

           i++;

           piv=a[i];

        }else{

           j++;

        }

      }

      System.out.println("单个的数为:"+ piv);

   }

   /**

    * 判断是否包含

    */

   public static boolean contains(int a[],int num){

      for(int i=0;i<a.length;i++){

        if(a[i] == num){

           return true;

        }

      }

      return false;

   }

在一个数组中,找出出现次数最多且数值最大的一个数并输出

public class HashMapTest1

{

    /**

     * 找出一个数组中一个数字出现次数最多的数字

     * 用HashMap的key来存放数组中存在的数字,value存放该数字在数组中出现的次数

     * @author xiaoluo 

     */

    public static void main(String[] args)

    {

        int[] array = {2, 1, 2, 3, 4, 5, 2, 2, 2, 2};

        

        //map的key存放数组中存在的数字,value存放该数字在数组中出现的次数

        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

        

        for(int i = 0; i < array.length; i++)

        {

            if(map.containsKey(array[i]))

            {

                int temp = map.get(array[i]);

                

                map.put(array[i], temp + 1);

            }

            else

            {

                map.put(array[i], 1);

            }

        }

        

        Collection<Integer> count = map.values();

        

        //找出map的value中最大的数字,也就是数组中数字出现最多的次数

        int maxCount = Collections.max(count);

        

        int maxNumber = 0;

        

        for(Map.Entry<Integer, Integer> entry : map.entrySet())

        {

            //得到value为maxCount的key,也就是数组中出现次数最多的数字

            if(maxCount == entry.getValue())

            {

                maxNumber = entry.getKey();

            }

        }

        

        System.out.println("出现次数最多的数字为:" + maxNumber);

        System.out.println("该数字一共出现" + maxCount + "次");

    }

}

 

怎么样的类可以作为hashmap的键

容器装的都是Object的,需要Integer,Double这些类

进程和线程之间的联系与区别

定义:进程是具有一定独立功能的程序关于某个数据集合上的一次运动活动,进程是系统进行资源分配和调度的一个独立单位,一个正在运行的程序

线程是进程的一个实体,在CPU调度和分配的基本单位,它是比进程更小的独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点再运行中必不可少的资源,但是它可与同属一个进程的其他线程共享进程所拥有的全部资源,进程的执行单元,一条执行路径

多线程:就是指应用程序有多条执行路径

关系:一个线程可以创建和撤销另一个线程,同一个进程中的多个线程直接可以并发执行

区别:一个程序至少有一个进程,一个进程至少有一个线程;

线程的划分尺度小于进程,使得多线程程序的并发性高;

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;

线程在执行过程中与进程还是有区别的,每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序当中,由应用程序提供多个线程执行控制;

多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,开始实现进程的调度和管理以及资源分配

Intent的用途,以及IntentService

Intent意图:描述要来干什么

显示意图:对于明确指出目标组件名称的

隐式意图:没有明确指出目标组件名称的

IntentService:是Service的子类,用来处理异步请求,客户端通过StartService的方法传递请求给IntentService,IntentService在onCreat()函数中通过HandlerThread单独开启一个线程来处理所有Intent请求对象,以免事务处理阻塞主线程,执行完所有的一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service,否则执行下一个Intent请求所对应的任务,每次只会执行一个工作现场,执行完第一个之后再执行第二个。

优点:Activity的进程,当处理Intent的时候,会产生一个对应的Service

     Android的进程处理器会尽可能的不kill掉

     容易使用

广播创建方式有几种?有什么区别?

两种方式:

常驻型,当程序关闭之后,如果信息广播来,程序也会被系统调用自动运行

不是常驻型,广播随着程序的生命周期开启和结束

AIDL的全程

Android interface definition language安卓接口定义语言

Aidl的文件都是公有的,没有访问权限的修饰

如何收集软件崩溃信息

1.log 2.写本地文件 3.友盟收集

自定义控件相关

1.继承已有的控件实现自定义

2.继承View onMeasure onLayout onDraw

Listview下拉刷新和分页加载的实现机制

当用户滑到listview最后一项是,通知异步线程进行加载下一页的数据,下一页加载完成之后调用adapter的notifydatasetchanges()方法或者调用ListView的onScroll

Activity的启动模式和Flag标记

Standard:标准模式,这是系统的默认模式。每次启动Activity都会重新创建一个新的实例,不管这个实例是否已经存在

singleTop:栈顶复用模式,这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建

SingleTask:栈内复用模式:这是一种单例模式,在这种情况下,只要有Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例

SingleInstance:单实例模式:这个是一个增强的singleTask模式,那就是具有此种模式的Activity只能单独位于一个任务栈中。

Activity的Flag:

FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是为Activity指定"singleTask"启动模式,其效果和在XML中指定该启动模式相同;

FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是为Activity指定"singleTop"启动模式,其效果和在XML中指定该启动模式相同;

FLAG_ACTIVITY_CLEAR_TOP:具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈;

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性"android:excludeFromRecents="true""

通过Intent传递一些二进制数据的方法有哪些

1.使用Serializable接口实现序列化

2.实现Parcelable接口

Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念

DVM指Dalvik的虚拟机,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是Linux中的一个进程,所以是同一个概念。

View的刷新

需要刷新的地方使用handle.sendmessage发送信息,然后再handle的getmessage里面执行invalidate或者postinvaliate

说说MVC模式的原理

M,model 是应用程序的主体部分,所有的业务逻辑都应该写在这一层,对数据库的操作,对网络等操作都在model层,对业务计算等操作也是必须放在这一层

V,view 是应用程序中负责生产用户界面的部分

C,control 是根据用户的输入,控制用户界面数据显示以及更新model对象的状态部分。通常落在Activity肩上

横竖屏切换的Activity的生命周期

1.不设置切横屏会执行一次,切竖屏会执行两次

2.设置activity的android:configChanges=“orientation”切屏重新调用生命周期,切换横竖屏都只会执行一次,但是竖屏最后多打印一个onConfigurationChanged();

3.设置Activity的android:configChanges=“orientation|keyboardHidden”时,切换不会重新调用各个生命周期,只会执行inConfigurationChangeed(),横屏一次,竖屏两次

如何将SQLite数据客户与apk文件一起发布

可以将文件复制到res aw目录中,所有在res aw的目录中的文件都不会被压缩,这样可以直接提该目录中的文件,可以将db文件复制到res aw目录中

谈谈安卓里面的ipc机制

Ipc是内部进程通信的简称,是共享“命名管道”的资源,Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,通过定义AIDL接口文件来定义IPC接口,Service端实现IPC接口,Client端调用IPC接口本地代理

NDK是什么

NDK是一系列工具的集合,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java应用打包成apk包

NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu

简单描述一下Android的系统框架

Android的系统框架从上往下为Linux内核层,运行库,应用程序框架层和应用程序层

Activity被重新创建后恢复缓存数据方法

onSavaInstanceState()和onRestoreInstanceState();方法

Android的Service的生命周期

1.采用Context.StartService方法

onCreate onStart onDestory

onCreate该方法在服务被创建的时调用,该方法只会被调用一次,无论调用多少次startService或者bingService,服务也只会被创建一次

onStart只有采用Context.startService方法启动服务时才会回调该方法,该方法在服务开始运行时被调用,onStart方法会被多次调用

onDestory方法在服务被终止的时候调用

2.采用Context.bindService方法启动服务有关的生命周期方法

onCreate onBind onUnbind onDestory

onBind只有在Context.bindService方法启动服务时候才会回调该方法,该方法在调用者和服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService的方法并不会导致该方法被多次调用

onUnbind只有采用Context.bindService方法启动服务的时候才会回调该方法。触发生命周期如下

onCreate onStart onBind onUnbind onRebind

Application类的作用

要在android使用全局变量就可以使用Application的context

Synchronized关键字

保证了多个线程对于同步块是互斥的,synchronized作为一种同步手段,解决java线程的执行有序性和内存可见性

设计模式(面向对象 闫红) 数据结构+算法(java版)线程的并发编程 操作系统和组成原理

创建线程的方式

有2中

方式1:继承Thread类

  A.定义一个类继承Thread类

  B.子类要重写Thread类的run()方法

  C.让线程指定执行

启动线程并执行,是不能使用run()方法的,这个时候需要使用start(),这个方法其实做了两件事情,第一,让线程启动 第二,自动调用run()方法

方法2:实现Runnable接口

 A.创建一个类实现Runnable接口

 B.重新run()方法

 C.创建类的实例

 D.把类的实例作为Thread的构造参数传递,创建Thread对象

两种方法的区别:1.避免单继承的局限性 2.实现接口的方式,只创建了一个资源对象,更好的实现了数据和操作的分离

为什么要使用线程?什么时候使用?

为了提高效率才使用,只要当要操作的代码的内容比较多,比较耗时,循环次数较多的情况才使用

线程执行的随意性

程序的执行,其实是抢占CPU的资源,CPU是在多个程序之间做着高效的切换。

线程的生命周期:

 

线程的随机性和延迟性,导致线程共享数据出现了问题。

解决方法:

在多线程程序中,一般来说不是所有的代码都有问题,所有我们只需要找到那些可能出现问题的代码,把可能出现问题的代码,给包起来,看做一个整体,只有这个整体完毕,别人才能继续访问。为了安全,把整个包起来的代码加个锁给锁起来。

怎么找:1.看没有有共享数据 2.看对共享数据的操作是不是多条语句 3.看是不是在多线程程序中

怎么锁:synchronized(所对象){

     需要被锁的代码} 多个线程必须使用同一把锁

  同步代码快的锁是任意的对象 

  同步方法锁对象是this对象

  静态方法的锁对象是 类的字节码文件对象

被同步的内容越少越好,所以一般使用同步代码块

如果一个方法内部全部同步了,可以考虑使用同步方法

线程间的通信

不同种类的线程间对共享数据的操作问题

线程的优先级

getPriority()获取线程的优先级,默认是5,范围是1到10.在一定程度上,让线程获得较多的执行机会

Yield:

尽可能暂停当前正在执行的线程对象,并执行其他线程,是为了让线程更加和谐,但不要依赖,如果要实现真正的数据依次数据就需要等待唤醒机制

Join(加入线程)

一旦有join()线程,那么其他线程必须都等待,知道该线程结束

setDaemon(守护线程)

将该线程标记为守护线程或者用户现在,当正在运行的线程都是守护线程时,java虚拟机退

出。该方法必须在启动线程前调用。一旦主线程结束,那么守护线程就结束了

生产者/消费者模式

生产者/消费者模式其实是一个很经典的线程同步模型,很多时候,并不是光保证多个线程对某共享资源操作的互斥行就够了,往往多个线程之间都有协作的。

假设有这样一种情况,有一个桌子,桌子上面有一个盘子,盘子里面只能放一颗鸡蛋,A专门往盘子里面放鸡蛋,如果盘子有鸡蛋,则一直等到盘子里面没有鸡蛋,B专门从盘子里面拿鸡蛋,如果盘子里面没有鸡蛋,则等待直到盘子里面有鸡蛋。其实盘子就是一个互斥的区域,每次往盘子里面放鸡蛋应该是互斥的,A的等待其实就是主动放弃县城所,B等待时候还要提醒A放鸡蛋。

声明一个Plate对象,被线程A和线程B共享,A专门放鸡蛋,B专门拿鸡蛋。假设:

A.开始,A调用plate.putEgg方法,此时eggs.size()为0,因此顺利将鸡蛋放到盘子,海之星了notify()方法,唤醒锁的阻塞队列的线程,此阻塞队列还没有线程。

B.又有一个A线程对象调用plate.putEgg方法,此时eggs.size()不为0,调用wait()方法,自己进入了锁对象的阻塞队列

C.此时,又来了一个B线程对象,调用plate.getEgg()方法,eggs.size()不为0,顺利的拿到了一个鸡蛋,还执行了notify()方法,唤醒锁的阻塞队列的线程,此时阻塞队列有一个A线程对象,唤醒后,它进入到就绪队列,就绪队列就它一个,因此马上得到锁,开始往盘子里面放鸡蛋,此时盘子都是空的,因此放鸡蛋成功

Volatile关键字

是java提供的一种同步手段,只不过它是轻量级的同步,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性

在Android当中,简述一下jni的调用过程

A.安卓和下载cygwin,下载Android sdk

B.在ndk项目中JNI接口的设计

C.使用c/c++实现本地方法

D.JNI生产动态链接库so文件

E.将动态链接库复制到java工程,在java工程中调用,运行java工程

Android应用程序结构有哪些

Linux内核,系统运行库,开发框架包,核心应用程序

如何打开res aw目录中的数据库文件

在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动的时候将该文件复制到手机内存或是SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResource().openRawResource方法获得res aw目录中的资源的InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应的文件中,在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录的SQLite数据库文件

Android的储存方式

A.采用SharePreference储存数据,只能在同一个包内使用,不能不同包之间使用

B.文件存储数据:采用openFileInput()和openFileOutout()方法

C.SQLite数据库存储数据

D.使用ContentProvider存储数据:主要应用于程序之间进行数据交换,从而能够让其他应用保存或者读取此Content Provider的各种数据类型

E.网络存储数据

Android中Activity,Intent,Content Provider,Service各有什么不同

Activity:活动窗体,是最基本的Android应用组件,一个活动就是一个单独的屏幕,每一个活动窗体就是一个单独的屏幕,每个活动都被实现为一个独立的类,并且从活动基类中继承而来

Intent:意图,描述应该干什么。最重要的部分是动作和动作对应的数据

Content Provider:内容提供器,Android应用程序能够将它们的数据保存到文件,SQLite数据库中,甚至是任何有效的设备中。

Service:服务,具有一段较长生命周期且没有用户界面的程序

Android:gravity与Android:layout_gravity的区别:

前者是让EditText中的文字在EditText组件中居中显示

后者是让EditText组件在LinnerLayout中居中显示

同步静态和非静态的区别:

静态方法声明必须有static,调用的时候使用类名+.+静态方法名方式

非静态方法不能使用static关键字,调用的时候需要初始化该方法所属的类

本质区别:静态方法在程序初始化之后一直会贮存在内存中,不会被垃圾回收器回收。非静态方法只在该类初始化后贮存在内存中,当该类调用完毕后会被垃圾回收器回收。

同步静态方法和同步非静态方法的异同

所有的非静态方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待

如有有个100M大的文件,需要上传至服务器中,而服务器form表单最大只能上传2M可以用什么方法:

首先使用http协议上传数据,将我们的数据进行解析组拼成字符串,以流的方式发送到服务器当中,且上传文件用的都是post,因为post方式对大小没有限制。

假设可以每次真的只能上传2m,那么可能我们只能把文件切断,然后分别上传。

AsyncTask使用在那些场景?它的缺陷是什么?如何解决?

是比Handler更轻量级(只是代码轻量级,而实际上要比handler更耗费资源),适用于简单的异步处理

需要一些好使操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的UI进行更新。

缺陷:一个AsyncTask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池已有128个线程,缓冲队列已满是,如果在提交任务就会抛出RejectedExecutionException

解决:由一个控制线程来处理AsyncTask的调用判断线程池是否满了,如果满了则线程睡眠否则继续处理

AsyncTask定义了三种泛型类型:Params,Progress和Result

Params:启动任务执行的输入参数

Progress:后台任务的百分比

Result:后台执行任务最重返回的结果

至少要重写以下两个方法:

doInBackGround(Params...)后台执行,比较耗时的操作都可以放在这里,这里不能直接操作UI,此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间,在执行过程中可以调用publicProgress(Progress..)来更新任务的进度

onPostExecute(Result)相当于Handler处理UI的方式

同步和异步的使用场景:

如果数据将线程间共享,列如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行共享存储。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程。

Android下Context,Activity,Application之间有什么区别

首先Activity和Application都是Context的子类。Activity和Application维护的生命周期不一样,前者维护的是一个Activity的生命周期,而对应的Context也只能访问该Activity内的各种资源。后者是维护Application的生命周期。Application的Context只针对整个应用。

注意内存泄露,防止内存泄露应该注意以下几个方面:

A.不要让生命周期长的对象引用Activity context,即保证引用Activity的对象要与Activity本身的生命周期是一样的

B.对于生命周期长的对象,可以使用Application context

C.避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化

如果Android需要用到一些全局变量,可以引用Application这个类,在Activity中可以使用getApplication()方法获得实例。

IPC是什么?

IPC是内部进程通信的简称,是共享“命名管道”的资源,Android中的IPC机制是为了让Activity和Service直接可以随时的进行交互,故在Android中,该机制,只适用于Activity和Service之间的通信。通过定义了AIDL接口文件来定义IPC接口。

接口和抽象类的区别:

接口是对动作的抽象

抽象类是对根源的抽象

抽象类表示的是这个对象是什么

接口表示的是这个对象能做什么

A.接口是抽象类的变体,接口中所有方法是抽象的

B.接口可以多继承,抽象类不行

C.接口定义方法,不能实现,抽象类可以实现部分方法

D.接口中基本数据类型为static,而抽象类不是

经典接口面试题与答案整理--已完结 首先,非常感谢咱们松勤软件测试学员的面试题分享,最近小明老师把问题的答案整理了一下,分享出来给大家,希望能够帮助大家在面试过程中少踩坑,提高面试通过率。本文持续更新,后期有新的问题会同步分享给大家。有需要其他方面的知识资料的,可以私信我。大家如果对以下问题有什么更好的解答思路,也欢迎讨论区留言 1、什么是HTTP协议无状态协议?怎么解决HTTP协议无状态协议 是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发 阅读详情

相关推荐

软件测试:面试题整理附答案,一点点面试小总结(第二弹)

话不多说,我只是一个爱整理软件测试相关的面试题的卑微萌新,直接上干货 有情怀,有干货,点击这里【Python自动化测试】领取更多软件测试面试资料。 发现一个 bug,怎么定位是 APP 端还是服务端的问题 考点: 1、考察对测试基础的理解 2、考察实际工作中问题排查的能力 参考答案: 1、抓包分析, 通过对客户端进行抓包,分析服务端返回的数据是否符合预期,如果服务端数据是正确的,那就是客户端的问题。 2、日志分析, 可以通过查看客户端/服务端的日志,分析有没有异常的日志信息,从而确定具体原因。 针对 A.

camagailun的博客 5868

android 多线程实现方式

android 多线程实现方式: 由于android是单线程模式,所有的ui操作必须在主线程里进行操作,但有些耗时的ui操作又会阻塞主线程,所以需要一种方式来在其他线程里处理耗时操作,handler应运而生。 1.handler方式 这是android 最基本的线程实现方式–异步消息处理机制,在其中涉及到4个概念。 message,looper,handler,messageQueue.

android开发实习生面试中一些问题 812

2020,300道高级iOS开发面试题(最新整理)

这个栏目将持续更新–请iOS的小伙伴关注! 一:知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新iOS面试题总结 8、拼多多–最新iOS面试题总结 9、快手–最新iOS面试题总结 10、虎牙–最新iOS面试题总结 11、iOS面试–最新快手iOS面试题 12、iOS面试–字节跳动最新iOS开发面试题 13、(最新)iO.

D_猿员的博客 7029

经常使用runOnUiThread(),你真的理解它吗

在Android开发的过程中,主线程主要来完成UI绘制和响应用户的操作,默认情况下,我们大部分的代码都是在主线程 中执行的,因此我们时刻要考虑主线程的情况。我们都知道要开启一个子线程来完成一个耗时操作,以避免阻塞主线程影响 用户体验,甚至ANR。但是子线程执行完要更新UI的时候,我们又必须回到主线程来更新,实现这一功能常用的方法是执行 Activity的runOnUiThread()方法:ru

每天进步一点点 2万+

避坑指南:QCustomPlot鼠标事件冲突解决方案(左键拖动vs右键框选)

本文深入解析QCustomPlot在QT框架下的高级交互实现,重点解决左键拖动与右键框选的冲突问题。通过自定义事件处理和QRubberBand技术,提供了一套完整的无冲突交互方案,帮助开发者优化数据可视化应用的用户体验。

moss5的博客 660

【信息学奥赛一本通】1215:迷宫(bfs版)

同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。每组测试数据的第1行是一个正整数n(1≤n≤100),表示迷宫的规模是n×n的。接下来是一个n×n的矩阵,矩阵中的元素为‘再接下来一行是4个整数ha,la,hb,lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n的格点组成,每个格点只有2种状态,.

chu_xiaojie的博客 944

runOnUiThread简单使用

如简单更新ui可使用如下代码: runOnUiThread(new Runnable() { @Override public void run() { textView.setText("aaaaaaaaaaaaaaaaa"); } });

xlhb的专栏 5428

Penpot自托管全攻略:5分钟搞定私有化部署(附Docker配置详解)

本文详细介绍了Penpot开源原型设计工具的私有化部署全流程,从Docker基础配置到企业级优化方案。通过分步指南和实战技巧,帮助设计团队快速搭建安全高效的自托管环境,实现数据自主可控。内容涵盖LDAP集成、性能监控、备份策略等关键企业需求,是Penpot私有化部署的完整参考手册。

sugar的博客 1132

Android开发-多线程

android 多线程 AsyncTask

上千主上-贝库塔 1069

用Python搞定超效率SBM模型:从数据清洗到结果可视化全流程指南

本文详细介绍了如何使用Python实现超效率SBM模型,从数据清洗到结果可视化的全流程指南。超效率SBM模型作为传统DEA的进化版本,能有效处理非期望产出(如环境污染)并对高效单元进行精细排序。通过实战案例和代码示例,帮助读者掌握这一先进模型的Python实现技巧,提升效率评估的准确性和可视化效果。

silver的专栏 649

001、Zephyr RTOS简介与历史背景

本文介绍了Zephyr RTOS的特点及其在嵌入式开发中的应用。作者通过亲身经历比较了Zephyr与传统RTOS的差异,重点分析了Zephyr的设备树、统一驱动模型、基于CMake的构建系统、POSIX兼容层等核心特性。文章详细阐述了Zephyr在内核设计上的优势,如中断处理模型、内存管理等,并提供了社区生态和使用建议。作者建议开发者从简单项目入手逐步掌握Zephyr,同时指出了常见的使用问题和适用场景,认为Zephyr特别适合复杂软件架构的物联网和工业控制项目。

m0_50546716的博客 154

关于runOnUiThread

理解 Activity.runOnUiThread 在开发 Android 应用的时候我们总是要记住应用主线程。 主线程非常繁忙,因为它要处理绘制UI,响应用户的交互,默认情况下执行我们写下的大部分代码。 好的开发者知道他/她需要将重负荷的任务移除到工作线程避免主线程阻塞,同时获得更流畅的用户体验,避免ANR的发生。 但是,当需要更新UI的时候我们需要“返回”到主线程,因为只有它才可以更新应用 UI。 最常用的方式是调用 Activity 的 runOnUiThread() 方法: runOnUiThrea

m0_50639018的博客 885

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

Java面试题及答案整理(140道)持续更新

发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~博主已将这些面试题整理到一个网站上,每天更新 Java 面试题,目前有 1万多道 Java 高频面试题。 本套Java面试题大全,汇总了大量经典的Java程序员面试题以及答案,包含Java语言常见面试题、Java工程师高级面试题及一些大厂Java开发面试宝典 这套7000多页的Java面试题 PDF 大全,希望对大家有帮助哈~ 已经整理成7000多页,面试手册PDF版 这套Java面试题大

架构师专栏 2万+

LVGL v8学习笔记 | 09 - 进度条控件的使用方法(bar)

lv_bar_set_range必须放在lv_bar_set_mode前面,否则不生效。bar对象的API在lv_bar.h中声明,以lv_bar_xxx命名。此事件可以用来在进度条更新值之后更新别的控件(比如进度条旁边的文字)。可以看到,默认创建的进度条值是0到100。(3)设置进度条的范围值(最大值和最小值)(2)获取进度条的起始值。(3)获取进度条的最小值。(4)获取进度条的最大值。(1)设置进度条的当前值。(2)设置进度条的起始值。(1)获取进度条当前值。(5)获取进度条的模式。

Mculover666的博客(嵌入式) 1729

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。

FJN110的博客 120

SpringCloud面试题及答案 300道,springcloud面试题总结 (持续更新)

SpringCloud面试题及答案(SpringCloud面试题大全带答案) 2021年面试题及答案【最新版】高级SpringCloud面试题大全,发现网上很多SpringCloud面试题及答案整理都没有答案,所以花了很长时间搜集,本套SpringCloud面试题大全,有大量经典的SpringCloud面试题以及答案,面试经验技巧等,应届生,实习生,企业工作过的,都可参考学习! 本套SpringCloud面试题大全,汇总了大量经典的Java程序员面试题以及答案,包含SpringCloud语言常见面试题、

架构师专栏 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java面试题及答案整理( 2023年 6 月最新版,持续更新)

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

qq13321123的博客 4万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

2025年最全面的Java面试题及答案整理合集(持续更新中)

10、Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个master,另外 10 个选了另一个 master,怎么办?所有的面试题目都不是一成不变的,特别是大厂,上面的这些面试题目只是给大家一个借鉴作用,最主要的是给自己增加知识的储备,有备无患。35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

m0_69632475的博客 1108

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java面试题及答案整理( 2022年最新版,持续更新)

发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~ 这套互联网 Java 工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题 本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自

架构师专栏 2173

2024最全Android面试题及答案整理4【持续更新】

每一章节都是站在企业考察思维出发,作为招聘者角度回答。从考察问题延展到考察知识点,再到如何优雅回答一面俱全,可以说是求职面试的必备宝典,每一部分都有上百页内容,接下来具体展示,完整版可直接下方扫码领取。第一章 算法和数据结构面试题汇总第二章 Java核心基础面试题汇总第三章 Java深入泛型与注解面试题汇总第四章 Java并发编程面试题汇总第五章 Java虚拟机原理面试题汇总第六章 Java反射类加载与动态代理面试题汇总第七章 网络编程面试题汇总第九章 高级UI面试题汇总。

bugyinyin的博客 1589

Python常考面试题汇总(附答案)(持续更新)

Python3 中有六个标准的数据类型:Python3 的六个标准数据类型中:js就是典型的弱类型语言,例如在console下面模拟一下数字和字符串相加,会发现发生了类型转换。 而Python会报TypeError“当一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”鸭子类型关注的是对象的行为,而不是类型。比如file,StringIO,socket对象都支持read/write方法,再比如定义了__iter__魔术方法的对象可以用for迭代。下面用一个例子来模拟鸭子类型:

k15778864599的博客 3万+

Java面试题及答案整理(持续更新)

假设存在两个线程(线程1、线程2),线程 1 通过 Iterator 在遍历集合 A 中的元素,在某个时候线程 2 修改了集合 A 的结构(是结构上面的修改,而不是简单修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生 fail-fast 机制。关于业务逻辑面试的准备,建议在平时多多思考总结,对项目的数据来源、整体运行框架都应该熟悉掌握,比如,在某公司实习过程中,就可以进行总结,而不必等到快离职的时候再慌慌张张的去总结该项目。

m0_50180963的博客 1077

前端面试题(附答案)完善中……

前端面试笔记前言一、HTML篇1.语义话的目的是什么?⭐2.HTML5新特征⭐⭐⭐3.cookie与sessionStorage和localStorage的区别⭐⭐⭐二、CSS篇1.css有哪些基本的选择器,执行先后顺序?⭐2.垂直居中DIV⭐⭐⭐3.两栏布局左边固定右边自适应⭐⭐3.三栏布局左右固定中自适应⭐⭐4.常用的块与行属性内标签有哪些?有什么特征⭐⭐5.清除浮动⭐⭐⭐6.CSS3新特征⭐⭐⭐7.介绍一下盒模型⭐⭐8.CSS中有哪些长度单位?⭐⭐9.display:none和visibility:h

Jet_Lover的博客 16万+

110道 Elasticsearch面试题及答案(持续更新)

最新Elasticsearch面试题【附答案解析】ES面试题及答案,ES最新面试题及答案,ES面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免会存在一些错误,仅供大家参考。如果发现错误还望大家多多包涵,不吝赐教,谢谢~ 如果不背 ES面试题的答案,肯定面试会挂! 这套ES面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个面试手册,是PDF版的 1、详细描述一下Elasticsearch搜索的过程? 面试官:想了解ES搜索的底层原理,不

架构师专栏 3918

Java Web面试题及答案整理(2021年最新版,持续更新)

大家好!听说有很多java学习者在找有关java的面试题集,听到这个消息我来了! 下面是我为大家整理的2021最新的Java面试题及答案下载,这套Java面试题汇总了Java基础面试到高级Java面试题,几乎涵盖了作为一个Java程序员在面试中需要掌握或者可能被问到的绝大部分知识点。 适宜阅读人群 需要面试的初/中/高级 java 程序员 想要查漏补缺的人 想要不断完善和扩充自己 Java 技术栈的人 Java 面试官 更多2021最新Java面试题全部答案及Ja

java8797的博客 3903
上一篇: ADB常用命令及作用
下一篇: 判断当前网络是否可用
yang0range
博客等级 码龄12年 15粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值