整理了一下本学期使用Java的过程中遇到的一些知识点,一直草稿保存中……
关于Java
基础类型包装类:简单来说就是把基本数据直接加到集合类中时发生了自动装包,从集合类中取出直接进行运算时发生了自动解包的过程。
s.trim(); 会返回一个删掉首尾空格的字符串,但是并不会将原字符串修改。
Junit test 的一个现象是,在所有方法之外只允许进行变量的声明,初始化的部分可以放在@Before部分,使得每个test用例之前都能用到初始化之后的数据,而且每个@Test中对数据的修改都不会保存,在一个新的@Test方法中不会有之前test的痕迹,每个测试相互独立。
java8新特性:
接口可以有默认方法和静态方法。默认方法顾名思义,就是不重写就可以默认执行的方法,可以看作抽象类中的不抽象方法。静态方法不能被重写。
关于继承:
接口的属性都是public static final的
子类重写父类方法,返回父类返回类型或其子类型(编译器允许),即covariance协变
但参数类型必须完全符合父类型
重载参数列表对比不考虑泛型参数的区别,会发生type erase
一个接口可以extends多个接口
一个类可以implements多个接口
一个类能同时extends另一个类和implements接口
一个类implements接口就要实现它的所有方法
java父类个子类之间的强转
例一:
Father f1 = new Son(); // upcasting (向上转型) 父类引用指向子类对象
Son s1 = (Son)f1; // downcasting (向下转型)
例二:
Father f2 = new Father();
Son s2 = (Son)f2; // 出错,子类引用不能指向父类对象
scanner一旦关闭之后,再次唤醒读取报错,查资料给的解释是,new这个scanner的时候使用的是system.in,所以close的时候把整个系统输入都shut down 了,所以再次读取报错。
另外,当读取、处理数据过程结束时,需要调用close(),而在处理数据过程中,如果发生异常,也要先close()再throw
map的get返回值可能是null要另外处理
性能优化:合适存储结构的选取
实验任务也涉及到了对代码性能进行优化的内容,最初实现功能的过程中,一般的考虑是采用较合适的、容易实现的数据存储结构来进行操作,但有些时候并不是选了性能表现最好的数据结构,导致性能方面损失比较大。
实验中主要的优化部分在于充分利用hash,尤其是hashmap,在进行关系网络层梳理的过程中,使用hashmap对节点信息进行存储能够有效提升效率,list 的 indexOf() 方法使用了简单遍历的方式,所以性能较差。但需要注意的一点是,涉及到哈希的结构依靠 hashcode() 方法,所以如果操作的对象的hashcode方法被重写,则要保证较低的冲撞率,否则性能下降明显。eclipse 右键-> Source有自动生成hashcode和equals方法的功能,极其好用。
关于eclipse开发环境
最初开始使用eclipse时候踩了不少坑,从最开始的照搬资料的操作方式,到有了一点理解……
最开始学习java的时候没有用IDE,记事本编辑 + 手动创建文件夹作为包。eclipse中,首先任何时候的默认的根路径都是工程路径之下,也就是 src 的上一层,新建项目的时候,eclipse会默认将src加入buildpath,这样其中的文件夹才会被认为成包,.java文件认为是源代码,但包名是不含src的,即src下文件夹是第一层包。如果直接在src下面添加源码文件,eclipse中会显示默认package,但实际上没有包。
其他的test文件放到与src同级的文件夹test中,将test文件夹手动添加到buildpath,才可运行测试。
开始的一次实验中,虽然在src下面设置了文件夹,但把src下的文件夹加入buildpath,其实还是相当于没有包,代码中也没写package语句……
eclipse 出现(蓝色)问号原因是检测到此文件为新添加文件,库中没有记录,修改后未提交的参与更改的文件也会出现提示标识。
项目名出现红色叹号:用户第三方库设置出现问题
eclipse 的refactor(重构)能够方便的批量修改变量名、包名等。
使用check style过程中,最多的错误可能是之前缩进方式不同,点击check style,点击create format profile即可将eclipse自己的formater设置成check style的标准,之后直接使用ctrl+shift+f即可快速调整缩进格式。
eclipse的多线程调试参考了前人的经验,仍然没有实现任意控制线程运行的方法,最终多线程调试还是通过assert和print解决了……