资源描述
^.
复习
Java部分
Java的基本语法,简单的算法编程实现
面向过程的程序设计:一元二次方程的求解、排序算法的实现、手工实现链表、打印*号图案等。
99乘法表:
public class s99{
public static void main(String[] args){
for (int i=1;i<=9;i++) {
for (int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+(i*j)+"\t");
}
System.out.print("\n");
}
}
}
打印*号:
- staticvoid printchars(intnum, String s) {
for (inti = 1; i<=num; i++)
System.out.print(s);}
publicstaticvoid main(String[] args) {
System.out.println("请输入一个奇数:");
Scanner sc = new Scanner(System.in);
intn = sc.nextInt();
intline;
//上半部分
for (line=1; line<=n/2+1;line++) {intspace = n/2+1 - line;
intstar = 2*line - 1;//输出
printchars(space," ");
printchars(star,"*");//输出回车换行
System.out.println("");}
//下半部分
for (line = n/2+2;line<=n;line++) {
intspace = line - (n/2+1);
intstar = 2*(n-line+1)-1;
//输出
printchars(space," ");
printchars(star,"*");
//输出回车换行
System.out.println("");}
sc.close();}}
二元一次:
import java.util.Scanner;
public class equation {
public static void main(String[] args){
System.out.println("输入一元二次系数a,b,c:");
Scanner in=new Scanner(System.in);
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
double x1,x2;
int deta=b*b-4*a*c;
if(deta==0){
x1=x2=(-b)/(2*a);
System.out.println("x1="+x1);
System.out.println("x2="+x2);
}else{
double t=Math.sqrt(Math.abs(deta))/(2*a);
if(deta>0){
x1=(-b)/(2*a)+t;
x2=(-b)/(2*a)-t;
System.out.println("x1="+x1);
System.out.println("x2="+x2);
}else{
x1=(-b)/(2*a);
x2=(-b)/(2*a);
System.out.println("x1="+x1+"+"+t+"*i");
System.out.println("x2="+x2+"-"+t+"*i");}}}}
排序:
package com.sort;
public class 直接插入排序 {
public static void main(String[] args) {
int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1};
System.out.println("排序之前:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");}
//直接插入排序
for (int i = 1; i < a.length; i++) {
//待插入元素
int temp = a[i];
int j;
for (j = i-1; j>=0; j--) {
//将大于temp的往后移动一位
if(a[j]>temp){
a[j+1] = a[j];
}else{
break;}}
a[j+1] = temp;
}
System.out.println();
System.out.println("排序之后:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");}}}
A. Java的语言机制(单继承、引用、对象创建、集合类、包装类、内部类、接口与向上转型、static代码块、异常处理等)
a) 单继承,IS-A关系,继承一个类与实现一个接口在语义上的区别
接口传达的意思是:拥有某种功能,能干嘛,比如:Serializable代表可序列化的。继承传达的是意思是:is-a,比如:猫 是一个 动物,猫就是动物的子类。
b) 引用:
相当于C++的指针,用于存放地址 Java中: Apple a; //对象还没有创建 a = new Apple(); //对象创建
C++中:Apple a; //已创建对象 Apple * a = new Apple();
Java取消了指向基本数据类型的指针,如何传递基本数据类型的变量的地址?包装类(Wrapper Class)
c) 对象创建
对象创建过程受控(禁止用户随意通过new创建对象):定义private类型的构造方法,公开一个static的方法,例如getInstance(),返回该类的对象
封装对象创建的代码,特别是针对复杂的对象,每个类知道如何创建自己的对象 例子:GameDemo注意:Singleton的实现(单例,即一个类只能有一个对象)
集合类:例如ArrayList,LinkedList,HashSet,了解基本的功能
集合类是将多个元素组成一个单元的对象实现Collection接口,用于储存、检索和操纵数据,以及将数据从一个方法传输至另一个方法
ArrayList:实现动态增长的数组
LinkedList:是通过节点直接彼此连接来实现的。每一个节点都包含前一个节点的引用,后一个节点的引用和节点存储的值。
HashSet:是实现Set接口的一个类,具有以下的特点:
不能保证元素的排列顺序,顺序有可能发生变化。
另外HashSet不是同步的,如果多个线程同时访问一个Set,只要有一个线程修改Set中的值,就必须进行同步处理,通常通过同步封装这个Set的对象来完成同步,如果不存在这样的对象,可以使用Collections.synchronizedSet()方法完成。
Set s = Collections.synchronizedSet(new HashSet(...));
元素值可以是null。
d) 内部类:语法,在类、接口、方法、{…}里面定义内部类,可以无限制的访问外围类的成员
内部类(Inner Class)
内部类的定义:定义在类、方法体、接口里面的类型
内部类的作用:可以隐藏类型
内部类可以不受限制的访问其外围类的成员,包括外围类的private成员
内部类的经典例子:迭代器(Iterator)
e) 接口与向上转型,通过私有内部类实现外围公开的接口,返回对象时向上转型为公开接口,可以实现类型隐藏
接口(Interface)
是一个完全抽象的存在,仅能有方法的样子,不能有实现
如果有数据成员,必须是final
一个类可以实现多个接口,使用implements关键字
实现一个接口,必须实现其中的所有方法,或定义为abstract
简单例子:SuperMan,实现了CanFly, CanJump, CanSwim三个接口
接口的语义:实现某个接口,使类具备某种能力,如“可拍照”、“CanFly”
接口与继承都支持向上转型,一个对象可以用它实现的其中一个接口类型的引用去指向,但仅限于使用引用的接口所限制的方法
接口不仅是为了解决Java的多继承问题,还可以用于适配,类似于插座之间的转换器
例子:适配器模式(Adapter)
RandomNumAdapter1:继承方式
RandomNumAdapter2:组合方式
组合方式的适配器实现更加灵活,更接近现实,可以适配RandomNums及其所有的子类
f) static代码块:静态代码块,类被初始化时调用一次
static对象可以在它的任何对象创建之前访问,无需引用任何对象
g) 异常处理:两种异常(Checked/Runtime Exception),异常的语法,异常的继承层次,异常的匹配(按catch块的顺序)
Java异常处理
优点:正常代码和异常代码分离,通过异常的继承层次,可以实现同类异常的统一处理
两种模型:终止模型(处理完异常不回去)、恢复模型,Java属于前者
两大类异常:CheckedException(编译器检查),RuntimeException
Try {会抛出异常的代码}
catch(异常1) {….}
catch{异常2}
Finally {清理、关门代码}
B. 面向对象程序设计的相关概念
a) 封装:类、访问控制关键字、包
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。封装是一种信息隐藏技术,在java中通过关键字private实现封装。封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
b) 继承:构造方法的运行次序、子类方法覆盖父类方法
c) 多态、动态绑定
Animal a = new Cat();
a.sleep();
a.age //Animal的age
动态绑定仅发生在类的普通成员方法上
多态的定义:指允许不同类的对象对同一消息做出响应。
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
d) 类、接口
e) 泛型
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
f) 反射(Reflection)
运行时探测未知对象的内部信息,通过“波的反射”获得其内部的细节,并且可以调用对象内部的所有方法
Zoo2、Zoo3
g) RTTI:运行时类型信息
h) 回调:Callback
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
C. 本学期学过的设计模式(Java与Android部分)
a) 代理/动态代理
n Proxy(代理)
是一个中介,通过转发服务请求到真正的服务对象,如Web代理服务器:接收用户请求,转发请求,获取数据,把数据回传给用户;房地产中介
u 代理可以过滤一些不必要的请求,或是隐藏服务对象的真正身份
u 代理与被代理对象至少要有相同的接口
b) 适配器
将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
c) 依赖注入(DI)
依赖注入是Spring的思想,在使用Spring进行开发时,可以将对象交给spring进行管理,在初始化时spring创建一批对象,当你需要用的时候只要从spring的容器中获取对象,而不用自己去new,当然在对象创建的时候可以注入另一个对象。比如A,B两个对象都由spring管理,A中持有对B的引用,那么spring在生成A对象的时候就已经吧B对象的一个实例给到A了,当你在A中用到B的时候直接使用就可以了。
d) 对象工厂
主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。如果你有很多地方都需要A的实例,那编写一个工厂专门生成A的实例(如果生成逻辑改变了,直接修改工厂)。那么这些需要A的实例的地方只需要从工厂中getObject()就可以了,完全不用管我的实例是咋来的
e) 迭代器
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
f) 单例
确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例;
2,自己创建这个实例;
3,整个系统都要使用这个实例。
优点:
单例模式,能避免实例重复创建;
单例模式,应用于避免存在多个实例引起程序逻辑错误的场合;
单例模式,较节约内存。
1. Android部分
A. Android的基本程序结构: 资源 本体代码 注册文件
Activity:(1)应用程序的入口(2)界面显示,接收事件,控制显示跳转。
BroadcastReceiver:(1)用于注册和接收系统广播的事件(2)可接收自定义的广播事件。
ContentProvider:(1)提供数据库查询接口(2)可对外公开数据查询服务。
Service:(1)是一个独立的进程,可一直在后台运行。(2)可以与其他组件通过远程连接绑定进行交互。(3)可对外提供服务交互接口。(4)生命周期不依赖于其他组件的存在与否。
B. 界面编程模型
a) 界面元素(控件和布局)
界面设计原则:大框架用XML配置,部分使用动态界面生成代码
动态创建控件
绑定事件响应的代码(set Listener方法,类似Java)
方法
创建一个新的Activity:MagicSquareActivity
通过LinearLayout(vertical)内置一个GridLayout
动态创建Button数组
给每一个Button赋值、上颜色,通过GridLayout.LayoutParams设置放入的具体参数(位置、Gravity、大小)
b) 事件:添加监听器,继承
c) 资源
1.字符串资源2.Layout资源3.图像资源
d) XML与Java Code在定义界面元素中的不同作用
XML是静态的 Java Code是动态的
e) 9Patch图片格式
增加了可以伸缩的局部区域的定义
使用sdk\tools\draw9patch.bat工具
Show patches:指定可复制的区域
Show content:控制可显示的区域
f) ListView与Adapter
静态的ListView,只能显示简单的、静态的数据
复杂的数据通过Adapter为ListView提供数据,通过Adapter可以对ListView的显示数据格式进行定制,有4个具体的子类
ArrayAdapter:最简单,包装数组或List类型的简单数据
数据与Item的样式(Layout XML文件)放入ArrayAdapter
与ListView绑定
SimpleAdapter:很复杂,可以包装复杂数据,可以通过XML模板定制Item的具体格式
可以显示复杂数据
数据的关系:使用Map,每个字段自定一个唯一的名字,SimpleAdapter会根据该名字查找对应的值
显示的样式:字段名字与显示的控件ID绑定,在初始化SimpleAdapter的时候给出
增加itemClick的事件响应
SimpleCursorAdapter
BaseAdapter:具有最高的可扩展性
C. Handler与多线程
为什么需要多线程?同步、并行、UI的响应效率
Android的多线程
UI组件并非线程安全,只允许UI的线程去改变其状态
定时更新主界面上的控件状态
使用计时器:创建一个新的线程,每隔一定时间执行一次其中的run方法
在主线程中创建一个Handler,子线程调用Handler发送信息,主线程的Handler通过handlerMessage方法处理接收到的消息
主线程默认有一个Looper,其它线程需要手工创建
Looper从消息队列中取出消息,发送给注册了的Handler处理
异步任务
比Handler轻量化
D. Service:与Activity的数据交换
a) BroadCast方式
BroadCastReceiver
Android的四大组件
作用:接收其它应用程序发出的BroadCastIntent
相当于一个系统级监听器
发送广播的例子,接收者通过action来确定要接收的BroadCastIntent
有序广播
Receiver有优先级,系统先回调优先级高的receiver的onReceive方法
接收者可以往其中加入额外的数据,传给下一个接收者处理,也可以取消广播
基于Service的播放器
分前台和后台
Activity负责显示音乐播放的状态,有play和stop按钮
Service负责播放音乐,并通知前台显示
两者之间有数据交互
思路1:两者通过BroadCast通信
b) Binder方式
通过iBinder对象,作者称它是Service组件的内部钩子(hook)
关于钩子:源于Windows系统编程,是一种事件(比如:消息、Mouse事件、键盘)到达应用程序前中途截获事件的机制,钩子可以修改、丢弃事件,是Windows的一个后门。
说明
MyBinder继承Binder,Binder实现IBinder
公开MyBinder给调用者
通过onServiceConnected获取MyBinder对象的引用
此处用Hook似乎并不恰当,是Service对象在调用者端的表示,应该表述为Proxy(代理)
在更一般的情况下,客户端通过Proxy发送请求,Service端通过一个特定的对象去接收,该对象称为Stub(存根类),Proxy相当于遥控器,而Stub相当于电视机里遥控信号接收模块。这正是Java的RMI(Remote Method Invoke,远程方法调用)的主要原理。
MyBinder此处同时扮演了Stub与Proxy的角色
E. BroadCastReceiver
a) 全局的BroadCast
b) 优先次序的BroadCast
- BroadCastReceiver
n Android的四大组件
n 作用:接收其它应用程序发出的BroadCastIntent
n 相当于一个系统级监听器
n 发送广播的例子,接收者通过action来确定要接收的BroadCastIntent
n 有序广播
u Receiver有优先级,系统先回调优先级高的receiver的onReceive方法
u 接收者可以往其中加入额外的数据,传给下一个接收者处理,也可以取消广播
n 基于Service的播放器
u 分前台和后台
u Activity负责显示音乐播放的状态,有play和stop按钮
u Service负责播放音乐,并通知前台显示
u 两者之间有数据交互
u 思路1:两者通过BroadCast通信
F. 数据库编程
a) 直接操作SQLite
u SQLite:Android自带驱动的小型高效文件数据库,适用于移动设备的本地数据存储
u 用SQLiteDatabase直接操作数据库,execSQL支持setParameter,所有动作都由原始的SQL语句执行
u 可以用SQLiteStudio 3.0.7打开
b) 通过ORM层操作数据库
u ORM
u 对象关系映射:Object Relational Mapping
u 理念:持久化保存对象,面向对象程序设计的核心是一切皆对象,软件系统表现为对象之间的相互作用
u 在业务逻辑和用户界面层中,程序是面向对象的,当对象状态发生变化时,当需要保存这种状态变化时,需要进行逐字段的保存,例如拼接SQL语句,或是给出字段名的update
u ORM是一个自动化的机构,接收了对象的持久化请求,底层生成SQL,交给关系数据库执行,高层代码只需要与对象打交道
u 著名的ORM实现
u Java、Web、Servlet:Hibernate
u Dot Net平台:NHibernate
u Android:轻量级的ORM,OrmLite
u 通过Annotations的方式建立对象与Table的关联
u 例子:StuDB,通过OrmLite持久化Student对象
u Student的实体类:只有数据成员,要求按实体Bean的语法(数据成员private小写,提供setter/getter)
u OrmHelper:负责封装Orm的API,提供尽能简单的操作(add, list, edit, del)
u OrmHelper中注册Dao对象,用到哪个就查哪个,如果没注册,就马上注册
u StudentDao:Dao是Data Access Object的简写,是对Student对象持久化的操作的具体实现类
u OrmHelper与Dao都应该是Singleton
u 安装:下载jar文件,放到libs目录,增加文件依赖
u OrmLiteActivity
c) SharedPreferences
u SharedPreferences
u 用于保存少量简单数据,如配置信息,用户信息
u 格式:key-value
u 操作
u 查询(isContainKey())
u 读出
u 写入
u 保存在/data/data/包名/shared_prefs.xml里面
d) ContentProvider
u ContentProvider
u 作用及背景
u APP之间的数据交换,一个APP通过ContentProvider可以暴露一些数据,供其它APP读/写
u Android也允许跨APP访问SharePreferences,不建议这样做
u 类似一个网站或者是WebService
u 实现
u 每个ContentProvider与特定的Uri(统一资源标识符),在Manifest文件中指定
u 编写ContentProvider的子类,覆盖4个方法:query、insert、update、delete(查、增、改、删)
u 外界APP通过在ContentResolver中指明Uri及对应的方法去调用
u ContentResolver中的Uri是一个参数
u Uri本身可以带参数,UriMatcher工具帮我们处理Uri带的参数 content://gdut.iot.FirstProvider/female-students
u 接受什么参数,是各个方法自行定义的
u Uri是ContentProvider的4个方法的参数,如何把Uri中后面跟的参数取出来?
u 基于ContentProvider的生词本
u 访问系统自带的ContentProvider(自行阅读)
u ContentObserver
u 观察者模式
u 监视ContentProvider的数据变化
u 直接操作XML:PULL方式与DOM方式操作XML的区别
u 直接操作XML文件
u Java使用DOM(Document Object Model)的方式操作XML,DOM需要先加载整个XML文件到内存并生成结点的树状结构,可以通过XPath表达式进行高效的搜索
u 适合Android的方式是PULL(默认的方式)
u 通过XmlResourceParser读写
u 逐标记的读,需要写一堆的if-else语句判断标记的名字,然后作出不同的动作
e) 操作NoSQL:SnappyDB
u NoSQL
u Not Only SQL,指非关系型数据库
u 数据不是以二维表的形式存放的
u 以key-value的方式
u 以文档集的方式
u 以其它复杂的方式(图)
G. 网络编程
a) 直接操作Socket:服务器端实现(多线程,在著名端口上监听,每个客户端通过不同的线程提供服务)
b) 操作HTTP:下载URL指向的资源、网络爬虫原理、维持Session
i. GET、POST请求
ii. 多线程下载、断点续传的例子
iii. JSON数据格式:语法,JSON格式与Java、JavaScript对象之间的转换
iv. 电子拍卖系统的客户端实现(Server端、Struts、Spring、Hibernate不需要)
网络爬虫的基本原理:
1.首先选取一部分精心挑选的种子URL;
2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些
URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
展开阅读全文
相关搜索