算法-1-基础

目录

1、运算符

2、类型转换

3、break和continue语句

4、创建并初始化数组

5、起别名

6、递归的条件(代码是二分查找)

7、单元测试

8、API定义

9、格式化输出

10、面向对象编程

11、new一个对象都发生了什么?

12、静态和非静态方法的区别?

13、对象的内存管理

14、final关键字的缺点

15、Java指针


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、递归的条件(代码是二分查找)

  1. 方法的第一条语句总是一个包含return的条件语句。
  2. 递归调用总是去尝试解决一个规模更小的子问题。
  3. 递归调用的父问题和尝试解决的子问题之间不应该有交集。
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著的《算法》第四版书籍中,本文章的目的主要是为了记录自己的学习笔记和技术分享。

 

发布了82 篇原创文章 · 获赞 16 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_34589749/article/details/103973987