`

个人笔记...

 
阅读更多
http://faxzero.com/
https://portal.pamfax.biz/PortalLogin/Init/


Collections Framework
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来进行泛型的强制类型转换


####################################################################################################
android
####################################################################################################
res/raw, asset, res/xxx的区别
存放任意文件生成id预编译为二进制子目录引用方式
assetsgetAssets().open(file_path)
/res/rawgetResource().openRawResource(resId)
/res/xxx指定类型文件getResource().getXxx(resId)

想更自由(如:创建子目录,用文件名引用)就用asset

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

对于有符号数:
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



浮点数相关
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;
	}
}


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

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

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

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

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

####################################################################################################
PSP
####################################################################################################

####################################################################################################
Mac
####################################################################################################
mac安装
什么是ktext:http://baike.baidu.com/view/6161962.html?fromTaglist
什么是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版本的该文件不能通用)

####################################################################################################
泛型
####################################################################################################
在写微博解析器时,思考的泛型问题
没用泛型
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;
	}
}

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



突然发现被泛型搞混了
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.csdn.net/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;
}

// 然后分别实现两个接口
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics