ITPub博客

首页 > 应用开发 > Java > 程序设计的一些原理

程序设计的一些原理

Java 作者:爆seed 时间:2016-06-20 15:29:15 0 删除 编辑

一: 自曾自减原理

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的时候,右边不参加运算

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


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


单与还有一个作用在位运算(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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29917475/viewspace-2120495/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 正则表达式详解
请登录后发表评论 登录
全部评论

注册时间:2014-09-26

  • 博文量
    28
  • 访问量
    34439