论坛首页 入门技术论坛

高手问答:Java老A带你全面提升Java单兵作战能力!

浏览 34463 次
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2014-09-18  
Netpet_11 写道
拜读样章中


谢谢您的支持,如果您有什么问题的话,可以与我联系。
0 请登录后投票
   发表时间:2014-09-18  
xfei6868 写道
将其他进制的数据转换为十进制数据,使用 Integer.parseInt(String,int)、Integer.
valueOf(String,int)来完成,其中第二个参数传入的就是字符串数据。例如:
Integer.valueOf("10",16)返回的值就是 16,Integer.valueOf("10",16)返回的值是 2,这
样就可以实现任意进制之间的转换了。long 也提供了类似的方法

这地方描述错误了。



感谢您提出的问题,这个问题在文章的勘误中已经说明,如果会第二次印刷,会在第二次印刷时全部修复掉,勘误页是:http://blog.csdn.net/xieyuooo/article/details/39339997
0 请登录后投票
   发表时间:2014-09-18  
写书赚钱了
0 请登录后投票
   发表时间:2014-09-18  
empireghost 写道
本书有点类似 《java pitfall》 ,其中的字符串String  Integer的 == equals等问题就像java的一些漏洞似的,这些只有熟悉低层jvm的才会知道,其中包括编译优化等话题。

但从另一个方面,如果了解了java的equals 的本质,使用时候,遵循原则,比较的时候始终使用equals方法,就不会出问题。

当然通过本书多了解一些这样的”内幕“更好



谢谢您的评价,很到位,从我的初衷来讲对象的比较和equals是作为本书话题引入的入口,目的是希望我们可以在一些问题上有更多的探讨,因为类似String的用法上,我们只需要记住一个结论,大多数人其实无需关注过多,只不过我们会养成一种探究问题的习惯和方法,因为我所遇到的问题以及我需要去研究的东西往往和大家是不同的。
0 请登录后投票
   发表时间:2014-09-18  
作为非专业的java程序员,偶尔客串一下,对java中类库不是很熟悉,每次第一次使用都要查一会,比如正则表达式的库,有什么方法可以加速自己对类库的熟悉程度吗?
我这种初级水平的要不要看下 java核心编程 第二卷啊?
public class LockThread implements Runnable{
    Object AAA = new Object();
    Object BBB = new Object();
    public int flag = 0;
    public static void main(String[] args){
        LockThread test1=new LockThread();
        LockThread test2=new LockThread();
        test1.flag = 1;
        test2.flag = 0;
        Thread t1= new Thread(test1);
        Thread t2= new Thread(test2);
        t1.start();
        t2.start();
    }
    public void run(){
        System.out.println("flag=="+flag);
        if (flag==1){
            synchronized(AAA){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(BBB){
                    System.out.println("flag=1 is running ");
                }
            }
        }
        if (flag==0){
            synchronized(BBB){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(AAA){
                    System.out.println("flag=0 is running ");
                }
            }  
        }
    }
}
当flag=1的时候锁住AAA,等待BBB解锁;反之也会成立。为啥代码没有死锁呢?
0 请登录后投票
   发表时间:2014-09-18  
LinApex 写道
看完了,建议将 沉淀,累积,单独整理成一个章节。如何分类,有哪些知识点,沉淀技术分几级等等。

技术的话,只要能够静心下来,去研究,去发现,那是极好的。但是最终还是为了能够解决问题,解决公司的问题,解决自己的工作问题,解决房子,车子的问题。要不然做学术研究是养不活自己的。

技术首先能看懂,然后能用,然后优化,最后才是原理。一步步深入,以点破面就很好。技术不钻牛角。

作者将知识点整理出来,感谢作者。最好多出些小实例,方便记忆与理解。以demo说话。

看了作者的个人说明,知道了作者懂很多东西,我有几个问题。
1.java如何做快速开发
2.你如何看待快速开发平台这一系列产品
3.异构系统权限交互



