java吧 关注:1,253,078贴子:12,739,955

回复:【职场-技能系列の作死和不作死的区别,纪念当年的新手路】

取消只看楼主收藏回复

解答系列
&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长


55楼2014-12-24 15:36
收起回复
    short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
    对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。


    58楼2014-12-24 16:02
    收起回复
      char型变量中能不能存贮一个中文汉字?为什么?
      char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。


      60楼2014-12-24 16:37
      收起回复
        请说出作用域public,private,protected,以及不写时的区别
        这四个作用域的可见范围如下表所示。
        说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
        作用域 当前类 同一package 子孙类 其他package
        public √ √ √ √
        protected √ √ √ ×
        friendly √ √ × ×
        private √ × × ×
        备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。


        61楼2014-12-24 16:41
        收起回复
          不建议新手一开始就学习javaEE。
          java重要的是基础是否牢固。java面向对象编程思想是否掌握,RTTI,异常处理是否了解,泛型,容器类是否能够灵活运用,I/O,多线程是否熟悉,java虚拟机运行机制是否了解,高效的java代码如何编写,这些才是java中比较重要的,不要着急着去学习框架知识。
          在熟悉掌握java基础后,可以开始慢慢学习框架了。这个过程要同时学习一些设计模式,而不要只顾功能的实现,掌握框架很容易,理解框架就很难了。


          68楼2014-12-25 15:27
          收起回复
            为什么在 Java 的参数传递时,不用声明变量?
            1、首先,参数分为两种:实参 形参
            val1和val2作为形参在括号里已经声明了,只是还没赋值(赋值会在调用函数的时候进行,即实参赋值给形参)
            2、如果这么调用函数:
            int realVal1 = 1,realVal2 = 2;
            int maxVal = max(realVal1 ,realVal2);
            在上面具体的例子里return的值是赋值到maxVal 里的,如果直接调用max没有将返回值赋值到任何变量的话,那return的值就直接抛弃。


            70楼2014-12-25 15:33
            收起回复
              是学java web开发还是java EE企业级开发或者是转android?
              短期来看,Android 可能更好,是因为现在是处于需求大于供给的状态。
              不过楼主想从事 Java 开发,建议搞清以下内容,然后再选择。
              (1)J2SE
              JDK6 常用类库(lang包、util包、text包、io包等)
              泛型编程
              多线程编程
              Socket编程
              Awt/Swing/Swt中至少一个GUI库
              MVC和常见设计模式在 Java 中的运用
              以上为必需的。
              (2)Java Web 基础
              JSP/Servlet
              Servlet生命周期,工作原理
              EL 表达式
              JNDI
              JDBC
              想开发 Web,以上也算是必需的。
              (3)J2EE
              EJB、JTA 等等
              个人觉得不是必需的,可以简单了解,不用深入。
              因为 J2EE 令人讨厌的地方就在于此,对于大部分项目,不仅完全没有简化开发流程,反而变得特别繁琐和臃肿。
              (4)Java Web 框架
              SSH框架,Struts、Spring、Hibernate
              ORM框架,除了 Hibernate 外,最主要的就是 iBatis
              其他表现层框架,比如 JSF
              其中SSH是重点,基本 Java 大型网站都会去用。
              (5)Java 第三方类库
              这个太多了,随便列举几个,都是很常见的。
              用于日志的 log4j
              用于单元测试的 jUnit
              用于做报表的 jReport、JasperReport
              用于操作 Memcached 缓存的 spymemcached、xmemcached
              Web 中经常用到的 Apache 类库(common、io 等等)
              这个常见的尽量掌握。即使不会也没关系,因为他们都有很完善的文档。
              所以这部分最关键的能力是阅读他们的 DEMO 代码和读 API 文档。
              (6)Java for Android
              说到这里,基本上前面除了第一部分,其他的用处都不大。
              Android 的编程模型和传统的手机应用开发(比如 KVM 所用的 J2ME)差不多,游戏可能例外。
              主要是用好 Android SDK 和相关的帮助


              71楼2014-12-25 15:44
              收起回复


                72楼2014-12-25 15:50
                收起回复
                  初学多线程
                  一、线程概述
                  线程是程序运行的基本执行单元。当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来作为这个程序运行的入口点。因此,在操作系统中运行的任何程序都至少有一个主线程。
                  进程和线程是现代操作系统中两个必不可少的运行模型。在操作系统中可以有多个进程,这些进程包括系统进程(由操作系统内部建立的进程)和用户进程(由用户程序建立的进程);一个进程中可以有一个或多个线程。进程和进程之间不共享内存,也就是说系统中的进程是在各自独立的内存空间中运行的。而一个进程中的线可以共享系统分派给这个进程的内存空间。
                  线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。
                  注意:任何一个线程在建立时都会执行一个函数,这个函数叫做线程执行函数。也可以将这个函数看做线程的入口点(类似于程序中的main函数)。无论使用什么语言或技术来建立线程,都必须执行这个函数(这个函数的表现形式可能不一样,但都会有一个这样的函数)。如在Windows中用于建立线程的API函数CreateThread的第三个参数就是这个执行函数的指针。
                  在操作系统将进程分成多个线程后,这些线程可以在操作系统的管理下并发执行,从而大大提高了程序的运行效率。虽然线程的执行从宏观上看是多个线程同时执行,但实际上这只是操作系统的障眼法。由于一块CPU同时只能执行一条指令,因此,在拥有一块CPU的计算机上不可能同时执行两个任务。而操作系统为了能提高程序的运行效率,在一个线程空闲时会撤下这个线程,并且会让其他的线程来执行,这种方式叫做线程调度。我们之所以从表面上看是多个线程同时执行,是因为不同线程之间切换的时间非常短,而且在一般情况下切换非常频繁。假设我们有线程A和B.在运行时,可能是A执行了1毫秒后,切换到B后,B又执行了1毫秒,然后又切换到了A,A又执行1毫秒。由于1毫秒的时间对于普通人来说是很难感知的,因此,从表面看上去就象A和B同时执行一样,但实际上A和B是交替执行的。


                  73楼2014-12-25 16:01
                  收起回复
                    二、线程给我们带来的好处
                    如果能合理地使用线程,将会减少开发和维护成本,甚至可以改善复杂应用程序的性能。如在GUI应用程序中,还以通过线程的异步特性来更好地处理事件;在应用服务器程序中可以通过建立多个线程来处理客户端的请求。线程甚至还可以简化虚拟机的实现,如Java虚拟机(JVM)的垃圾回收器(garbage collector)通常运行在一个或多个线程中。因此,使用线程将会从以下五个方面来改善我们的应用程序:
                    1. 充分利用CPU资源
                    现在世界上大多数计算机只有一块CPU.因此,充分利用CPU资源显得尤为重要。当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将造成大量的计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而CPU又恰好处于空闲状态时来运行其他的线程。这样CPU就很难有空闲的时候。因此,CPU资源就得到了充分地利用。
                    2. 简化编程模型
                    如果程序只完成一项任务,那只要写一个单线程的程序,并且按着执行这个任务的步骤编写代码即可。但要完成多项任务,如果还使用单线程的话,那就得在在程序中判断每项任务是否应该执行以及什么时候执行。如显示一个时钟的时、分、秒三个指针。使用单线程就得在循环中逐一判断这三个指针的转动时间和角度。如果使用三个线程分另来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。这样有助于开发人员对程序的理解和维护。
                    3. 简化异步事件的处理
                    当一个服务器应用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果这种应用程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,在读完数据后,read方法处于阻塞状态,也就是说,这个线程将无法再监听客户端请求了。而要想在单线程中处理多个客户端请求,就必须使用非阻塞的Socket连接和异步I/O.但使用异步I/O方式比使用同步I/O更难以控制,也更容易出错。因此,使用多线程和同步I/O可以更容易地处理类似于多请求的异步事件。
                    4. 使GUI更有效率
                    使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。如果这些代码太长,那么GUI事件就会被“冻结”,直到这些代码被执行完为止。
                    在现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的事件分派线程(event dispatch thread,EDT)来对GUI事件进行扫描。当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI事件进行扫描,因此,这种方式对事件的反映是非常快的。
                    5. 节约成本
                    提高程序的执行效率一般有三种方法:
                    (1)增加计算机的CPU个数。
                    (2)为一个程序启动多个进程
                    (3)在程序中使用多进程。
                    第一种方法是最容易做到的,但同时也是最昂贵的。这种方法不需要修改程序,从理论上说,任何程序都可以使用这种方法来提高执行效率。第二种方法虽然不用购买新的硬件,但这种方式不容易共享数据,如果这个程序要完成的任务需要必须要共享数据的话,这种方式就不太方便,而且启动多个线程会消耗大量的系统资源。第三种方法恰好弥补了第一种方法的缺点,而又继承了它们的优点。也就是说,既不需要购买CPU,也不会因为启太多的线程而占用大量的系统资源(在默认情况下,一个线程所占的内存空间要远比一个进程所占的内存空间小得多),并且多线程可以模拟多块CPU的运行方式,因此,使用多线程是提高程序执行效率的最廉价的方式。


                    74楼2014-12-25 16:02
                    收起回复
                      三、Java的线程模型
                      由于Java是纯面向对象语言,因此,Java的线程模型也是面向对象的。Java通过Thread类将线程所必须的功能都封装了起来。要想建立一个线程,必须要有一个线程执行函数,这个线程执行函数对应Thread类的run方法。Thread类还有一个start方法,这个方法负责建立线程,相当于调用Windows的建立线程函数CreateThread.当调用start方法后,如果线程建立成功,并自动调用Thread类的run方法。因此,任何继承Thread的Java类都可以通过Thread类的start方法来建立线程。如果想运行自己的线程执行函数,那就要覆盖Thread类的run方法。
                      在Java的线程模型中除了Thread类,还有一个标识某个Java类是否可作为线程类的接口Runnable,这个接口只有一个抽象方法run,也就是Java线程模型的线程执行函数。因此,一个线程类的唯一标准就是这个类是否实现了Runnable接口的run方法,也就是说,拥有线程执行函数的类就是线程类。
                      从上面可以看出,在Java中建立线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口,并通过Thread和实现Runnable的类来建立线程,其实这两种方法从本质上说是一种方法,即都是通过Thread类来建立线程,并运行run方法的。但它们的大区别是通过继承Thread类来建立线程,虽然在实现起来更容易,但由于Java不支持多继承,因此,这个线程类如果继承了Thread,就不能再继承其他的类了,因此,Java线程模型提供了通过实现Runnable接口的方法来建立线程,这样线程类可以在必要的时候继承和业务有关的类,而不是Thread类。


                      75楼2014-12-25 16:03
                      收起回复


                        76楼2014-12-25 16:06
                        收起回复


                          80楼2014-12-25 21:32
                          回复
                            如果你只是知道拷贝一堆jar包,定义一系列配置文件之后,SSH三大框架就能够运行起来了,也可以给你干活了,那么,很悲哀的是,你仍然没有掌握三大框架的精粹!请你回答以下问题:
                            Struts2:
                            为什么每次请求都要创建一个Action对象?
                            ModelDriven拦截器的配置中refreshModelBeforeResult解决了什么问题?
                            为什么在web.xml中配置的StrutsPrepareAndExecuteFilter要过滤所有的请求?
                            请你给我谈谈ValueStack?
                            Struts2是如何实现MVC设计模式的?
                            Spring:
                            你为什么要用Spring?
                            请你聊一聊IOC/DI?
                            什么是声明式的事务管理?为什么要使用声明式的事务管理?Spring如何实现声明式的事务管理?
                            把spring和hibernate集成,定义事务管理特性的时候,为何要将除了添加、删除、更新操作之外的方法,即主要执行查询任务的方法定义为read-only?
                            Hibernate:
                            请你谈谈你对OR映射的理解?
                            很多人说Hibernate不适合大项目,性能有问题,你是如何理解的?
                            Hibernate为什么一定要定义一个数据库标识?
                            为什么Hibernate建议你的实体类实现hashCode和equals方法?
                            谈谈你对Hibernate实体类中的数据库标识与数据库主键之间关系的认识?
                            谈谈你对Hibernate关联映射与数据库外键之间关系的认识?
                            调用session.save()方法,hibernate一定会发出insert语句吗?谈谈你的理解
                            调用session.update()方法,hibernate一定会发出update语句吗?谈谈你的理解
                            请你聊一下以下名词、概念或用法:lazy、lazy=”extra”、inverse、fetch、fetch=”join”、fetch=”subselect”、batch-size
                            配置了lazy=”true”一定会实现懒加载吗?
                            请你谈谈Hibernate中的“N+1”问题
                            请你谈谈Hibernate有哪些最佳实践?
                            以上并非SSH中全部重点的问题,但它们能考察你能否灵活运用SSH框架!如果你能深刻理解这些问题,再配以合适的实战项目训练,你也会逐渐成为牛人!
                            最后是项目开发能力:
                            不管你是学Java还是别的技术,你的根本目的在于给客户创造价值!否则,你下大力气学习的东西,随着技术的进步和更新,很快就会过时!所以,技术的核心在于用技术创造有价值的成果!也就是说,客户需要什么,你就要用技术把客户需要的东西给他造出来!一个公司之所以要用各种福利条件极力挽留你,是因为你能够给公司带来极高的利益!那么,你有什么可以给公司利用的呢?公司最看重你的哪方面的能力呢?
                            做项目需要的能力很多,其中最核心最基础的就是建模能力(现在最主流的就是面向对象建模!)。什么是建模能力呢?


                            83楼2014-12-25 21:51
                            收起回复
                              今后你将面对更加繁杂的需求,你学习项目的唯一目的,就是:学习如何将需求转化为实现,如何对需求进行分析,如何建立概念模型,如何理顺各种概念之间的关系,如何进行设计,如何选择合适的技术来实现你的设计方案,如何对你的实现进行测试,如何解决你所遇到的形形色色的问题(性能、需求变更等)。当你真正到公司里面从事了几年开发之后,你就会同意我的说法!
                              利用Java找工作,需要的就是项目经验,项目经验就是理解项目开发的基本过程,理解项目的分析方法,理解项目的设计思路,理解项目的实现技巧,理解项目的测试方法,理解项目中各种问题的解决方案!!!


                              84楼2014-12-25 21:51
                              收起回复