经典链接:
5.java设计模式
6.找工作攻略
9.各大排序算法总结
10.android校招总结
11.java基础:http://blog.csdn.net/u013142781/article/category/6121646
1.自我介绍
2.挑一个最拿手的项目进行简单介绍。
BInder机制的简要理解;http://www.linuxidc.com/Linux/2012-07/66195.htm
内部类与静态内部类的区别;
hashmap如何定位;先hash(key)%len定位数组中位置,再通过Entry.next遍历链表,新来的元素总是链在最前面,table的大小为>=initialCapacity的2的n次幂。
多线程同步方法;http://blog.csdn.net/yanzhenjie1003/article/details/50992468-------synchronized,ReenTrantLock实现同步加锁机制的区别:synchronized无法中断一个正在等候获得锁的线程,也无法通过投票得到锁,如果不想等下去,也就没法得到锁。所以JSR 166小组花时间为我们开发了java.util.concurrent.lock框架,当Lock锁定的方法或者代码块发生异常的时候,它不会自动释放锁;它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)
弱引用的场景;只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
android内存泄漏之静态内部类的使用:
非静态的内部类或匿名类会隐式的持有一个他们外部类的引用,静态内部类则不会。非静态内部类,handler对象不释放的话,它的activity也不会释放,因为匿名类的非静态实例持有一个隐式的外部类引用,因此activity将被泄漏。为了解决内存泄漏问题,handler的子类应该定义在一个新文件中或使用静态内部类。静态内部类不会隐式持有外部类的引用,所以不会导致它的activity泄漏。如果你需要在handler内部调用外部activity的方法,那么让handler持有一个activity的弱引用是正确的解决方案。
到底什么时候使用软引用,什么时候使用弱引用呢?
个人认为,如果只是想避免OutOfMemory异常的发生,则可以使用软引用。如果对于应用的性能更在意,想尽快回收一些占用内存比较大的对象,则可以使用弱引用。还有就是可以根据对象是否经常使用来判断。如果该对象可能会经常使用的,就尽量用软引用。如果该对象不被使用的可能性更大些,就可以用弱引用。
http://blog.csdn.net/chenxiaofeng_/article/details/51492764
Java:
1.堆内存与栈内存:main()函数中的局部变量存储在栈内存中,用new和malloc分配的是堆内存,全局变量存储在堆内存。
2.HashMap与Hashtable的区别:大体相同,但HashMap允许空值,而且HashMap是非同步的,而HashTable是同步的。
3.protected:一个继承的类可访问受保护的成员,但不能访问私有成员。
4.switch能否用string做参数?在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。在 Java 7中,String支持被加上了。
5.Object类有哪些公共方法?clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
6.String, StringBuffer, StringBuilder的区别?String是字符串常量,StringBuffer线程安全,StringBuilder是线程不安全
7.try catch finally,try里有return,finally还执行么?任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的, 编译器把finally中的return实现为一个warning。
8.接口的意义:为什么要用接口 :用于处理多变的情况。接口在实际开发过程中最大好处是,你可以按照设计,先把接口写好,然后分配大伙干活的时候,告诉a们去用写好的接口去实现他们的具体功能,而告诉b们,去写那些已经写好但是没有具体的代码的接口,这样可以提高工作效率。并且底层和应用也通过接口做了一个很明显的分层。
10.抽象类存在的意义:有利于代码的维护和重用,java面向对象的体现,当你对其中某个类进行修改时会受到父类的限制,这样就会提醒开发人员有些东西不能进行随意修改,这样可以对比较重要的东西进行统一的限制,也算是一种保护,对维护会有很大的帮助。
11.内部类作用:
(1).内部类可以很好的实现隐藏,一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
(2).内部类拥有外围类的所有元素的访问权限
(3).可是实现多重继承
(4).可以避免修改接口而实现同一个类中两种同名方法的调用。
12.子类能否重写父类的静态方法?当然不能,所谓静态,就是在运行时,虚拟机已经认定此方法属于哪个类。
13。JAVA虚拟机的特性?虚拟机中的执行引擎用来执行class文件中的字节码指令,虚拟机在执行过程中, 要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。
14.java的垃圾回收机制?Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活 时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。 比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。
15.进程和线程区别?个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。 线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
16.Java中==和equals的区别,equals和hashCode的区别==是运算符,用于比较两个变量是否相等。
equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。
将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,
然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
17.ArrayList和HashMap的实现原理?ArrayLIst是可以动态扩容的数组,超出限制后增加一半容量,默认大小为10.HashMap以数组和链表实现,也是动态扩容,先定位数据元素,再遍历链表
18.ArrayList与LinkedList区别?ArrayList相当于数组,方便查询,不方便插入删除,LinkedList相当于链表,方便插入删除,不方便查询。
19.C++中堆和栈的区别?
程序的内存分配:栈区由编译器自动分配,存放函数的参数值局部变量,堆区由程序员分配,若程序员不释放,程序结束时可能有os回收,栈是连续空间,空间小快,堆的空间不连续,空间大灵活慢。
申请后系统的响应 : 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表 中删除,并将该结点的空间分配给程序.
20.接口和抽象类的区别?
1).抽象类可以有构造方法,接口中不能有构造方法。
2).抽象类中可以有普通成员变量,而接口中不可以有。
3)抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4)抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5)抽象类中可以包含静态方法(static),接口中不能包含静态方法.
6)抽象类和接口中都可以包含静态成员变量(static),抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7)一个类可以实现多个接口,但只能继承一个抽象类。
①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
22.单例模式的写法。
网络:
TCP三次握手与四次握手
1.HTTP简介:HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
2.HTTP协议的特点:
(1)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
(2)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(3)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间.
(4)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
(5)支持客户/服务器模式。支持基本认证和安全认证
3.HTTP工作原理:HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。 HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。 服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
4.GET与POST请求的区别:GET 请求指定的页面信息,并返回实体主体 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
(1)GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
(2)GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
(3)GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
(4)GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
5.HTTP状态码:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
6.常用状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
7.URI与URL的区别:URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源,还存放了资源的具体地址。
通过Cookies或Session保存状态信息--Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,
如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),
如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,
又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
9.Cookie和Session的区别:
1)Cookie将状态保存在客户端,Session将状态保存在服务器端;
2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;
3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;
4)就安全性来说:当你访问一个使用session 的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。
10.HTTP应用
(1):断点续传的原理:HTTP协议的GET方法,支持只请求某个资源的某一部分;
206 Partial Content 部分内容响应;
Range 请求的资源范围;
Content-Range 响应的资源范围;
在连接断开重连时,客户端只请求该资源未下载的部分,而不是重新请求整个资源,来实现断点续传。
分块请求资源实例:
Eg1:Range: bytes=306302- :请求这个资源从306302个字节到末尾的部分;
Eg2:Content-Range: bytes 306302-604047/604048:响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节;
客户端通过并发的请求相同资源的不同片段,来实现对某个资源的并发分块下载。从而达到快速下载的目的。目前流行的FlashGet和迅雷基本都是这个原理。
(2):多线程下载的原理
下载工具开启多个发出HTTP请求的线程;每个http请求只请求资源文件的一部分:Content-Range: bytes 20000-40000/47000;合并每个线程下载的文件
(3)http代理
http代理服务器
代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。
代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,
Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,
如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,
这样就能显著提高浏览速度和效率。更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。
http代理服务器的主要功能:
1)突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站;
2)访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务;
3)突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国外的代理服务器试试;
4)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度;
5)隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。
对于客户端浏览器而言,http代理服务器相当于服务器。
而对于Web服务器而言,http代理服务器又担当了客户端的角色。
11.HTTPS的优点:客户端产生的密钥只有客户端和服务器端能得到; 加密的数据只有客户端和服务器端才能得到明文;客户端到服务端的通信是安全的。
12.TCP与UDP的区别:TCP是可靠数据传输协议,UDP是一个面向无连接的协议。采用该协议不需要两个应用程序先建立连接。UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性差。是否先建立连接是重点
1)、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2)、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3)、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4)、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5)、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6)、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
android:
2.handler机制? handler是更新UI的机制,也是消息处理的机制,每一个线程里都含有一个Looper对象和一个MessageQueue数据结构,在应用程序中可以定义Handler的子类来接收Looper所送出的消息, Looper是Handler和MessageQueue之间的桥梁,循环取出MessageQueue里的message,交给相应的handler进行处理,handler是message的主要处理者,负责将message添加到消息队列以及对消息队列中消息进行处理, 也可解决多线程并发问题。handler负责发送消息,looper负责接收handler发送的消息并直接把消息会传给handler自己,MessageQueue就是一个存储消息的容器。
3.Binder机制?Binder是Android系统中的一种IPC进程间通信结构。 Binder的整个设计是C/S结构,客户端进程通过获取服务端进程的代理,并通过向这个代理接口方法中读写数据来完成进程间的数据通信。 Android之所以选择Binder,我觉得有2个方面的原因。 1是安全,每个进程都会被Android系统分配UID和PID,不像传统的在数据里加入UID,这就让那些恶意进程无法直接和其他进程通信,进程间通信的安全性得到提升。 2是高效,像Socket之类的IPC每次数据拷贝都需要2次,而Binder只要1次,在手机这种资源紧张的情况下很重要。
4.避免OOM方法总结?
介绍)强引用:如果一个对象具有强引用,垃圾回收器绝对不会回收它。
软引用:如果一个对象只具有软引用,内存足够时,垃圾回收器就不会回收它;知道虚拟机报告内存不够时,垃圾回收器才会对它进行回收。
弱引用:一旦发现了只具有弱引用的对象,无论内存空间是否足够,垃圾回收器都会回收。
虚引用:主要用来跟踪对象被垃圾回收器回收的活动,虚引用必须和引用队列联合使用,当垃圾回收器准备回收一个对象时,发现它还有虚引用,就会在回收对象内存之前将虚引用加入到与之关联的引用队列中。
解决方法)释放强引用:使用完对象后将对象置空,只有当这个内存空间不被任何对象引用的时候,垃圾回收器才会去回收。1.Object obj = new Object();2.obj = null;
使用软引用:封装强引用,解决内存吃紧的问题。1.String str = "hello"; 2.SoftReferencesr = new SoftReference(str);
使用弱引用:随时取得某个对象信息,但不影响该对象的垃圾回收则使用弱引用。1.String str = "hello"; 2.WeakReferencews = new WeakReference(str);
图像处理)---在内存中压缩图片---使用完图片后回收图片所占内存---降低要显示的图片色彩质量---查询图片信息时不把图片加载到内存中。
测试
2.API测试
3.白盒黑盒灰盒测试
4.接口测试
5.sql注入原理