且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

程序设计的一些原理

更新时间:2022-09-22 17:12:05

一: 自曾自减原理

1
2
3
4
5
6
7
class VarDemo  {
public static void main(String[] args) {
int x = 30;
x = x++;
System.out.println(x);
}
}


结果: 30


内存中计算实现的过程

temp = x     => temp =30

x = x + 1    => x = 31

x = temp     => x =30


注: 第一步编译器发现是 x++;所以会把x先转到temp临时内存中,然后x++实现了x=31, 然后将x++赋值给x, x=temp



换成

x = ++x


内存中实现过程是:

x= x + 1  x => 31

x = x    x => 31




二: 自动转换数据类型和强制转换类型

byte x = 30;

x = x +4;


以上会报错,解释:

第一步:

byte x =30;实现的过程是,将int型的30赋值给byte类型的时候,java编译器底层会做,强制转换,(如果int型的整数能放入byte类型的话)将30转换成为byte类型(否则报错),在赋值给byte类型的变量x。

第二步:

x是byte类型 + int类型的4,因为x是变量,底层无法判断x+4是否能正确的转换到byte类型,所以报错

E:\java3200\day002>javac VarDemo2.java

VarDemo2.java:4: 错误: 可能损失精度

                x = x +4;

                      ^

  需要: byte

  找到:    int

1 个错误


但可以强制进行转换:

x = (byte)(x +4);



三:x+=5; 是否等于 x = x+5


解答:

byte x = 30;

x+=5;

以上不会报错,以上只有赋值一个步骤。


byte x = 30;

x = x +5;

这个会报错,报错的原因就是第二种情况,类型自动转换不了!以上有先计算x+5 在赋值的两个步骤




四: 双与和单与的区别(java中)


&& 

&

两种的区别是,逻辑运算的结果一样,但是过程不一样


&& 当左边的执行结果为false的时候,右边不参加运算

& 无论左边为何结果,右边都会运算


综合以上,&&的效率更高,但是有时候要得到与结果,接右边一定要参加运算的情况,要使用单与


单与还有一个作用在位运算(6&3)结果 2

0000-0000 0000-0000 0000-0000 0000-0010





五: 两个变量的交换

两个变量之间数值的交换


如:

a = 5

b = 9


方法一:采用第三个临时变量

t = a

a = b

b = t


开发的时候,是使用这种方法,因为阅读性强,且临时空间的开辟不会对性能造成很大的影响!

方法二:不采用第三个临时变量

a = a + b

b = a -b

a = a - b


这种方法: 可能回超出int型的取值范围,会强制转换,数据就会变。且阅读性差,常用于面试题


方法三: 异或的方法

a = a ^ b    ; a = 5 ^ 9

b = a ^ b    ; b = (5 ^ 9)^9

a = a ^ b    ; a = (5^9)^5


原理: 就是一个数异或一个两次,还是原来的值



六:三目运算的应用

//获取两个数的最大数

max = a>b?a:b

//获取三个数的最大值

int temp = o>p?o:p

int max = temp>q?temp:q



七:一条语句的代码块可以省略{},在流程控制中,什么叫一条语句呢?

1
2
3
4
5
if (score >=90) {
    if (score >=95) {
        System.out.println("very very good");
    }
}



可以省略成:

1
2
3
if (score >=90
    if (score >=95
        System.out.println("very very good");


因为: 相对if(score >90) 而言

1
2
    if (score >=95
        System.out.println("very very good");

是一个条件语句。


相对if (score >90)而言 

1
System.out.println("very very good");

是一条语句



八:代码块的用途:

1
2
3
4
5
6
{
    int a=1
    a=a+1;
    //代码块内的运算,可以定义变量的生命周期,作用域值只在这个代码块内
    System.out.println(a);
}


代码块可以优化性能,将一些运算放置在代码块内,可以节省内存空间,因为代码块内的变量,运算结束后就消失,被回收。作用范围决定的。 JVM内存有限,代码劣质可能会造成内存溢出。



九:Switch中的执行过程和顺序


不常规的写法,分析过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class SwitchDemo {
    public static void main(String[] args) {
        int x =4;
        switch (x) {
            default:
                System.out.println("d");
                // break;
            case 1:
                System.out.println("a");
                // break;
            case 2:
                System.out.println("b");
                break;
            case 3:
                System.out.println("c");
                   break;
        }
    }
}


执行结果是:

d

a

b


原因:

case 和default两个无序,在内存中一定是先执行case,在执行defaul。x=4 先执行case 不配 1 2 3

所以执行default,打印输出"d",因为没有break跳出switch,所以往下执行,因为已经匹配了default,就不用再去判断是否匹配case中的表达式,所以打印"a", "b",然后遇到break,跳出循环。


注意: 默认的靠近下面花括号的那个case或者default可以省略break的,这样即使都不写break也不会死循环,保证了一定存在break


 


十: while和for的区别

共同点,都是循环,while等做的for也能做,for能实现的,while也能实现,但是两者还是有区别的。


看以下代码,执行会出错

int x =1;

while(x<3) {

System.out.println("x="+x);

x++;

}


System.out.println(x);


for(int y=1;y<3;y++) {

System.out.println("y="+y);


}

System.out.println(y);



原因: for语句中的变量作用域只在for语句中,当for循环完毕后,所有变量都在内存中被销毁。所以只针对循环而言,for的循环对程序节省内存开销。




十一: 强类型和弱类型语言的区别

如: 强类型语言java C,数据类型都是分的比较细的,如整数分 byte short int long,任何数据都要定义类型。

如:弱类型语言python 对数据类型就没那么细微,整数就是整数类型,且定义变量不需要声明类型


函数方面的区别(java ,python)对比

java 中函数可以嵌套调用,但是不能嵌套定义,如mian主函数中,不能定义其他函数,只能调用其他函数,因为java中的函数都是在类当中的,所以函数之间只能存在"兄弟"级别。

python中函数可以嵌套定义,如装饰器中



java中即使是一个函数,也要定义返回的数据类型,即定义函数的时候,指定这函数的类型,即使没有函数没有返回值,也要定义函数的类型为void类型(不带返回值的类型),main主函数就是一个void函数类型。


python中return就可以返回任何数据类型了,函数定义不需要指明类型




十二: 函数(方法)的重载

重载:

1.同一个类中

2.函数名相同

3.参数个数不同,或者参数类型不同

4.与返回值类型无关

5.java是严谨性的语言,如果存在调用异常,会编译失败


重载的实现:

java编译器会通过参数的不同,选择调用不同的函数(函数名相同的)


重载的优点:

方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。

如:

public static int add(int a, int b) {

return a +b;

}


public static double add(double a, double b) {

return a+b;

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1790660如需转载请自行联系原作者


cuizhiliang