做了多年的.net 之后, 最近开始转向java 编程.
这个系列记录了其间遇到的一些与.net 不同或者没有接触过的概念. 所以,其中一些可能比较浅显.
开篇介绍一些基础知识和概念, 会持续更新中....
语法点
- Arrays.asList() 返回的是一个固定大小的list.
- 如果想要修改其返回结果, 需要将其包装为
LinkedList
:List<String> list = new LinkedList<String>(Arrays.asList(split));
- 如果想要修改其返回结果, 需要将其包装为
- java 中代表后续字符串为原始值(不需要转移)的符号为:
\\\\
- 这个类似于c# 中的
@
. - 例如:
String.split(“\\\\|”)
.
- 这个类似于c# 中的
- 将byte[] 转换为string.
new String(bytes);
- 同时可以指定encoding.
- lamda 表达式中访问的外部局部变量必须是final 或者隐式final 的.
- 但是lamda 能够获得对成员变量或静态变量的读写权.
- Static
- java 没有static 类.
- 可以使用
final class + private constructor + static members(method+fields)
来模拟. - Math 类应该是static 的, 虽然并没有该关键字.
- static 类可以不含有static 方法,它不能被实例化. 而static 方法必须在static 类中.
- 可以使用
- 有static nested 类.
- 它与普通nested 类的区别是,可以独立于外部类的实例,被直接构造.
- java有const 关键字,但是没有任何功能.
- const 在C++ 中用来创建const-pointer.
- 在java 中使用
final
实现. - 在C# 中有
readonly
关键字.
- java 没有static 类.
- ClassLoader
- JVM 判定两个class 是否相等时,不仅要判断两个类名是否相同,而且要判断是否由同一类加载器加载的.
- 双亲委托模型
- 每个ClassLoader 实例都有一个父类加载器的引用(包含而非继承关系).
- 安全因素: 防止随时使用自定义的类来替换java 核心api 中定义的类型.
- 避免重复加载同一类.
java API
- 管道(PipedInput/OutputStream.).
- 一个in 和一个out 相关联. 或者使用connect() 来关联两个管道.
- 必须在不同的线程上, 分配两个相关联的管道, 否则在一个线程中同时进行读和写,可能会导致死锁.
- 为运行在同一JVM 中(同一进程下的)的两个线程提供了通信能力(传递字节数据).
- 线程多数情况下需要传递的是完整的对象信息而非原始的字节数据.
- 管道也可以作为数据源及目标媒介.
- Unix 中, 运行在不同的地址空间的两个进程可以通过管道通信.
- 网络
- 使用网络API 在不同的进程间建立网络连接, 之后使用IO 在建立了连接之后的进程间交换数据.
- 能够对文件进行写入数据(FileOutputStream)的代码, 同样也能写入到网络连接(OutputStream)中去.
- Stream(二进制: 字节: 0到255), Reader/Writter(文本: 字符: 0到65535).
- Reader会根据文本的编码,一次读取若干个字节(并发固定的2个).
java 8 新特性
- �拼接字符串数组到一个结果字符串中.
- StringJoiner.
StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add("George").add("Sally").add("Fred");
String desiredString = sj.toString();
- elements.stream().collect(Collectors.joining()).
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
String commaSeparatedNumbers = numbers.stream() .map(i -> i.toString()) .collect(Collectors.joining(", "));
- 继承了两个拥有相同签名的default方法的接口的类, 必须override 该方法, 可以使用InterfaceA.super.method()来调用某个接口的方法.
- default 方法的产生, 是为了向后兼容( 对接口新增方法时,不必对所有实现类进行连带修改).
- JDK 8 的Collections 接口就扩展了foreach(). 实现类可以override.
- static default 会强制所有的实现类override该方法.
- Lambda 表达式与匿名类的区别
- 匿名类的this 代表该匿名类, 而lambda 表达式中的this 代表外部类.
- 编译lambda 表达式时,将其转化为类里面的私有含有, 并使用invokedynamic 来动态绑定该方法.