感谢您的理解,我大部分初衷确实如此,其实不是以讲解知识为重点,而是通过说一个点带面,让我们形成一种探讨问题的习惯和方法,让我们理解很多东西并不是我们表面上看到的那样,可以让我们提前预知到很多坑,以及为什么。

关于你的问题,上册不会提到,因为上册都是探讨一些技术的点,只是我认为一个Java程序员的基础应该去学习的方向,有些阐述我也未必到位,未必正确,不过大家都在不断学习和进步。下册会有一些介绍,但没有专门的快速开发相关的书籍。

其实就快速开发本身来讲,要看你做什么样的东西,或者你的目标是什么,短期和长期目标是什么。如果仅仅是为了快速迭代,有问题解决问题,有功能就往上堆的方式,这个怎么做都能快,而且不用选Java,因为Java搞环境麻烦。还有要看你是想以项目做还是做一个相对长远的产品规划,某些点上的慢可能会导致整体上的快,快不一定是好事,快中求到稳、准、狠的才是高手。给别人演示原型系统可以做到快,说明我们又能力开发并按期完成。但是真正的产品该快的地方要快,该慢的要慢,尤其是在思考一些方向和抽象功能模型、代码模型的时候最好有点思考的余地(如果业务较为简单除外)。

在单个模块的开发上,其实配合开发是最快的,Java的开发通常要么按照模块,一个人从前到后搞到底,要么是一个人与业务相关的处理,一个人处理交互,一个人处理数据,可能会有一些合并或更多复杂的情况,后面这种情况十分适合敏捷开发,因为相互配合,专注与自己的代码,可以让这层次代码风格统一,而且在编写过程中思路单一,如果几个人配合较好,一个普通的业务,花一点点的时间稍微商量下就可以快速开发出来,而一个人搞模块会不断切换思维做交互、业务、数据等方面的事情,因为每一项处理的思维方式和所使用到的技术手段都有所区别,并且各个模块之间的开发者有复用关系很难沟通到位,除非上面还有一个更高级别的程序员统一控制这个事情。

我说的开发方式似乎可以,不过也未必哈,这样开发的前提是这些人相互之间配合有一种默契,并且能力相当,还有一个更为重要的条件是大家对相关的业务也了解不错,如果要去完成一种新的复杂业务或核心代码的编写,这个是有一个强依赖关系的。在这个时候其它开发人员不希望强依赖,可以先基于接口或单独的方法返回一些常量用以代码运行,这个常量的对象格式可以预先预定,就像定义接口的输入输出那样,在核心代码开发OK后,就可以将接口的实现类动态接入了(刚开始就是写个default就可以)。写一层写久了开发人员也烦,觉得自己较为狭小,还得考虑他们的个人发展,从点和面上都要考虑下,不然他们没成长跑掉一个,新找来一个人这种默契配合是很难养成的。

快速开发平台,所谓平台最后会做成一个功能堆叠区,这种就是按照功能分的,什么人都可以上来开发,但是各种各样的诡异都会有,虽然依赖性可能不会那么强。功能没有抽象的话,说他是平台是好听的说法,不好听连产品也算不上,呵呵,因为没有明确的定位和方向,举个软件的例子,MySQL、Oracle它本身就是一款软件,它的目的很清楚就是为了数据库存储,它在为这个努力,不论有多少功能,你可以看他没有重复类似的东西,会让你感觉整体这个产品功能比较清晰,虽然很复杂。你要生产一个电脑也是这样,电脑也是一个产品,它里面的主板、CPU、内存各方面可以迭代升级,但是是有规划的,也是有清晰目标的,它也会开发周边插口,用以外部支持,就像10年前应该没啥USB口,后来USB大量使用,新的电脑都会有USB口,但是老的电脑不会去钻个孔去搞个USB扣,也不会在主板上面去焊一个线路去对接一个线路。外部的系统你可以来接入通信,不过满足通信规范,如果不满足,我可以生产一个转换口来转换,但是这个转换口绝对不是产品的发展主体,当这个转换口成为日常习惯,就会考虑将这个口子直接放在主板上。纵观JVM的许多发展集成越来越多的功能,版本升级也是类似的。

