个人笔记...

http://faxzero.com/
https://portal.pamfax.biz/PortalLogin/Init/


[b][size=medium]Collections Framework[/size][/b]
Collection 数据的合集
提供添加、删除、遍历其数据的功能。

Set 集合(对应数学上的集合,所以具有元素顺序无关性和元素无重复的性质)
功能和Collection相同,就是对于元素的限定与Collection不同。

SortedSet 有序集合
增加了实现类要对元素进行排序的规定,这样才能更好的利用它的顺序相关方法(如:访问两个元素间的元素视图,访问某元素以上的元素视图等)。

NavigableSet 可导航集合
增加了导航的功能,即访问<某元素的最大元素(lower), >某元素的最小元素(higher), <=某元素的最大元素(floor), >=某元素的最小元素(ceiling)元素的功能

List 列表(有顺序,允许重复元素,允许多个null元素)
除了Collection的功能,还增加了索引添加、删除、访问的功能。

Map 映射(不允许重复的key,一个key只有一个值,key可以为null,顺序由map的某个视图的iterator来确定)
添加、删除、访问、遍历键值对的功能

SortedMap 有序的映射(在Map的基础上增加了一些约束,就是要求对其元素的key进行排序)
除了Map的功能,增加了利用顺序的一些方法

NavigableMap 可导航映射
在SortedMap的基础上增加了导航的功能,即访问<某元素的最大元素(lower), >某元素的最小元素(higher), <=某元素的最大元素(floor), >=某元素的最小元素(ceiling)元素的功能

Queue 队列(增加不允许插入null的限制)
除了Collection的功能,还增加了队列方式的添加,获取和检查元素的功能。

Deque (double ended queue)双端队列
在Queue基础上,增加在头和尾都可以添加、获取和检查元素的功能。


public interface Factory<T> {
public T createObject();
}

public class Factory1 implements Factory<Child1> {

@Override
public Child1 createObject() {
return new Child1();
}
}

public class Factory2 implements Factory<Child2> {
@Override
public Child2 createObject() {
return new Child2();
}
}

// 这里T没有限制,所以在T为Child2而? extends T为Child1时就会出现ClassCast异常
private class Pool<T> {
// 持有的是T的子类,但具体是哪个子类不知道
private Factory<? extends T> factory;

public Pool(Factory<? extends T> factory) {
this.factory = factory;
}

public T create() {
return factory.createObject();
}
}

public void test2() {
Pool<Child2> pool = new Pool(new Factory1());
// create根据pool引用变量的"类型参数"来cast
Child2 c2 = pool.create();
}

只在读取和存储时使用?,普通的直接用explict类参


SomeClass<Child> ref1 = ...;
// 强制cast为Child
ref1.get();

SomeClass<? extends Father> ref2 = ref1;
// 这样的话就只会强制cast为Father了
ref2.get();



// 如何用Class来进行泛型的强制类型转换


####################################################################################################
[b]android[/b]
####################################################################################################
[b][size=medium]res/raw, asset, res/xxx的区别[/size][/b]
[table]
||存放任意文件|生成id|预编译为二进制|子目录|引用方式
|assets|是|否|否|是|getAssets().open(file_path)
|/res/raw|是|是|否|否|getResource().openRawResource(resId)
|/res/xxx|指定类型文件|是|是|否|getResource().getXxx(resId)
[/table]
想更自由(如:创建子目录,用文件名引用)就用asset

####################################################################################################
[b]程序基础[/b]
####################################################################################################
[b][size=medium]原码、反码、补码[/size][/b]
参考:[url]http://blog.youkuaiyun.com/ncdawen/article/details/846672[/url]
在计算机中,数都是用补码来表示的;主要是方便计算。减法可以用加法来算。

对于有符号数:
127:
原码:01111111
反码:01111111
补码:01111111。
反码和补码表示发规定正数的反码和补码相同。

-1:
原码:10000001
反码:11111110(除了符号位,其余位取反)
补码:11111111(反码加1)

