1、 简述一下线程和进程的区别
一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
2、 现有100个String对象,如何把它们高效的收尾相连在一起?
concat方法将指定字符串连接到此字符串的结尾。如果参数字符串的长度为0,则返回此String对象;否则,创建一个新的String对象;用来表示由此String对象表示的字符序列和参数字符串表示的字符序列连接而成的字符序列。
语法 public String concat(String str)
返回值:一个字符串,它表示在此对象字符后连接字符串参数字符而成的字符。
参数:str为连接到此String结尾的String。
示例 本示例使用concat方法连接字符串strCom和strCom2,并将结果赋值给String型变量str。
String strCom = "I LIKE "; //定义一个字符串
String strCom2 = "JAVA"; //定义一个字符串
String str = strCom.concat(strCom2);
System.out.println(str);
3、
A,E,F
4、View的onTouchEvent和OnInterceptTouchEvent的区别是什么?
onTouchEvent:触发触摸事件
onInterceptTouchEvent:触发拦截触摸事件
通过查看源代码及类继承关系
onInterceptTouchEvent:是定义于ViewGroup里面的一个方法,此事件是用于拦截触摸事件的,ViewGroup(继承自View),一个View的Group,也就是我们的一个布局如LinerLayout,各个布局类都继承自ViewGroup;
onTouchEvent:是定义于View中的一个方法,处理传递到View的手势触摸事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件;
其中ViewGroup里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,ViewGroup里的onTouchEvent默认返回值是false;
View里的onTouchEvent默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouchEvent里返回值是true的时候,onTouch会继续调用ACTION_UP事件,如果onTouchEvent里返回值是false,那么onTouchEvent只会调用ACTION_DOWN而不调用ACTION_UP。
5、在同一个类中定义了如下2个函数,有没有问题?
Int getValue(String key);
Float getValue(String key);
6、看看下面的代码有没有问题?
Public class Test{
Public static String sName=”a”;
Public static void changeName(){
This.sName=”b”;
}
}
(1) 非静态方法参数传递时,有一个隐式参数this,这个this就是调用该方法的对象本身。
比如, Object o=new Object();
o.toString(); //实际上是有参数传递的toString(Object this),且o==this
这样在非静态方法中就可以通过this来得到调用对象的其他域和方法,私有域的也行。
(2) 静态方法是属于类的,而并不属于某个对象。所以没有隐式参数this,自然也就不能通过this调用对象本身了。
? 7、简述如何实现后台程序的运行进度提示,如何在后台线程中更新前台的控件?
Android的Widget,有许多是为了与用户交互而特别设计的,但也有部分是作为程序提示、显示程序运行状态的Widget。在应用时,必须新建ProgressDialog对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台失去焦点,直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某后台程序正处于忙碌阶段,此时,ProgressBar就会派上用场了。
Android提供的ProgressBar Widget控件与ProgressDialog应用目标不同,在程序一开始即可在main.xml Layout当中布局,先将部署在Layout里的ProgressBar的属性设为隐藏(一开始看不见),而后使用进程来“假装”程序忙碌中,但不同的是,可在进程当中取得运行时的进度,在“运行”的过程中,将运行进度通过TextView显示出来。因为新起的进程无法访问Activity里的Widget,也无法将运行状态外送出来,所以需要通Handler及Message对象,将进程里的状态往外传递,最后由Activity的Handler事件接收取得运行的状态
主程序设计:
为了让Thread运行过程中,可以不断地将信息往Activity传递,所以用了Android.os.Handler对象及Android.os.Message对象,且在类成员变量中声明了两个整数:GUI_STOP_NOTIFIER与GUI_THREADING_NOTIFIER,这两个整数将作为信息传递出来时的信号
标识,前者为当Thread需要喊停的时候处理,后者为进程正在运行过程中所需处理的标识。
程序中设计了一个按钮,此按钮的工作是让原本部署在main.xml里的ProgressBar显示出来(原来是设置为Android:visibility="gone"),而因为默认在main.xml中没有指定它的indeterm- inate属性,所以即便在程序中强制调用了ProgressBar的setIndeterminate()方法,也无法改变ProgressBar.getProgress()的值,这个值将永远为0。使用循环图片动画作为运行过程中的动画,并用了一个Counter(整数)来递增,表示运行的百分比。
8、写一个Singleton(单例模式)
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if(instance == null) {
synchronzied(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
9、一组从小到大的数据存储在ArrayList中,写个函数通过折半查找迅速的找到对应索引的值。
比如按从小到大排列的数列:
-3,-2,0,4,5,7,12,64
我们要找到数字7的位置,如果是线性查找,时间复杂度是O(n),如果用折半查找的话,时间复杂度是O(log(n)),因为每次折半,计算量少一半,所以取对数。
package Algorithm_analysis;
public class Bisearch {
static int[] array={-3,-2,0,4,5,7,12,64};
public static void main(String args[]){
int left=0;
int right=array.length;
int center=0;
int k=7;
while(left<=right){
center=(right+left)/2;
if ((array[center]-k)==0){
System.out.print(center);
break;
}
else{
if((array[center]-k)>0){
right=center;
}
else{
left=center;
}
}
}
}
}
//输出结果7
10、两个升序整型数组A和B,元素个数分别为m和n,将数组B合并到数组A中,数组A保持升序,请用java实现该算法
int[]arr1={3,1,23};
int[]arr2={27,7,2};
int[]s=new int[6];
s=Arrays.copyOf(arr2, 6);
for (int i = 3,j=0; i <6; i++,j++)
{
s[i]=arr1[j];
}
System.out.println("合并前:");
System.out.println("数组arr1内容是:"+Arrays.toString(arr1));
System.out.println("数组arr2内容是:"+Arrays.toString(arr2));
Arrays.sort(s);
System.out.println("合并后:");
System.out.println("数组成员按升序排列后:"+Arrays.toString(s));
11、给定一个输入的字符串和一个包含各种单词的字典,用空格将字符串分割成一些列字典中存在的单词。举个例子,如何输入字符串是“applepie”而字典中包含了所有的英文单词,那么我们应该得到的返回值“apple pie”.
String SegmentString(String input, Set<String> dict) {
int len = input.length();
for (int i = 1; i < len; i++) {
String prefix = input.substring(0, i);
if (dict.contains(prefix)) {
String suffix = input.substring(i, len);
if (dict.contains(suffix)) {
return prefix + " " + suffix;
}
}
}
return null;
}
12、实现一段代码统计给定目录中的文件数,注意目录中可能包括子目录。
String path = "E:\\zuoye";
int fileCount = 0;
int folderCount = 0;
File fil = new File(path);
File []list = fil.listFiles();
for(int i = 0; i < list.length; i++){
if(list[i].isFile()){
fileCount++;
}else{
folderCount++;
}
}
System.out.println("文件个数:"+fileCount);
System.out.println("文件夹数:"+folderCount);