当然,当项目做和当产品做是完全不同的,行业产品也会跟着本地需求走,但如果被牵着鼻子走,就只是卖人力了。但是,很多未知领域其实并没有行业规范也不知道它会朝着什么方向去发展的时候,其实我们很难将它产品化,因为刚开始大家都不知道会把它做成什么样子,这个时候就必须要有“炮灰”,大家可能会根据自己的理解去尝试,可能有很多尝试最终有一个是被认可的,这就是一些新东西,这在很多互联网行业比较多。

至于异构系统的权限,这个其实和权限都没多少关系,只要是异构系统对接都会遇到问题,这就像俄罗斯方块的裂缝,和上面提到的产品类似,如果这些系统都是一家公司做的,这些方块可以有统一的规范接口,就不存在这样的问题(当然不排除一家公司内部也各搞各的,因为谁也不愿意去等谁做完再自己去做事情),如果是与别人对接要看你本身的地位,一般来讲是依赖对方的权限去接入(除非对方公司没有IT系统),你的产品如果定位足够明确,那么就应该有一套产品级别的权限控制,当然要足够灵活,满足行业需要,当去与别人对接的时候,其实就是生产转换口的过程。首先自己的权限要足够灵活除了配置化、层级化、继承性、个性化都要考虑外,还需要考虑权限的对象模型,通俗一点讲就是权限的属性和关系有那些,这些属性和关系要足以满足某个行业内灵活的权限架构,当这个抽象得足够好,对方的权限的管理的数据提取的时候,就是考虑如何将对方的模型转换为自己的模型,属性之间的映射关系,可以为它去专门写个适配器,将对象转换过来后转入自己的系统进行处理。

不过你要考虑到对方的数据可能不全或更多的情况,这两者都体现了你个人对于领域的理解和抽象是否灵活,如果做得足够好,如果对方数据不足以填充你的数据结构,要么是有默认值,要么就是降级服务达到目的(或者说它本身不需要,那么我不支持就好了)。如果它有更多的权限要求,就需要重新审该业务领域的视权限管理出现了一些新的变种如何灵活的融入到现有的产品中。

其实不论是权限还是其它数据都是类似的,中间的转换口是可以单独做单元测试的,只要转换口程序OK,产品是稳定的,就无需有几百人的叫唤式的大调试。不过我说得比较理想,现实往往会比较残酷,一般做软件外包的公司为了拿到项目刚开始什么都会愿意去做的,呵呵,扯得有点多,但是这个话题还没有真正展开,有很多是在做的过程中不断摸索出来的。








0 请登录后投票
   发表时间:2014-09-18  
songbgi 写道
写书赚钱了



呵呵,说实话要为了赚钱不会来写书,可以网上搜下具体情况,写书的初衷在我的博客中有的,写书本身是一件很闹心的事情,我平时工作也很忙,坚持了1年多晚上10点下班后回家写到凌晨后睡觉,具体凌晨几点看情况,周末也没咋休息过,不
过总体上要说钱是没啥的,根据网上的说法你也可以自己算算,呵呵!当初几次想要放弃,只是我这个人有个习惯,决定了要做的事情,就从来没放弃过,最终还是出来了,出来后并没有在公司大肆宣传,只是在博客上写了篇文章,这次宣传是出版社的同学帮忙的,我很感谢,因为我不希望大家没了解这本书的意图和水平就买了觉得白花钱,前言、样章内容均有,我的博客中还会有部分第3章的手稿,均可参考后再说是否需要花钱去买。我也不希望大家去花冤枉钱,最后我被千夫所指,呵呵!
0 请登录后投票
   发表时间:2014-09-18  
