(1)hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
(2)hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
(3)hashMap允许空键值,而hashTable不允许。
关系运算符:instanceof
a instanceof Animal; 这个式子的结果是一个布尔表达式, a为对象变量,Animal是类名。
上面语句是判定a是否可以贴Animal标签。如果可以贴则返回true,否则返回false。
instanceof用于判定是否将前面的对象变量赋值后边的类名。Instanceof一般用于在强制类型转换之前判定变量是否可以强制转换.
如果Animal a=new Animal();
Dog d=Dog()a; 此时编译无误,但运行则会报错
static:①可修饰变量(属性);②可修饰方法;③可修饰代码块
————Static int data语句说明data为类变量,为一个类的共享变量,属于整个类。
————Public static void printData(){}
表明此类方法为类方法(静态方法)。静态方法不需要有对象,可以使用类名调用。静态方法中不允许访问类的非静态成员,包括成
员的变量和方法,因为此时是通过类调用的,没有对象的概念。This.data是不可用的。
一般情况下,主方法是静态方法,所以可调用静态方法,主方法为静态方法是因为它是整个软件系统的入口,而进入入口时系统中没
有任何对象,只能使用类调用。
————当static修饰代码块时(注:此代码块要在此类的任何一个方法之外),那么这个代码块在代码被装载进虚拟机生成对象的时候可被装载
一次,以后再也不执行了。一般静态代码块被用来初始化静态成员。
设计模式:经验复用;
设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程,而不是针对实现编程。
“针对超类型编程”这句话,可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要是具体实现
此超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时的真正对象类型!”
android编译系统的makefile文件Android.mk
eg:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#OPENCV_CAMERA_MODULES:=off
#OPENCV_INSTALL_MODULES:=off
#OPENCV_LIB_TYPE:=SHARED
include ../../sdk/native/jni/OpenCV.mk
LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE := detection_based_tracker
include $(BUILD_SHARED_LIBRARY)
(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件;
Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:
LOCAL_PATH:=$(call my-dir) 意思是将LOCAL_PATH变量定义成本文件所在目录路径。
(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,
LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序
【Android UI】 Shape详解 (GradientDrawable)
在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决。不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,
默认的式样图片。 这样就容易使apk变大。
除了使用drawable这样的图片外,还可以使用自定义图形shape,Android上支持以下几种属性shape、gradient、stroke、corners、padding、solid等
gradient -- 对应颜色渐变。 startcolor、endcolor就不多说了。 android:angle 是指从哪个角度开始变。
solid -- 填充。
stroke -- 描边。
corners -- 圆角。
padding -- 定义内容离边界的距离。 与android:padding_left、android:padding_right这些是一个道理。
eg:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape=" " >
<!-- 渐变 -->
<gradient
android:angle="180"
android:startColor="#BFEEFF"
android:endColor="#40B9FF" />
<!-- 描边 -->
<stroke
android:width="2px"
android:color="#11C355" /><!--#11C355 -->
<!-- 实心 -->
<solid android:color="#F7F7F7" />
<!-- 圆角 -->
<corners
android:bottomLeftRadius="10px"
android:bottomRightRadius="10px"
android:topLeftRadius="10px"
android:topRightRadius="10px" />
</shape>
编码问题(UTF-8、gb2312、unicode)
A:字符集(CharacterSet)?
Q:字面上的理解就是字符的集合,例如ASCII字符集,定义了128个字符;GB2312定义了7445个字符。而计算机系统中提到的字符集准确来说,指
的是已编号的字符的有序集合(不一定是连续)。
Q:Unicode是两个字节吗?
A:Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储为什么样的字节流,取决于字符编码方案。
推荐的Unicode编码是UTF-16和UTF-8。
Q:带签名的UTF-8指的是什么意思?
A:带签名指的是字节流以BOM标记开始。很多软件会“智能”的探测当前字节流使用的字符编码,这种探测过程出于效率考虑,通常会提取字节流前
面若干个字节,看看是否符合某些常见字符编码的编码规则。由于UTF-8和ASCII编码对于纯英文的编码是一样的,无法区分开来,因此通过在
字节流最前面添加BOM标记可以告诉软件,当前使用的是Unicode编码,判别成功率就十分准确了。但是需要注意,不是所有软件或者程序都能
正确处理BOM标记,例如PHP就不会检测BOM标记,直接把它当普通字节流解析了。因此如果你的PHP文件是采用带BOM标记的UTF-8进行编码的,
那么有可能会出现问题。
Q:Unicode编码和以前的字符集编码有什么区别?
A:早期字符编码、字符集和代码页等概念都是表达同一个意思。例如GB2312字符集、GB2312编码,936代码页,实际上说的是同个东西。但是对于
Unicode则不同,Unicode字符集只是定义了字符的集合和唯一编号,Unicode编码,则是对UTF-8、UCS-2/UTF-16等具体编码方案的统称而已,
并不是具体的编码方案。所以当需要用到字符编码的时候,你可以写gb2312,codepage936,utf-8,utf-16,但请不要写unicode(看过别人
在网页的meta标签里头写charset=unicode,有感而发)。
(1)GB2312以及GBK字符集,限定了使用最多2个字节来编码所有字符,并且规定了字节序。这样的编码系统通常用简单的查表,也就是通过代码页就可
以直接将字符映射为存储设备上的字节流了
(2)“虽然每个字符在Unicode字符集中都能找到唯一确定的编号(字符码,又称Unicode码),但是决定最终字节流的却是具体的字符编码”
(3)unicode是包含了gb2312中的字符集,但是每种编码解码方式不一样,也就是说,utf-8编码是一种规则,他自己编码的字节流,需要用自己的规则
去解码,utf-8是变长编码的,它不能按照gb2312那样解析字节流。所以如果不一致,就会出现乱码情况
网络安全中的加密技术
简介
(1)加密:是指将一个明文信息经过加密钥匙及加密函数转换,变成无意义的密文,而接收方将此密文经过解密函数、解密钥匙还原成明文;
(2)加密在网络上的作用就是防止有用或私有化信息在网络上被拦截和窃取;
分类
(1)理论上保密的密码:无论获取多少密文或具有多大计算能力,始终无法解密得到明文;如:客观随机一次一密的密码;
(2)实际上保密的密码:在理论上可以破解,但是在现有客观条件下无法通过计算来确定唯一解的密码;
(3)不保密的密码:获取一定量的密文后可以得到唯一解的密码;如:明文加少量密钥等密码;
流程
(1)明文信息——》加密算法-》密文信息-》发送到网络。。。
(2)接收端接收——》密文信息——》解密算法——》还原为明文信息
加密技术分类
(1)对称式:加密和解密使用同一密钥,通常称之为"Session Key";如DES、AES加密标准是一种典型的“对称式”加密法;
(2)非对称式:加密解密使用的不是同一密钥,通常有两个密钥,称为“公钥”和“私钥”,需配对使用才能打开加密文件;
“公钥”是可以公开的,不怕别人知道,收件人解密时用自己的“私钥”既可以;
很好的避免了密钥的传输安全性问题;
RSA加密解密???
泛型
泛型是在java5才加入的,简单的讲就是对集合中的类型进行约束,也增强了对象的安全。
在java5之前所有放进数据集合中的数据都会被转成object对象存储,而且不管什么时候都可以存的进去,你可以先放一个String然后再放一个Integer
这样也能编译通过,当取出数据的时候,取出都是object类型的数据,必须进行强制类型转换转换成原来的数据类型才能使用。
泛型就是给数据集合强制限定了存储数据的类型。是在编译期间约束类型的,保证对象安全。
比如 ArrayList<String>a=new ArrayList<String>();
上面这个ArrayList里只能存储String类型的数据,如果你往里放Integer的话就会报错,而且取出数据的时候也是String,不需要强制转换类型。
HashMap遍历的两种方式,推荐使用entrySet()
(1)第一种:
Map map=new HashMap();
Iterator iter=map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry=(Map.Entry)iter.next();
Object key=entry.getKey();
Object val=entry.getValue();
}
(2)第二种
Map map=new HashMap();
Iterator iter=map.keyset.iterator();
while(iter.hasNext()){
Object key=iter.next();
Object val=map.get(key);
}
HashMap的遍历有两种常用的方法,那就是使用 entryset 及 keyset 来进行遍历,但两者的遍历速度是有差别的;
keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value; ——效率低,尽量少使用
entryset只是遍历了第一次,他把key和value都放到了entry中; ——效率高,推荐使用此种方式
JAVA中线程同步
(1)wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在
的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足
却继续执行的情况。
第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中
interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。
【注:1.wait和notify永远都是要synchronized块里面执行的;
2.synchronized中的对象不能被修改,可能修改值时候,就会把整个对象都修改了,不再是原来的对象,所以要注意使用,最好是final的】
(2)notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不
能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
(3)synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code....}。表示一个线程要执行该代码块,必须获得obj的锁。
这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。
(4)synchronized和wait()、notify()的关系:
1.有synchronized的地方不一定有wait,notify
2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类,而是每一个对象都具有的方法,而且,这两个方法都和
对象锁有关,有锁的地方,必有synchronized。
synchronized就是针对内存区块申请内存锁,this关键字代表类的一个对象,所以其内存锁是针对相同对象的互斥操作;static成员属于类专有,
其内存空间为该类所有成员共有,这就导致synchronized()对static成员加锁,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间
只有一个线程可访问该类的实例.
wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,
并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的
synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供
了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同
时,释放了对象锁的控制。
匿名内部类
使用匿名内部类可使代码更加简洁、紧凑,模块化程度更高。内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到;
匿名内部类的两种实现方式:第一种,继承一个类,重写其方法;第二种,实现一个接口(可以是多个),实现其方法;
使用匿名内部类是因为我这地方需要有点什么特殊的实现,所以我就在这地方把具体实现也给了出来了;
使用匿名内部类时我们不要忘了我们的目的,我们只是在这地方想对某个类有特殊的实现。
对于匿名内部类不要想的太多,而要这么想:“匿名内部类就是重写父类或接口的方法”。
用内部类是为了更好的封装代码,因为内部类可以作为外部类的成员,内部类就是和外部类关系比较大,所以逻辑性比较强。
经测试:Android中进入下一个Activity时在上一个Activity主动调用onDestroy()方法不会真正将上一个Activity从栈中删除
Android在运行时,正常情况下,Activity的切换其实是将运行过的Activity压入栈中,每创建一个Activity就向栈中压入该Activity;
当点击返回键的时候会销毁当前Activity,即将当前Activity从栈顶删除,接着显式栈中的第二个Activity(也即现在的栈顶Activity)。
【注意:点击返回键是会destroy掉当前Activity的,而不是再将该Activity压入栈里】
Activity从Main跳转到Subscreen过程函数调用顺序:
Main.onCreate()→Main.onStart()→Main.onResume()→Main.onPause()→Subscreen.onCreate()→Subscreen.onStart()→Subscreen.onResume()→Main.onStop()
Linux命令
3.Linux命令行新建一个文件:touch <file_name>
4.Linux命令行下强制删除文件夹:rm -rf dir
-r是遍历删除
-f是强制删除
这样才达到删除含有下级目录或文件的目录效果
6.Linux查看当前路径:
pwd
7.Linux cd命令的使用:
cd - 回到上次所在目录。
cd !$ 把上个命令的参数作为这次命令的参数输入。
cd ~ 回到当前登录用户的主目录。
cd 同cd ~
9.Linux 分布显示的more命令:more [-dlfpcsu] [-num] [+/pattern] [+num] [fileNames..]
-d: 提示使用者,在画面下方显示 [Press space to continue, q to quit.],如果使用者按错键,则会显示 [Press h for instructions.];
-l: 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能 ;
-f: 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上);
-p: 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容;
-c: 跟 -p 相似,不同的是先显示内容再清除其他旧资料;
-s: 当遇到有连续两行以上的空白行,就代换为一行的空白行;
-u: 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同);
+/: 在每个档案显示前搜寻该字串(pattern),然后从该字串之后开始显示;
-num: 显示到第num行;
+num: 从第num行开始显示;
more命令中的交互式选项:
按空白键(space)显示下一页;
按b键就会往回一页显示;
按q键退出;
/pattern: 从当前位置向前搜索指定模式的字符的指定位置
范例:
more -s testfile %逐页显示 testfile 之档案内容,如有连续两行以上空白行则以一行空白行显示。
more +20 testfile %从第 20 行开始显示 testfile 之档案内容。
more example1.c % 用分页的方式显示一个文件的内容。
more -c -10 example1.c % 执行该命令后,先清屏,然后将以每十行每十行的方式显示文件example.c的内容。
8.inux chmod 命令详解
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
1)文字设定法: $ chmod a+x sort
2)数字设定法: $ chmod 644 mm.txt
echo $PATh
A:???
java 类加载机制
java 运行时异常与普通异常
Android 图片内存处理
Android crash种类
Android application 运行多次
Android Binder机制
Android Handler、looper
Android 自定义View
Android 广播、服务ANR
Android 消息处理机制
java 线程、锁、线程池
android事件传递,View绘制,自定义View,联系人,数据库,网络socket
代理模式;JNI调用,java调C,C调用JAVA;适配器模式\门面模式\策略模式\模版方法\命令模式\