.net 程序员应该知道的java 知识(1) : 基础篇. 持续更新中....

做了多年的.net 之后, 最近开始转向java 编程.
这个系列记录了其间遇到的一些与.net 不同或者没有接触过的概念. 所以,其中一些可能比较浅显.

开篇介绍一些基础知识和概念, 会持续更新中....

语法点

  • Arrays.asList() 返回的是一个固定大小的list.
    • 如果想要修改其返回结果, 需要将其包装为LinkedList:
      • List list = new LinkedList(Arrays.asList(split));
  • java 中代表后续字符串为原始值(不需要转移)的符号为: \\\\
    • 这个类似于c# 中的@.
    • 例如: String.split(“\\\\|”).
  • 将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 关键字.
  • 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 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 来动态绑定该方法.

你可能感兴趣的:(.net 程序员应该知道的java 知识(1) : 基础篇. 持续更新中....)