看了大神的文章,我有很多想說的,但是話到嘴邊,好像又沒有什麽說的。技術積累是一個漫長的過程,需要忍受孤獨跟寂寞,有時候可能還難以讓家人理解。尤其是在積累還沒有希望的階段,是放棄 還是繼續,搖擺不定。

身邊的朋友很多都從最開始的java轉行了,究其原因,都說java的面太廣,學習的能力跟精力有限  作為一個奮鬥在小城市小公司的java人員來說 夢想與現實差距太大  技術是為產品服務的  公司的產品又沒有太多的技術含量   很多的東西都難以理解跟深入   我們的路該怎麼走?

大神,你一路走來的心裡路程是什麽樣的,你覺得你現在的狀態是你的理想狀態么?
0 请登录后投票
   发表时间:2014-09-18  
liuyongchong 写道
作为非专业的java程序员,偶尔客串一下,对java中类库不是很熟悉,每次第一次使用都要查一会,比如正则表达式的库,有什么方法可以加速自己对类库的熟悉程度吗?
我这种初级水平的要不要看下 java核心编程 第二卷啊?
public class LockThread implements Runnable{
    Object AAA = new Object();
    Object BBB = new Object();
    public int flag = 0;
    public static void main(String[] args){
        LockThread test1=new LockThread();
        LockThread test2=new LockThread();
        test1.flag = 1;
        test2.flag = 0;
        Thread t1= new Thread(test1);
        Thread t2= new Thread(test2);
        t1.start();
        t2.start();
    }
    public void run(){
        System.out.println("flag=="+flag);
        if (flag==1){
            synchronized(AAA){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(BBB){
                    System.out.println("flag=1 is running ");
                }
            }
        }
        if (flag==0){
            synchronized(BBB){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(AAA){
                    System.out.println("flag=0 is running ");
                }
            }  
        }
    }
}
当flag=1的时候锁住AAA,等待BBB解锁;反之也会成立。为啥代码没有死锁呢?



你的问题应该是两个,我随口说下,您看下能否帮助你:
1、作为非专业的java程序员,偶尔客串一下,对java中类库不是很熟悉,每次第一次使用都要查一会,比如正则表达式的库,有什么方法可以加速自己对类库的熟悉程度吗?

非Java按专业程序员我不是很清楚具体的专业,和从事的工作,Java的类库其实靠记忆是背诵不全的,程序员要那么好的记忆就去搞别的了,有文档、API、有习惯去学习和深入的方法才是最重要的,而类库是常用不常用的问题,对于Java本身的一些基本类要知道大概写有和没有,其次就是和你从事的工作有关系,说到正则表达式,我也基本用之前会看看,因为我很少干没有把握的事情,除非这件事情谁也没干过。而且不仅如此,我如果很长时间没有用正则,还会先写几个小程序测试下或者拿我以前写过的小程序再跑下理解下,再做事情。这并非浪费时间,而是让我更加了解我所做的事情该怎么做才是正确的而且没有坑的。而且我的工作很多地方会和文本处理相关,也不会说天天都用正则,总而言之,程序员不是在拼记忆力,也不是谁记忆的东西谁就是高手,看问题的深入、广度一般是衡量标准的重要指标,不过不是绝对衡量一个人的水平。


你的代码是要测试死锁是吧,这个代码有点,不过如果你仅仅想把它死锁掉,你可以将:
    Object AAA = new Object();
    Object BBB = new Object();
改成:
  static  Object AAA = new Object();
  static  Object BBB = new Object();

应该就能得到你要的效果。

为啥,非static类型的是归属对象所有,你定义的两个对象中(test1、test2中),虽然两个属性都叫AAA或BBB,但是在AAA在test1、test2两个对象中分别会占用两块不同的空间,BBB也是类似,这个主要是对象空间的理解问题上。

为啥空间一样了就能锁住了,要知道synchronized的道理,synchronized在JVM改变过程中会有很多细节的操作,不过它的目的始终是在对象的头部上打上一个标记,或改掉一些东西。两个线程只有同时去对一样的对象空间头部打标记才会出现锁征用和死锁的问题,如果是完全不同的空间,是不会征用问题。