一个有8位的数,它可以有256个不同的值,0~255;11111111表示的只是其中的一个值255。

计算机不区分正负,只是在代码层面对正负进行了区分。如果计算机中有一个值为10000001,如果这个值所对应的变量被标记为signed时,那它被程序解释后就是-127;如果这个值所对应的变量被标记为unsigned时,那它就被程序解释后就是129。

unsigned char c = 0x81; // 0b10000001
printf("%d\n", c); // 结果为129
char d = 0x81; // 0b10000001
printf("%d\n", d); // 结果为-127


unsigned char num1 = 127;
char num2 = 1;

unsigned char result1 = 0;
result1 = num1 + num2;
printf("%d\n", result1); // 128

char result2 = 0;
result2 = num1 + num2;
printf("%d\n", result2); // -128,因为此时计算机中表示为10000000,然后程序发现该变量是有符号的,则将该值解释为-128

// 如果无符号数和有符号负数做加法时,符号位是如何处理的。
unsigned char num1 = 127; // 0b01111111
char num2 = -1; // 0b10000001

unsigned char result1 = 0;
// num1, num2首先会被转换为无符号int。num2变为0b00000001(直接将符号位置0)
// 然后再分别用它们的补码进行运算。
result1 = num1 + num2;
printf("%d\n", result1); // 126

char result2 = 0;
result2 = num1 + num2;
printf("%d\n", result2); // 126



[b][size=medium]浮点数相关[/size][/b]

class MyFloat {
// 123455621,位数是3

// 但是你使用计算的时候 就可以把它当做
// 123455.621
// 分开计算就是了
// 除以1000
// 和%1000
/**
* 小数位数。
*/
private int digits;

/**
* 数据。
*/
private int value;

public float value() {
float value = 0;
int base = Math.pow(10, digits);
value += value / base;
value += value % base;
return value;
}
}


####################################################################################################
[b]puzzle me[/b]
####################################################################################################
[b][size=medium]未实现的方法是不是该抛UnsupportedOperationException?[/size][/b]
1. 它是一个RuntimeException,表示代码的错误(或不可恢复的错误、没有合理的值来表示错误、只会因确定因素导致的CheckedException(MediaPlayer抛IOException,而播放的文件全是程序内置资源))。

2. 对于已近嵌入在框架中的接口,我们绝对是不能在实现代码中抛该Exception(即使没有任何实现),因为那样代码是无法正常运行的。

3. 对于在集合框架中(thinking in java)中提到的不是部分方法会抛该异常,那外一我们把一个会抛异常的List对象传入了需要List的方法,那岂不是程序会抛异常了。那就是编程错误了,就是说在那里我们不能用那个List,那个方法需要的是一个不抛异常的List对象。

4. 这个异常是用来提示我们的,提示我们这个类没有实现该方法,我们不该调用。而不是去用来提示别人(框架)的,因为别人是我们无法控制的。所以我们在调用别人的东西的时候,用2中所说的。

####################################################################################################
[b]线程[/b]
####################################################################################################
[b][size=medium]volatile[/size][/b]
一个对象的变量在被一个线程修改后,不一定能够马上被另外一个线程所看到,比如:ui线程将boolean isPause设为true,不一定能够被绘制线程马上看到(因为修改的值是修改的线程堆栈上的一个拷贝,而不是直接改的内存中的变量)。在加上volatile后,线程对变量的修改就是直接改的内存个中的变量了。

####################################################################################################
[b]PSP[/b]
####################################################################################################

####################################################################################################
[b]Mac[/b]
####################################################################################################
[b][size=medium]mac安装[/size][/b]
什么是ktext:[url]http://baike.baidu.com/view/6161962.html?fromTaglist[/url]
什么是plist:program list,程序属性文件

mac相关关键字:
NULL电源
五国
无限风火轮
dsts驱动安装
/S/L/E:/System/Library/Extensions/com.apple.boot.plist

