目录
1、运算符
逻辑运算符中, !拥有最高优先级,之后是&&,接下来是 || 。
2、类型转换
浮点型转换为整型将会截断小数点后面的部分,而不是四舍五入。
3、break和continue语句
- break,立即从循环中退出
- continue,立即开始下一轮循环
4、创建并初始化数组
double[] a; //声明数组
a=new double[5];//创建数组
for (int i=0;i<5;i++){ //初始化数组
a[i]=0.0;
}
//简化写法
double[] b=new double[5];
5、起别名
赋值语句不会创建新的对象,而只是创建另一个指向某个已经存在的对象的引用。
(原始数据类型除外,int a=1,int b=a, 会将1赋值给b)
将一个数组变量赋值给另一个数组变量,我们称之为起别名。要想复制数组,需要创建初始化一个新的数组,然后将原数组中的每个元素复制到新数组中。
double[] b=new double[5];
double[] c=b;
6、递归的条件(代码是二分查找)
- 方法的第一条语句总是一个包含return的条件语句。
- 递归调用总是去尝试解决一个规模更小的子问题。
- 递归调用的父问题和尝试解决的子问题之间不应该有交集。
fun main() {
val a =
arrayOf(1, 3, 5, 6, 7, 9, 11, 14, 16, 17, 19, 23, 45, 46, 47, 56, 57, 66, 67, 69, 71, 73)
val result1 = rank(19, a)
val result2 = rank(30, a)
println("result1=$result1 ,result2=$result2")
}
fun rank(key: Int, a: Array<Int>): Int {
return rank(key, a, 0, a.size - 1)
}
fun rank(key: Int, a: Array<Int>, lo: Int, hi: Int): Int {
if (lo > hi) return -1
val mid = lo + (hi - lo) / 2
when {
key > a[mid] -> rank(key, a, mid + 1, hi)
key < a[mid] -> rank(key, a, lo, mid - 1)
else -> return mid
}
return -1
}
7、单元测试
用main()函数对静态代码块进行模块测试。
8、API定义
应用程序编程接口(API)---模块化编程的一个重要组成部分就是记录库方法的用法,并供其他人参考的文档。
9、格式化输出
- 浮点型保留n位小数点 --- %.nf
- 浮点型总长度n,保留小数点m位,不够的补0----%0n.mf
- 整型总长度n,不够的补0 ----%0nd
- 整型总长度n,不够的补空格 ----%-nd
fun main() {
val a = String.format("%.2f", 3.2345)
val b = String.format("%06.2f", 3.2345)
val d = String.format("%05d", 3)
val e = String.format("%-5d", 3)
val f = String.format("%-5s", "小花")
val g = String.format("%5s", "小花")
println("a=$a,a.length=${a.length}")
println("b=$b,b.length=${b.length}")
println("d=$d,d.length=${d.length}")
println("e=$e,e.length=${e.length}")
println("f=$f,f.length=${f.length}")
println("g=$g,g.length=${g.length}")
}
//输出结果
a=3.23,a.length=4
b=003.23,b.length=6
d=00003,d.length=5
e=3 ,e.length=5
f=小花 ,f.length=5
g= 小花,g.length=5
10、面向对象编程
Java编程的基础主要是使用class关键字构造被成为引用类型的数据类型。这种编程风格被称为:面向对象编程,因为它的核心概念是对象,即保存了某个数据类型的值的实体。
抽象数据类型(ADT)是一种能够对使用者隐藏数据表示的数据类型。
对象是能够承载数据类型的值的实体。
11、new一个对象都发生了什么?
- 为新的对象分配内存空间;
- 调用构造函数初始化对象中的值;
- 返回该对象的一个引用。
public class TestA {
private String name;//name和age被称为实例变量
private int age;
}
/**
* TestA testA= ----将对象的引用赋值给变量testA
* new TestA() ----实现上面说的三点
*/
TestA testA=new TestA();
12、静态和非静态方法的区别?
静态方法的主要作用是实现函数,非静态方法的主要作用是实现数据类型的操作。
13、对象的内存管理
对于原始数据类型,Java会在声明变量的时候为它们预留内存空间,当它们离开作用域的时候释放这些空间。
对象,离开作用域或者没有被变量引用的时候,就会变成孤儿,等着垃圾回收。
14、final关键字的缺点
- 需要为每个值创建一个新的对象。
- 能保证原始数据类型不被改变,但是引用类型,只能保证引用的对象不会被改变,但是对象的值本身可以被改变。
15、Java指针
在Java中创建指针引用的方式只有一种(new),且改变引用的方法也只有一种(赋值语句)。
在编程语言的行话中,Java的引用被称为安全指针,因为Java能保证每个引用都能指向某种类型的对象(而且它能找出无用的对象并进行回收。)
Java中实现引用的方式除了使用指针外,另一种使用则可能是句柄(指针的指针)。前者访问数据的速度更快,后者能更好的实现垃圾回收。
本文章的大部门内容来之于由Robert Sedgewick和Kevin Wayne著的《算法》第四版书籍中,本文章的目的主要是为了记录自己的学习笔记和技术分享。