学了Java 你未必知道这些

作为一个正奔跑向编程完美天堂的朝圣者,本人觉得在平常的编程中,应该要做到以下几点:

    一:汝应注释,这样做既方便别人,也方便自己去读懂代码的逻辑

    二:注重细节,为自己写的每行代码负责,比如,在并发编程的过程中,应该给那些可变的共享单元加“同步锁”或把可变的共享变量的粒度降到每个线程的级别

    三:注重效率,由于本人的学校比较重视算法这一块,于是不知不觉中就对程序执行效率这一块比较执着,假如你和你的同事们都写了一个相同功能的程序,然后老板给你们                  各100万条数据,你的同事的程序很快就把这100万条数据执行完了,然后去喝了杯咖啡,回来时如果你的代码还在跑,这不是......(后面的话你们都懂的)

    四:注重代码的整洁性和尽力让代码的冗余降到最低,这在代码的重构上是要注意的地方。

  后续本人会写一些本人读到的比较好的算法例子,读这些例子有利于我们思维活跃开来,当然,相信你也会像本人一样为这些算法解法的巧妙性而啧啧称奇,以致使自己在以后的编程中更加注重这一块,这些例子大家以后可以查看这个网址 http://www.cnblogs.com/wanggangjia/来看看(后续会补上这些算法序列)
  好吧!前菜已了,正餐现在来了

1.请你完善下列函数来实现这个功能:交换下面例子中A、B的值 

1 public class TestAdd {
2     public static void main(String[] args) {
3            int A = 100;
4            int B = 10;
5            .....   //在这里写下你的代码,使A,B的值交换
6            System.out.println("A:" + A + "\t" + "B:" + B);  //输出  A:10   B:100
7 }
8
9 }

    (1)大多数的我们都会定义一个临时变量temp,然后就如下面代码一样

int temp = A;
A = B;
B = temp;

    (2)又有人会说,定义一个变量多奢侈啊!看我的

A = A + B;
B = A - B;
A = A - B;

    (3)这确实比(1)解法好了一点,但我们知道系统处理数据最快的是位操作,我们能不能从这方面下手使我们的程序更快呢?而且,把A+B赋值给A可能会产生越界,这不是不安全吗?那怎么办才能兼顾安全、快速、简洁呢?看码如下(采用“异或”操作符):

A = A ^ B;
B = A ^ B;
A = A ^ B;

说明:异或运算是按照二进制位进行异或运算的,这个运算是最低级的CPU位运算,运行速度快,而且不会产生进位。

拓展:位操作符由于它们具有运行速度快的特点(思考一下它们快的原因),所以经常被使用,特别是“>>”或“<<”位运算符,这点读者可以看看jdk中有关hashcode这一块的源码

拓展例子:编程实现2 * 8,直接给码如下:

2<<3;  //假设每个变量的存储是8位,则2的二进制是0000 0010,向左偏移3位后,可得0001 0000,转换成十进制为16,不就是2 * 8,数3是因为2的3次方为8

  2.这条语句:float i = 3.3;能编译通过吗?

float i = 3.3;不能通过编译,因为常数 3.3 Java默认是double类型,而float类型的范围是比double小的,把3.3赋值给i 是向下转型,会损失精度,如果真的需要赋值给i,需强制转型float i = (float)3.3;

拓展:short i = 1,i = i + 1;这也是不能通过编译的,因为Java默认常数1位int类型,理由同上,但是short i = 1,i += 1;却是可以的,这是因为jdk在编译的时候,会隐式的将类型强制转换成i = (short)(i + 1);

  3.Java中int类型和Integer类型有什么区别?

首先,int类型是Java的基本数据类型,而Integer是一个对象,是一个引用,它们在内存逻辑就不同,关于内存逻辑,可以看看本人所写的“一个大三学生的学习之悟”这篇文章,下面给出这两个类型的内存结构,既然Integer是一个对象,那么它相对于int这基本类型来说就有很多额外的方法,具体可自查Java的API,要特别说明的是:在jdk1.5引入了“自动拆箱和装箱”,使得基本数据类型和其对应的封装对象能够隐式的转换。

综合例子:涵盖的知识点包括自动装箱和拆箱、内存结构分析、自动装箱和拆箱背后的类似“对象池”的思想

 1 public class BoxingTest {
 2     public static void main(String[] args) {
 3           Integer i = new Integer(300);
 4           Integer j = 300;  //自动装箱,内部机制是调用Integer的valueOf(int)方法
 5           int z = 300;
 6           System.out.println(i == j);  //false  因为它们的内存地址不同
 7           System.out.println(z == j); //true  因为j自动拆箱,内部机制是调用Integer的intValue()方法,它们比较的都是数值300
 8     }
 9
10 }

读到这里,如果你没有一种去读Integer的valueOf(int)方法的源码的冲动,那么你将失去挺多东西的,因为它里面包含着Java在性能优化的一些蛛丝马迹,算了,我还是讲讲吧!如果你没有去看这个方法的源码,相信把下面这道题完全做对的应该不太可能,先炫代码:

 1 public class ValueOfTest {   //使用驼峰形式命名
 2
 3       public static void main(String[] args) {
 4              Integer i = 50;
 5              Integer j = 50;
 6              Integer x = 200;
 7              Integer y = 200;
 8
 9              System.out.println(i == j);  //true
10              System.out.println(x == y); //false
11        }
12
13 }

分析如下:

1  public static Integer valueOf(int i) {   //注意这里是静态方法,隶属于类,所以可以直接使用 “Integer.方法名” 来调用该方法
2
3          if (i >= IntegerCache.low && i <= IntegerCache.high)  //这里的IntegerCache.low默认值为-128   IntegerCache.high默认值为127
4              return IntegerCache.cache[i + (-IntegerCache.low)];  //这些Integer对象,默认范围在[-128~127],已经被创建,被放在常量池里
5
6          return new Integer(i);
7
8     }

由于Java的操作不外乎是创建对象---使用对象----销毁(回收)对象,因为创建对象比较耗时间,损失了系统的性能,所以我们一般都会在程序开始时对一些比较耗时但在我们的程序又经常使用的对象先会初始化一些实例,对象池的对象是如此,线程池的线程是如此,数据库连接池的Connection对象也是如此,供我们在程序中调用,以达到对象的重用及快速引用,这是优化程序功能的一个方法。好吧!回归本题,范围在[-128~127]的Integer对象已经被初始化在常量池里了,所以在这区间的Integer对象创建时都会指向常量池中相对应的对象,这也是上面代码中为什么第一个输出为true的原因,在这个范围之外的,它会自己创建一个Integer对象,所以根据内存逻辑可知它们并不相等,所以为false

  其实,有空读读Java源代码也是有好处的,在这里,本人只是希望编程者们在平常的代码编辑中,要时刻注重自己程序的安全性、代码运行的效率性及项目的性能的优化等等

时间: 2024-12-09 19:13:20

学了Java 你未必知道这些的相关文章

每天进步一点点-实例为导学-一个java对象序列化的例子

序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中.这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构).而反序列的过

学习Spring必学的Java基础知识(2)----动态代理

学习Spring必学的Java基础知识(2)----动态代理 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www

为什么你学不好java!请你好好思考下,你真的有这么弱吗?

java难学? java难学!是的,没有错!如果java这么简单容易,你觉得还会有它的市场价值吗? 我英语差.我学历低.我理解能力差,能战胜它吗? 整天遇到困难就逃避的人,学什么都学不好!还没有开始就否定自己,大清都亡了,只有天才一出生啥都会的! 做什么事必须要在它的身上付出,你付出的多回报就越丰厚!没有任何人的成功不是不通过自己的努力! 只要下定决心,给自己定个目标,要怎么开始学.每天学习多久.花多久的时间学会!你问问自己你就甘心在这个社会没 有一技之长,就甘心别人的一月的薪资是你一整年的收入

Java是什么?学了Java我们能干什么?

Java是什么?学了Java我们能干什么? 笔者现在大概简单介绍下Java前世今生.Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.Java一共推出了三个版本,其分别是:JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)JavaEE(J2EE)(Java 2 Platform,Enterprise

那些年,一起学的Java 8-4

import java.awt.BorderLayout; import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import j

学完Java基础的后感

  今天,截止到文章发表,第一本的Java基础已经全部学完了,我学完后给我最直观的感觉就是听得挺明白.应该在什么时候用什么语法.语法与语法之间怎么嵌套,反正这乱七八糟的吧.可是还是掌握的不够牢固,还有好多的延伸不知道,肯定就是还不够用功.每章都听得挺明白,课后作业也都写的不是很吃力.现在写项目就有些混乱了,把这些结构语法凑在一起,逻辑上就吃力了.没有逻辑在Java是很恐怖的!!知道代码不会用!   写的挺乱的,也是我第一次写,我总结就是逻辑还不清晰.第一篇博客就到这吧.

怎样才能一步步学透java

三人行必有我师,人生是需要不断学习的,在这里我们相遇就是缘分,希望各位可以看完这篇文章,也欢迎大家在下面留言讨论,天冷了,也动动手指转发收藏一下,谢谢大家! 我们都知道,java在桌面应用方面并不是很擅长,所以做java最后大致是两个方向,web企业级开发(JavaWeb J2EE)和手机android开发. 一般从事Java的开发人员都会从J2SE开始学习,因此对于J2SE的掌握必须要牢固. 1.HTML+CSS+DIV,前端会用到,作为研发人员至少应该会简单写些页面出来. 2.JAVASCR

橙色优学:Java编程怎么提升技术,Java编程思维至关重要

橙色优学了解做为程序员,一旦进入技术行列,就开启了持续学习的道路,更迭迅速的互联网时代,技术自然也是一代一代的更新,在技术进阶的道路上,要不断吸收新的想法和技术知识. 牛逼的人总是让人羡慕,但如何才能让自己成为牛逼的人对我们来说更重要,本文分享的是如何才能成为java高级程序员,你和java高级程序员只差这一篇鸡汤!干了这碗鸡汤,未来不可限量! 1.离开舒适区,提高个人代码能力 不安于现状,高级程序员一般都具有丰富的项目经验,经验是能力最好的试金石,即使在碰到未知的问题,丰富的项目经验也不会让你

java小游戏捕鱼达人,来学做java小游戏!

Java小项目捕鱼达人 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 捕鱼达人这款游戏,相信和我年纪相仿的朋友,肯定很熟悉.在当时半智能手机和智能手机刚刚出现的时代,手机里有捕鱼达人,汤姆猫,植物大战僵尸等小游戏,是很值得炫耀的,在村里那可是备受小朋友欢迎的.这篇文章来分享一下这款我当时很喜欢玩的捕鱼达人,但是要知道哦,捕鱼达人可是有一点赌博性质的,特别是游戏厅里的,大家可不能沉迷哦!先上图:这个java小游戏,虽然没有很多炫酷的特效和复杂的机制,但是作