变色龙启动配置文件:Library/Preferences/SystemConfiguration/com.apple.Boot.plist

mac os启动开在ntfs volumn处:可能是使用了版本不对的IOATAFAMILY.KEXT(每个mac os版本的该文件不能通用)

####################################################################################################
[b]泛型[/b]
####################################################################################################
[b][size=medium]在写微博解析器时,思考的泛型问题[/size][/b]
没用泛型

public interface Parser {
public Object parse(InputStream inStream)
throws IOException, ParserException;
}

public class UserParser implements Parser {
public User parse(InputStream inStream)
throws IOException, ParserException {
// some code
return user;
}
}

public class AnotherParser implements Parser {
public Type parse(InputStream inStream)
throws IOException, ParserException {
// some code
return typeInstance;
}
}

// 用到Parser接口的地方
public WeiboApi {
// 使用Parser更通用
// UserParser的话可能也有n中实现方式
public User user_info(String url, Parser parser)
throws IOException, ParserException {
Object object = parser.parse(inStream);
// 需要手动类型转换
return (User) object;
}
}

使用泛型

public interface Parser<T> {
public T parse(InputStream inStream)
throws IOException, ParserException;
}

public class UserParser implements Parser<User> {
public User parse(InputStream inStream)
throws IOException, ParserException {
// some code
return user;
}
}

public class AnotherParser implements Parser<Type> {
public Type parse(InputStream inStream)
throws IOException, ParserException {
// some code
return typeInstance;
}
}

// 用到Parser接口的地方
public class WeiboApi {
// 在传入时,Parser<? extends User> parser = outParser;
public User user_info(String url, Parser<? extends User> parser)
throws IOException, ParserException {
// some code
User user = parser.parse(inStream);
return user;
}
}

// 基类携带上子类的类型信息
// 变量携带上子类的类型信息



[b][size=medium]突然发现被泛型搞混了[/size][/b]

Map<String, List<String>> map = new HashMap<String, List<String>>();
// 但不可以这样
Map<String, List<String>> map = new HashMap<String, ArrayList<String>>();
// 但可以这样
Map<String, ? extends List<String>> map = new HashMap<String, ArrayList<String>>();
// 但上面的这种写法不能这样
map.put("test", new ArrayList<String>());
// 唉...再去看看泛型

List<Apple> apples = ...;
// fruits接管了一个装有Fruit子类的一个List
List<? extends Fruit> fruits = apples;
这样fruits只能get,不能add。因为要保证在apples赋给fruits后,也不应该向其中加入Orange

List<Fruit> fruits = ...;
// apples接管了一个装有Apple超类的list
List<? super Apple> apples = fruits;
因为接管的list装有的是Apple的超类,所以我们想那个list中加入Apple及子类是没问题的。但get是只能取出Object。
http://java.youkuaiyun.com/a/20110603/299216.html

List<?> -> List<? extends Object>



public interface JSONParser<T> {
public T parse(JSONObject object) throws JSONException;
}

// 实现类之User
public class UserParser1 implements JSONParser<User> {
@Override
public User parse(JSONObject object) throws JSONException {
// code 1
return user1;
}
}
public class UserParser2 implements JSONParser<User> {
@Override
public User parse(JSONObject object) throws JSONException {
// code2
return user2;
}
}

// 实现类之Message
public class MessageParser1 implements JSONParser<Message> {
@Override
public Message parse(JSONObject object) throws JSONException {
// code 1
return message1;
}
}
public class MessageParser2 implements JSONParser<Message> {
@Override
public Message parse(JSONObject object) throws JSONException {
// code2
return message2;
}
}


// 使用
JSONParser<User> parser = new UserParser1();
或者
JSONParser<User> parser = new UserParser2();


不使用泛型的话

public interface UserJSONParser {
public User parse(JSONObject object) throws JSONException;
}

public interface MessageJSONParser {
public Message parse(JSONObject object) throws JSONException;
}

// 然后分别实现两个接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值