0 请登录后投票
   发表时间:2014-09-18  
xieyuNL 写道
liuyongchong 写道
作为非专业的java程序员,偶尔客串一下,对java中类库不是很熟悉,每次第一次使用都要查一会,比如正则表达式的库,有什么方法可以加速自己对类库的熟悉程度吗?
我这种初级水平的要不要看下 java核心编程 第二卷啊?
public class LockThread implements Runnable{
    Object AAA = new Object();
    Object BBB = new Object();
    public int flag = 0;
    public static void main(String[] args){
        LockThread test1=new LockThread();
        LockThread test2=new LockThread();
        test1.flag = 1;
        test2.flag = 0;
        Thread t1= new Thread(test1);
        Thread t2= new Thread(test2);
        t1.start();
        t2.start();
    }
    public void run(){
        System.out.println("flag=="+flag);
        if (flag==1){
            synchronized(AAA){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(BBB){
                    System.out.println("flag=1 is running ");
                }
            }
        }
        if (flag==0){
            synchronized(BBB){
                try{
                    Thread.sleep(100);
                }catch(InterruptedException e){
                    
                }
                synchronized(AAA){
                    System.out.println("flag=0 is running ");
                }
            }  
        }
    }
}
当flag=1的时候锁住AAA,等待BBB解锁;反之也会成立。为啥代码没有死锁呢?



你的问题应该是两个,我随口说下,您看下能否帮助你:
1、作为非专业的java程序员,偶尔客串一下,对java中类库不是很熟悉,每次第一次使用都要查一会,比如正则表达式的库,有什么方法可以加速自己对类库的熟悉程度吗?

非Java按专业程序员我不是很清楚具体的专业,和从事的工作,Java的类库其实靠记忆是背诵不全的,程序员要那么好的记忆就去搞别的了,有文档、API、有习惯去学习和深入的方法才是最重要的,而类库是常用不常用的问题,对于Java本身的一些基本类要知道大概写有和没有,其次就是和你从事的工作有关系,说到正则表达式,我也基本用之前会看看,因为我很少干没有把握的事情,除非这件事情谁也没干过。而且不仅如此,我如果很长时间没有用正则,还会先写几个小程序测试下或者拿我以前写过的小程序再跑下理解下,再做事情。这并非浪费时间,而是让我更加了解我所做的事情该怎么做才是正确的而且没有坑的。而且我的工作很多地方会和文本处理相关,也不会说天天都用正则,总而言之,程序员不是在拼记忆力,也不是谁记忆的东西谁就是高手,看问题的深入、广度一般是衡量标准的重要指标,不过不是绝对衡量一个人的水平。


你的代码是要测试死锁是吧,这个代码有点,不过如果你仅仅想把它死锁掉,你可以将:
    Object AAA = new Object();
    Object BBB = new Object();
改成:
  static  Object AAA = new Object();
  static  Object BBB = new Object();

应该就能得到你要的效果。

为啥,非static类型的是归属对象所有,你定义的两个对象中(test1、test2中),虽然两个属性都叫AAA或BBB,但是在AAA在test1、test2两个对象中分别会占用两块不同的空间,BBB也是类似,这个主要是对象空间的理解问题上。

为啥空间一样了就能锁住了,要知道synchronized的道理,synchronized在JVM改变过程中会有很多细节的操作,不过它的目的始终是在对象的头部上打上一个标记,或改掉一些东西。两个线程只有同时去对一样的对象空间头部打标记才会出现锁征用和死锁的问题,如果是完全不同的空间,是不会征用问题。


补充下,Java核心技术卷,不要认为下卷就比上卷牛逼,就上小说的上下册一样,故事有起伏跌宕,当时未必下册就一定更加深入,上下册只是在说不同的Java技术点,核心技术卷更多是在讲解使用和API,还有类图,demo之类的,是教材的升级和扩展,至于它说的核心,还不是特别核心。


0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics