1.ArrayList,Vector,LinkedList的区别
| ArrayList | Vector | LinkedList |
实现原理 | 数组 | 数组 | 双向链表 |
线程安全 | 否 | 是 | 否 |
优点 | 1.数组实现优于遍历 | 1.数组实现优于遍历 | 1.节点的增删无需对象的重建 |
缺点 | 1.非线程安全 | 1.数组中未使用的元素造成空间的浪费 | 1.遍历效率较低 |
扩容 | 0.5倍增量 | 1倍增量 | 按需增删 |
使用场景 | 1.无线程的要求。 | 1.有线程安全的要求 | 增删场景较多的时候 |
|
|
|
|
2.RuntimeException与普通异常,error的区别。
Checked Exception:在编译时就能够被Java编译器所检测到的。
UncheckedException:则是编译时,java编译器不能检查到。
| RuntimeException | 普通Exception | Error |
受控异常 | 否 | 是 | 否 |
产生原因 | 开发者的编程错误 | 由于外界环境所限, | Java运行时的系统错误,资源耗尽,是一种严重的, |
例子 | NullPointerException | ClassNotFoundException | VirtualMachineError |
3.int与Integer的区别
| int | Integer |
类型 | 基本类型 | 复合类型 |
默认值 | 0 | null |
存储 | 栈(局部变量) | 堆上(只能通过new创建) |
方法 | 基本类型无方法 | 有 |
速度 | 快(栈上 的操作相对快) | 慢 |
泛型支持 | 否(java中的泛型不支持,C++中的模板支持) | 支持 |
容器类支持 | 否(直接使用通常会进行装箱操作) | 支持 |
存在意义 | 1.历史原因(顺延C/C++中存在) | 基本类型int的包装类 |
4.final,finalize,finally的区别
final:关键字,表不变修饰:
- 方法:方法不可Override
- 类:不可被继承
- 基本类型量:常量,值不可变
- 符合类型量:引用不可变,即引用的值不可变
finally:关键字,Java异常处理机制的一部分,在异常发生时,用来提供一个必要的清理的机会。
finalize:Object类的方法(参考自百度百科)
意义:Java技术允许使用finalize()方法在垃圾回收器将对象回收之前,做一些必要的清理操作。
调用前提:这个对象确定没有被引用到。
工作原理:
- 垃圾收集器准备好释放对象占用的空间。
- 首先调用其finalize方法。
- 下一次垃圾收集过程中,真正回收内存。
不确定性:
- finalize的执行时间是不缺定的。
- 一个对象引用另一个对象,并不能保证finalize的方法按照特定的执行顺序。
5.Override,Overload
| Override | Overload |
签名+返回值 | 相同 | 方法名相同,签名不同 |
关系 | 父子类继承关系 | 通常是同一类层次中 |
识别 | 运行时多态 | 编译时多态 |
修饰符限制 | 非private | 无特别 |
异常关系 | 子类方法不能抛出被父类方法更多的异常 | 无特别 |
可见性关系 | 子类不能比父类访问权限更窄 | 无特别 |
6.Collection Collections
Collection:接口,集合类的接口,一个契约,提供了集合基本的大小,添加,清除,遍历方法等。
Collections:工具类,提供了很多静态方法,给集合提供一些查询,比较,排序,交换,线程安全化等方法。
7.Integer 缓存
package com.jue.test;
public class TestMain {
public static void main(String[] args) {
Integer i1 = 1;
Integer i11 = 1;
System.out.println(i1 == i11);
Integer i2 = 200;
Integer i22 = 200;
System.out.println(i2 == i22);
}
}
结果 :True,false
分析:反编译结果为 Integer i1 = Integer.valueOf(1);
可以看出,对于Integer i = 1;编译器做了额外的处理,即Integer.valueof();可以看出Integer对于一定 范围内的数字从Cache中取得,对于额外的,调用new创建。
故可以知道Integer的大小,默认是从-128到127,对于这个范围内的数组做了缓存的处理。 对于额外的,调用new创建
8.sleep方法和wait方法的区别
| wait | sleep |
所属类 | Object | Thread |
意义 | 让线程挂起 | 让线程休眠指定的时间 |
释放锁 | 是 | 否(这个跟锁本来就没有关系) |
恢复 | 1.有参:wait指定时间 | 1.根据参数长度自动恢复。 |
使用限制 | wait,notify必须持有当前对象锁的情况下调用 | 无特别 |
抛出异常 | 否 | 是 |
静态方法 | 否 | 是 |
9.HashMap和Hashtable的区别。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
10、设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
五:算法:
将之前介绍的所有排序算法整理成NumberSort类,代码
NumberSort
六:深入探索Java工作原理:JVM内存回收及其他
Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种Web应用。同时,为了提高Java语言的性能和健壮性,还引入了如垃圾回收机制等新功能,通过这些改进让Java具有其独特的工作原理。
1.Java虚拟机
Java源程序通过编译器编译成.Class文件,然后java虚拟机中的java 解释器负责将字节码文件解释成为特定的机器码进行运行。
java是一种半编译半解释型语言。半编译是指:java源代码,会经过javac命令变成 .class文件。半解释是指: .class文件被jvm解释的过程。也就是因为jvm的半解释才有了java的动态语言特性:反射和annotation。
和android区别
alvik有自己的libdex库负责对.class进行处理。libdex主要对.class进行处理生成自己的dex文件。主要做的工作是,对虚拟机指令进行转换(dalvik是基于寄存器的,sun虚拟机是基于栈的),对类的静态数据进行归类、压缩。
dalvik基于寄存器,而JVM基于stack ,Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。
优势:1、在编译时提前优化代码而不是等到运行时
2、 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例。
Java虚拟机的建立需要针对不同的软硬件平台来实现,既要考虑处理器的型号,也要考虑操作系统的种类。由此在SPARC结构、X86结构、MIPS和PPC等嵌入式处理芯片上,在UNIX、Linux、Windows和部分实时操作系统上都可实现Java虚拟机。
2.无用内存自动回收机制
而在Java运行环境中,始终存在着一个系统级的线程,专门跟踪内存的使用情况, 定期检测出不再使用的内存,并自动进行回收,避免了内存的泄露,也减轻了程序员的工作量。
1.JVM
JVM是Java平台的核心,为了让编译产生的字节码能更好地解释与执行,因此把JVM分成了6个部分:JVM解释器、指令系统、寄存器、栈、存储区和碎片回收区。
基于android的Socket通信 Android框架
可以很明显看出,Android系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。
2、架构详解
现在我们拿起手术刀来剖析各个部分。其实这部分SDK文档已经帮我们做得很好了,我们要做的就是拿来主义,然后再加上自己理解。下面自底向上分析各层。
2.1、Linux Kernel
Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。
2.2、Android Runtime
Android 包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己 的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。
大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。 两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。
Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。
2.3、Libraries
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库:
- 系统C库——标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备
- 媒体库——基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG
- 界面管理——管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层
- LibWebCore——新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图
- SGL——基本的2D图形引擎
- 3D库——基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅
- FreeType ——位图和矢量字体渲染
- SQLite ——所有应用程序都可以使用的强大而轻量级的关系数据库引擎
2.4、Application Framework
通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。
开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。
所有的应用程序其实是一组服务和系统,包括:
- 视图(View)——丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器
- 内容提供者(Content Providers)——使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据
- 资源管理器(Resource Manager)——提供访问非代码资源,如本地化字符串、图形和布局文件
- 通知管理器(Notification Manager)——使所有的应用程序能够在状态栏显示自定义警告
- 活动管理器(Activity Manager)——管理应用程序生命周期,提供通用的导航回退功能
2.5、Applications
Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!
一、Socket通信简介
Android 与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立 连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可 实现信息的主动推送,而不需要每次由客户端想服务器发送请求。 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输 传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。
1.2Socket的分类
根据不同的的底层协议,Socket的实现是多样化的。本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字 (streamsocket)和数据报套接字(datagramsocket)。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。数据 报套接字使用UDP协议,提供数据打包发送服务。
二、Socket 基本通信模型
三、Socket基本实现原理
3.1基于TCP协议的Socket
服务器端首先声明一个ServerSocket对象并且指定端口号,然后调 用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。 (Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号 (Socketsocket=newSocket("172.168.10.108",8080);),通过inputstream读取数据,获取服务器 发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到 outputstream即可进行TCP协议的socket数据传输
后期自己添加的
1. 在Android中哪种进程最重要 A 服务进程 B 后台进程 C 可见进程 D 前台进程 答案是 D
重要性依次是:前台进程,可见进程,服务进程,后台进程和空进程;所以销毁的顺序是逆方向。
2. Android中通过什么来满足线程之间的通信
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
·2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
·3) Message Queue(消息队列):用来存放线程放入的消息。
·4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
对上面的如果有疑问,欢迎指出