胜博发游戏官网JAVA接口对象为空时,调用接口方法,程序没报错

( 胜博发游戏官网 )

这个问题源于在我们公司内部移动产品开发框架上看到的一段代码,总结模拟出来,大概的定义和调用情况如下:

ITest 接口

public interface ITest {

    public void eat();
    public void shout();

}

Model类 (一个普通的类,并且类内部没有实现任何功能)

public class Model {

    public static ITest getModel() {
        return null;
    }

}

主程序 JTest类

public class JTest {

    public static void main(String[] args) {
        ITest test = Model.getModel();
        test.eat();
        test.shout();
        System.out.println("hahah");

    }
}

按正常的理解,这个肯定会在test.eat()处报NullPointerException, 而我测试过后也正是如此。但问题是在使用此框架进行开发时,程序运行到相关模块,并没有报错。

所以,想请教一下,JAVA是不是有什么机制或者模式能让这种调用方式可行,而这种调用方式又有什么作用呢?由于找不到写这部分代码的同事,所以,这个问题相当困扰,也觉得蛮有趣的。

跪求大神指导。

如果你确定使用框架时执行test.eat();又没报错那确实有意思。
也有可能是框架把异常吞了没向上抛

我敢说 肯定是你代码没有看完. 如果返回一个null那这就是完全无意义的代码, 如果真的是这样, 你删了项目还正常么…
getModel 方法肯定是返回的 接口实现的对象.
你可以去搜一下 那个接口实现的类. 仔细看一下那个 getModel方法相关类的 配置文件之类的.
看仔细… 不会有这么神奇的事发生的…

不可能为空的。如果没有报错的话,必然是框架为你捕获了异常处理。

我感觉你应该是跟错代码了,你断点调试可以看到执行ITest test = Model.getModel();完之后得到的是什么

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机为什么是List list = new ArrayList(),而不直接用ArrayList

( SBF胜博发娱乐老虎机 )

如题,安卓新手,经常看到这样的写法 不知道为什么

这里你只需要搞清楚一个概念,叫做向上转型。

List是接口而ArrayList与LinkedList为他具体的两个实现类。

ArrayList与LinkedList实现了List接口中定义的通用方法,
但是根据自己的需要也实现了一些List中没有定义的方法。

当你在使用List list = xxx;的时候,代码表达的语义为:

我需要一个实现了List接口的实现类对象。
具体是哪种实现,我们并不关心。
因为List接口中定义的方法足够我们使用。
这时,这种定义方式,就会发生向上转型。
由具体类型向上转为通用的接口类型。
但是,伴随向上转型时会发生信息丢失,也就是说,
你拿到的这个对象中仅仅只能访问到List接口中定义的成员方法,
而具体实现类新增的扩展方法将会丢失。

所以,在你需要使用一些特殊方法时定义对象需要明确对象类型。

在通用接口提供的内容足以满足当前需求时,就可以向你题目中描述的那样定义。十分方便。

编辑器太难用了。凑合看吧。。

面向接口编程思想。

首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。

// 1.这样你就只能调用List接口里面定义好的方法,而不能使用你自己在ArrayList扩展的方法。
     List list = new ArrayList();
     
// 2.这样你可以使用自己在ArrayList类上扩展的方法
    ArrayList list = new ArrayList();

// 接口就是定义了一些行为,它要求你应该做什么。
// 假如你采用了面向接口编程方式,也就是第一种方式:List list = new ArrayList();
// 就能通过接口很大限度上规范开发人员的实现规则,因为你现在只能调用接口的方法。

讲的不是很好,建议参考一下:http://dev.yesky.com/298/8080298.shtml

因为你不需要用到ArrayList自带的一些方法,你只需要用List这种容器所应该带的方法,如果你发现ArrayList在你的应用中不适合,完全可以在定义处另定义实现了List接口的类。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城java 程序运行过程中如何进行内存分配的或者介绍下内存分配的过程

( sbf胜博发娱乐城 )

面对这样的面试题:
java 程序运行过程中如何进行内存分配的或者介绍下内存分配的过程,请详细描述,谈谈你的理解!
我第一时间想到的是堆栈相关的知识点考察,所以面试的过程中通过一个例子说明了一下,很简短的说完了,感觉面试官不太满意,各位如果遇到类似的问题,该如何回答才能得到面试官加分!
Java 内存区域详解有没有结合这个回答的必要。

  • 内存分配首先要知道内存的数据区域有哪些?
    虚拟机栈,程序计数器,堆,方法区,本地方法区。
  • 知道了内存分配主要在堆上进行后,由于垃圾回收机制的存在,具体又是怎么分配的?
    堆分为新生代,老年代,永久代。
    对象分配主要在新生代中的Eden区域中,如果经过多次GC对象还存活,那么对象将进入老年代。如果启动了本地线程分配缓冲,则按线程优先在TLAB中分配。大型对象直接分配到老年代。
  • 为什么大型对象直接分配到老年代?
    新生代的垃圾回收机制采用复制算法(复制算法的问题)。
  • 空间分配担保是怎么回事?
    在新生代的对象有可能提前进入老年代。
  • 对象在内存中的布局是怎样的?
    Java内存区域详解

以上都是基本的内存分配问题,每个都可以深入下去。
由于jvm垃圾自动回收技术的存在,以上问题都是需要解决的。
我也在学习,大家可以相互探讨共同进步。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网协程就是goto吗?

( 胜博发游戏官网 )

协程就是goto吗?两者有何异同?

goto是在同一个函数中跳转,协程应该类似于setjumplongjump,这个是在不同函数间跳转。

这么说不准确,应该说协程一个主要功能就是跨函数的goto,当然,在需要时还能goto回来,这一点更像函数调用。

协程是一种计算机程序设计的组件,它范化了子例程的概念.协程非常适合用于实现一些有用的程序组件例如,协作式多任务,异常处理,事件循环,迭代器,无限链表和管道等.

下面对比一般的子例程和协程:

子例程的起始处是惟一的入口点,一旦退出即完成了子例程的执行,子例程的一个实例只会返回一次。

子程序总是在它的开始处被启动,它通常是一个固定的位置.共行程序总是在它上次结束处的下一位置被启动.

协程可以通过yield来调用其它协程。通过yield方式转移执行权的协程之间不是调用者与被调用者的关系,而是彼此对称、平等的。

子例程容易实现于堆栈之上,因为子例程将调用的其他子例程作为下级。相反地,协程对等地调用其他协程,最好的实现是用 continuations(由有垃圾回收的堆实现)以跟踪控制流程。

Marlin对coroutine的特性描述如下:

coroutine中的局部变量在后续调用中保持有效.

当控制离开的时候coroutine被挂起,将控制权交还给它的时候在它挂起的地方继续执行.

协程的分类

1)通过控制转移机制分类:对称协程与非对称协程

非对称协程(asymmetric),或称为半对称协程(semi-symmetric)或半协程(semi-coroutines).非对称协程可以被看作是调用者的从属过程,它们之间的关系跟调用和被调用例程的关系类似.

对称协程只提供了一种控制转移机制:将执行流程交给指定的协程.因为对称协程之间可以互相转移执行流程,所以它们之间的关系 就像在同一个层级.

2) 协程是否一级类型(first-class)

3) 是否有完整的栈

有完整栈的协程,允许协程在最内层的函数中挂起自己.以后此协程被resume将会从它被挂起的 地方继续执行.

没有完整栈的协程,例如python的generator,则只能在generator的主body中被挂起.

有完整栈的协程可以用于实现用户级多任务而没有完整栈的协程则不行.

协程的关键字是yield,个人觉得含义应该是:
中断执行,返回数据.再次调用,回到断点,恢复执行.
yield 等价于 return 并且 goto breakpoint.

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机java程序如何和pos机蓝牙通讯

( SBF胜博发娱乐老虎机 )

现在android应用要整合pos机,做到通过pos机刷多少金额,刷卡成功后pos机通知android应用刷卡刷卡成功
有做过相关整合的大神,多多指导~~

这个原理类似. 可以用蓝牙串口通信(做过蓝牙串口SMS群发)

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网【求助】SpringMVC为什么没有拦截到所有请求??

( 胜博发游戏官网 )

我在web.xml中配置了DispatcherServlet 处理所有请求,但是我请求WebRoot下面的某一个文件,还是能请求到啊,如图

这是Web.xml的配置

这是SpringMVC的配置文件

现在在WebRoot的JavaScript文件夹下有一个叫a.txt的文件,既然SpringMVC处理所有请求,我也没在SpringMVC里面配置相应的静态资源映射,那么我在地址栏里面请求这个文件,应该是请求不到的啊
但是事实证明其实还是能请求到的,想问下这是什么情况!
我已经配置了让SpringMVC处理所有请求啊????

求帮忙

太晚了就没做验证,楼主问题大概是在url-pattern里应该是写 /*

虽然你没有配置

<mvc:resources mapping="/images/**" location="/images"/>

类似的静态资源的配置,但是你配置了

<mvc:default-servlet-handler/>

同样有支持静态资源文件访问的功能。会把/** URL注册到SimpleUrlHandlerMapping的urlMap中,把静态资源的访问由HanderMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回,DefaultServletHttpRequestHandler使用的就是各个Servlet容器自带的Servlet了, 在DispatcherServlet之前。

<servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

SBF胜博发娱乐老虎机IntelliJ IDEA使用emacs keymap如何绑定meta?

( SBF胜博发娱乐老虎机 )

习惯了emacs的快捷键,看到IntelliJ IDEA也提供了emacskeymap。切换到emacskeymap,有一个问题是M-fM-bM-w等都无法使用。Google了一番,看到提供的方案都是重新映射OS X的键盘布局,绑定optionmeta。有没有其他的方案解决这个问题?

最新的版本,配合jdk1.8.0_65已经解决了这个问题

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

sbf胜博发娱乐城为什么老年代垃圾回收效率比新生代低很多?

( sbf胜博发娱乐城 )

看过深入理解java虚拟机,书上这个问题以结论性的一句话带过了,面试的时候被问到了这个问题,老年代对象生存时间长,不容易被回收,所以效率低?感觉怪怪的

从年代划分的角度来讲,我觉得问题是本末倒置了,年代划分目的是区别长期存在对象和短时间存在对象。
对象有可能长期存活,所以才会被放入老年代,标记整理过后,由于老年代的对象有很几率继续存活,所有回收的内存少。
新生对象有可能朝生暮死,假如新生对象有80%的概率死亡,经过多轮筛选后,将仍存活的对象存入老年代。那么从这样的流程看来,老年代的对象回收效率果然低。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网【求助】像我这样的需求该怎么配置mybatis事务?????

( 胜博发游戏官网 )

先说一下框架配置
Spring+SpringMVC+mybatis

现在的mybatis的事务级别是jdbc级别(不知道是不是这么叫):就是单条语句执行后提交事务,如果出现异常则回滚!
但是现在经常遇到的问题是:一次操作需要往多个表中插入数据,但是经常在往多个表里面查数据的时候如果其中一张表的插入出现了异常,应该将之前做的所有操作都回滚。例如说
有5个表 A B C D E
只有这5张表插入的数据都成功了,才表明这一次请求成功了!
但是现在如果插到C表时除了异常,那么只会回滚C表这次操作的数据,但是AB这两张表已经插进去了!这样就造成有垃圾数据了!
能不能将这五次操作一并提交事务 ?
不知道该怎样解决像我这样的问题???求大神!

操作一张表使用一个dao的方法,一个业务使用一个service方法,在service里面调用dao,如果某一种业务,要操作5张表,那么在service里面调用5个不同的dao,然后aop配置事务时,切在service层,这样,就会保证这5种操作是同一个事务。

用spring来管理事务,在spring中配置mybatis的事务,service方法级别上加

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void xxxService(xxx xxx){
    //do something
}

整个方法中有异常都会回滚。

将插入五张表封装在service的一个方法里,将Spring事务添加在service层

public class ServiceDemo{
    public void insert(){
        //insert 1
        //insert 2
        //insert 3
        //insert 4
        //insert 5
    }
}

在spring配置文件添加事务管理

xml<bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

dataSource是数据源,你应该已经配置过了,名字可能不一样

在需要使用事务的方法上添加注解,如:

java@Transactional
public void addEntity(Entity entity) {
    XXdao.save(entity);
    YYdao.save(entity);
}

这样只要方法出现运行时异常就会回滚方法内所有的数据库操作。

如果一个类内的所有方法都需要事务管理,可以把@Transactional注解放在类名上面,这样这个类里面所有的方法都支持事务了。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城写代码格式 括号是否另起一行

( sbf胜博发娱乐城 )

问下大家写代码的格式
写代码最好是另起一行还是不

如果不是否打个空格在写括号如:

int main() {
}没打空格的

int main(){
}打了空格的

大家给点小意见

就如楼上说的那样,怎么写都可以,开心就好。
当然,我们也可以看看一般人家是怎么写的。从对 Github 上面将近190万个Java项目的代码分析结果来看,第一种(即大括号后面空一格)是最多人这么写的

详细分析结果如下:

  1. 大括号后带空格 使用人数占比 58.003 %

    int main() {
    
    }
    
  2. 大括号起新行 使用人数占比 37.06 %

    int main() 
    {
    
    }
    
  3. 大括号后没空格 使用人数占比 4.937 %

    int main(){
    
    }
    

因为我是用PHP的,在PHP世界里面有一个专门的组织叫 PHP Framework Interoperability Group,它就给我们开发人员制定了许多普遍适用的标准,比如包括:代码的书写规范、命名规范等等。我们把该组织制定的标准叫作:PHP Standard Recommendation (PSR)。这些标准有效的减少了我们开发上面遇到的很多常见的困惑。

实际上我们任何人都可以参与制定该标准,而且它也并非官方的组织。但是PHP的官方已经采纳了PSR的部分作为内置的标准了。

楼主也可以看看在Java世界里面,会不会又有这样的组织 (^o^)/

附:以上数据来源自 Popular Coding Convention on Github,统计数据最近更新时间是:2014-07-19

我也问过这个问题诶.
答案就是:如果是团队,一般会有代码规范,遵循便是; 如果是个人,那么按照自己熟悉的来.

在C++中,我倾向于花括号换行.

你觉得怎么写看着舒服就怎么写啦~
在一行,或另起一行的写法都有~

个人比较喜欢同一行加空格的写法。

反正写完最好都要格式化一下,格式化后的一般是另外起一行

普遍的代码风格是,函数的大括号另起一行,其他地方的在同一行

如果是自己学习,可以按自己的习惯来,如果是在公司的话,按公司的编码规范或者大多数人的习惯来写,毕竟自己写的代码也是需要给别人看的

c:

int main()
{

}

java:

public func() {
}

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网如何抽取office文件中的内容进行碎片化存储?

( 胜博发游戏官网 )

Java抽取office文件(word、ppt、excel)中的内容(例如标题、图片、表格等),然后进行碎片化存储,征求可行的技术方案。请考虑到03和07不同的文件格式,POI是个不错的选择,如果还有其他更好的选择请一同分享下。

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城c# .net 时间格式化,怎样设置英国时区?

( sbf胜博发娱乐城 )

 private static SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z", Locale.ENGLISH);
  String startTime = formatter.format(new Date());//请求时间

能帮我用c#代码写上面这段Java代码吗?

// 查看当前系统支持的所有时区,主要是用 StandardName,
// 不过 ToString() 会显示时间差以及城市,可以帮忙人工判断
// foreach (var z in TimeZoneInfo.GetSystemTimeZones()) {
//   Console.WriteLine($"{z.StandardName} - ${z}");
// }

// 获取英国的时区
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
Console.WriteLine(zone);

Console.WriteLine(DateTime.Now.Kind);     // Local
var gtmTime = TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.Local, zone);
Console.WriteLine(gtmTime);

var d = new DateTime(2015, 9, 1, 18, 0, 0, DateTimeKind.Utc);
Console.WriteLine(d.Kind);    // Utc
Console.WriteLine(TimeZoneInfo.ConvertTime(d, TimeZoneInfo.Utc, zone));

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

sbf胜博发娱乐城关于springmvc扫描Controller类的问题

( sbf胜博发娱乐城 )

运行环境 jdk8 luna spring3.2 mybatis3.2.7
在springmvc.xml中这样写

<context:component-scan base-package="com.lingluo.ssm.controller" />

出现异常
严重: StandardWrapper.Throwable
java.lang.IllegalArgumentException
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.asm.ClassReader.(Unknown Source)
at org.springframework.core.type.classreading.SimpleMetadataReader.(SimpleMetadataReader.java:52)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:76)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:298)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.getImports(ConfigurationClassParser.java:300)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:230)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:153)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:130)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:285)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:223)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:630)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:598)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:517)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:458)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:138)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)

但是这样写

<bean class="com.lingluo.ssm.controller.ItemsController"/>

就没有错误

Spring3.2跟JDK8会有asm classRead问题,建议用spring3+jdk7或者spring4+jdk8

检查一下controller里面的注解呢,要用scan就是要把在xml里面的配置转移到注解中

看样子像缺jar包~~~

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

胜博发游戏官网mac笔记本自带jdk吗?

( 胜博发游戏官网 )

看到/usr/bin/目录下有javac,javah,不知道是不是说不用自己安装jdk1.7了?

推荐用brew case安装

安装homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装brew case

brew tap phinze/homebrew-cask
brew install brew-cask

安装Java

brew cask search java
brew cask install java//替换成搜索到的结果

另外一种简便的方法

如果不想用这类包管理器,在终端下敲java,就会弹出自动安装的提示。当然还是推荐用homebrew和brew case,方便管理osx的软件与应用

你们不要坑新手了好吗?
现在mac不自带jdk了,需要自己安装

还有人点赞了,那我就帮到底了。
最新的jdk是1.8,建议去oracle官网下载,嫌弃速度慢得我丢个百度盘,链接:http://pan.baidu.com/s/1o6sXgdO 下载直接安装即可。

另外还有涉及jdk多版本环境变量管理的话,推荐使用jenv,安装方法出门谷歌谢谢。

很方便。

疯狂点赞吧,骚年们。

带的 但是自带那个不好用 一般都是重新装一个

有自带的,你可以打开控制台输入:java -version 查看版本号。也可以自己安装JDK,并配置好环境变量。

我自己装了个jdk8,建议去oracle官方下载mac版的jdk,还是比较简单的。

建议自己安装,我就是自己装的,不难!

昨天刚买了个 macbook pro,回家安装 webstorm后,打开提示需要安装jdk〜〜

我14年买的 mac air 是不带jdk的。 需要自己安装。

现在的mac已经不带jdk了 很多年前的才是有的
不过在你需要使用到的时候mac会提示 然后点击更多信息可以进入苹果官网下载
苹果官网的版本不是最新的java版本 如果想要下载 可以去java官网进行下载

查看是否安装了java,你只需要在终端中输入java -version命令,如果出现相应的版本信息,比如本人的如下,则说明是存在的,如果没有则说明不存在。

bashJava version "1.7.0_60-ea"
Java(TM) SE Runtime Environment (build 1.7.0_60-ea-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

不存在或者你想安装更高的版本,最简单的方法,下载mac上jdk 的dmg文件,双击安装即可,jdk7下载地址:https://jdk7.java.net/download.html ,jdk8下载地址:https://jdk8.java.net/download.html
详细过程请参考:http://ixirong.com/2015/03/19/the-beginner-of-mac/

Yosemite开始就不自带jdk了

自带的是 jdk 6,推荐用 homebrew

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

胜博发游戏官网编程题:最优平均分配

( 胜博发游戏官网 )

—————大神来看—————


有一串随机的正整数(不考虑大数),然后将这些正整数 ,分配到 N组, 使之 最大的一组 与 最小的一组 两组整数和 差值最小,不需要尽可能解(倒序贪婪,最小贪婪),只求最优解!
例如 30 20 30 20 20
分成n = 2组
1。30 30
2。20 20 20

找最优解,可以看看遗传算法

算法之类的不是很懂,但这是我的一个代码。
我是这样想的。
一个数组内,里面有N+1个整数。
进行冒泡排序出最大的和最小的。
之后循环这个数组去取和。

//冒泡排序出最大和最小
        int temp;
        int[] noneSort = {30, 80, 80, 30, 88, 29, 88, 25, 25};
        for(int i = 0; i < noneSort.length-1; i++){
            for(int j = i + 1; j < noneSort.length; j++){
                temp = noneSort[i];
                if(noneSort[j] >= temp){
                    noneSort[i] = noneSort[j];
                    noneSort[j] = temp;
                }
            }
        }
        //输出打印
        log.info("{}", noneSort);
        int maxNum = noneSort[0];
        int minNum = noneSort[noneSort.length - 1];
        int max = 0, min = 0;
        for(int i = 0; i < noneSort.length; i++){
            if(noneSort[i] == minNum){    //如果等于最小值
                min += noneSort[i];
            }else if(noneSort[i] == maxNum){    //如果等于最大值
                max += noneSort[i];
            }
        }
        //输出打印
        log.info("max: {}, min: {}", max, min);

结果就是如下:

[88, 88, 80, 80, 30, 30, 29, 25, 25]
max: 176, min: 50

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…

sbf胜博发娱乐城runnable是如何避免java单继承带来的局限性的?

( sbf胜博发娱乐城 )

单继承的意思是,一个子类不能有两个以上父类
具体解释:
若有一个A类,一个B类,且A,B类独立(没有共同父类,也相互不为父类)。
新建一个类C,想要同时继承A,B类,在JAVA中无法直接实现。
要实现,只能复制A类的内容,再继承B类,或者反过来,这将会很麻烦,而且代码会很丑陋。

局限性由上面可以得到:想要得到两个类的特性是不能通过继承实现。

而接口出现可以解决这个问题。
因为,一个类可以实现多个接口

最后解释一下Runnable是如何避免java单继承带来的局限性的。
如果你想写一个类C,但这个类C已经继承了一个类A,此时,你又想让C实现多线程。用继承Thread类的方式不行了。(因为单继承的局限性)
此时,只能用Runnable接口。
Runnable接口就是为了解决这种情境出现的。

runnable是接口

可以实现多个接口

@RK3258 其实还是介绍的接口实现类继承的区别,我从另外一个层面来回答这个问题。

首先 ThreadRunnable 实际上是一种静态代理的实现方式。我们可以简单看一下源代码就了解了:

public interface Runnable {
    public abstract void run();
}

public class Thread implements Runnable {
    ...
    private Runnable target;
    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
    public void run() {
        if (target != null) {
            target.run(); //代理的target的run方法
        }
    }
}

另外一个我们知道线程启动是调用 thread.start() 方法,但是 start() 方法会调用 nativestart0()方法,继而由 JVM 来实现多线程的控制,因为需要系统调用来控制时间分片。

现在我们可以深入理解一下两种线程实现方式的异同。

Class MyThread extends Thread(){
    public int count = 10;
    public synchronized void run(){
        while(count>0){
            count--;
        }
    } 
}

new Mythread().start(); //启动 n 个线程
new Mythread().start();

这种实现方式实际上是重写了 run() 方法,由于线程的资源和 Thread 实例捆绑在一起,所以不同的线程的资源不会进行共享。

Class MyThread implements Runnable{
    public int count = 10;
    public synchronized void run(){
        while(count>0){
            count--;
        }
    } 
}
MyThread mt = new MyThread();
new Thread(mt).start();  //启动 n 个线程
new Thread(mt).start();

这种实现方式就是静态代理的方式,线程资源与 Runable 实例捆绑在一起Thread 只是作为一个代理类,所以资源可以进行共享。

当然 @RK3258 说的接口与类的区别我就不赘述了。

另外从 Java 语言设计者的角度来说,Runnable 可以理解为 Task,对应的是具体的要运行的任务,而 Thread 对应某一个具体的线程运行的载体。综上,继承 Thread 来实现,可以说是不推荐的。

(看完/读完)这篇文章有何感想! sbf胜博发娱乐城的分享…

SBF胜博发娱乐老虎机java AtomicInteger线程安全问题

( SBF胜博发娱乐老虎机 )

public class TTTT implements Runnable{

public static AtomicInteger ato = new AtomicInteger(1);
int i = 1;
public static void main(String[] args) {
    TTTT t = new TTTT();
    for (int i = 0;i<100; i++){
        new Thread(t).start();
    }
}

public void rrrr() throws Exception{
    Thread.sleep(100);
    int preVal = ato.get();
    int val = ato.incrementAndGet();
    System.out.println(preVal+" ########### "+val);
}

@Override public void run() {
    try {
        rrrr();
    } catch (Exception e){

    }
}

}

AtomicInteger 的incrementAndGet是线程安全的计数方法
上面代码执行结果是:

1 ########### 4
5 ########### 6
1 ########### 3
9 ########### 10
9 ########### 11
13 ########### 14
16 ########### 18
1 ########### 2
8 ########### 9
6 ########### 7
4 ########### 5
7 ########### 8
18 ########### 19
16 ########### 17
14 ########### 15
15 ########### 16
12 ########### 13
11 ########### 12
19 ########### 21
21 ########### 22
22 ########### 23
19 ########### 20
23 ########### 24
24 ########### 25

无法保证顺序,线程安全体现在哪里呢

AtomicInteger 的incrementAndGet 保证对整数的递增和获取是原子的,

  1. 值+1

  2. 返回值

一个线程在这两个操作之间不会强行插入另外的线程

你要保证顺序,那么需要的是线程互斥

你输出的右边不会重复也不会漏,这就是它的线程安全保证

AtomicInteger是一个原子类,顾名思义,它能保证一些操作是原子性的,比如说++、--等操作,这些操作在多线程的情况并不是线程安全的,但是使用原子类可以保证这些操作的原子性,从而来保证线程的安全性。

简单说说吧。

  1. 线程安全是在多线程环境下,数据的增加和减少是安全的,例子中数据不重复就代表了线程安全了。
    2.顺序问题是有线程执行的顺序决定的,和线程安全没关系

直接上代码,你用线程池当中的Executors.newSingleThreadExecutor();代码如下:

package test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class TestAtomicInteger implements Runnable{
    public static AtomicInteger atomic = new AtomicInteger();
    int i = 0;
    @Override
    public void run(){
        try {
            Thread.sleep(100);
            int preVal = atomic.get();
            int val = atomic.incrementAndGet();
            System.out.println(preVal+" ########### "+val);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        TestAtomicInteger test = new TestAtomicInteger();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        for(int i = 0;i < 100; i++){
            executor.execute(test);
        }
    }
}

输出结果如下:
0 ########### 1
1 ########### 2
2 ########### 3
3 ########### 4
4 ########### 5
5 ########### 6
6 ########### 7
7 ########### 8
8 ########### 9
9 ########### 10
10 ########### 11
11 ########### 12
12 ########### 13
13 ########### 14
14 ########### 15
15 ########### 16
16 ########### 17
17 ########### 18
18 ########### 19
19 ########### 20
20 ########### 21
21 ########### 22
22 ########### 23
23 ########### 24
24 ########### 25
25 ########### 26
26 ########### 27
27 ########### 28
28 ########### 29
29 ########### 30
30 ########### 31
31 ########### 32
32 ########### 33
33 ########### 34
34 ########### 35
35 ########### 36
36 ########### 37
37 ########### 38
38 ########### 39
39 ########### 40
40 ########### 41
41 ########### 42
42 ########### 43
43 ########### 44
44 ########### 45
45 ########### 46
46 ########### 47
47 ########### 48
48 ########### 49
49 ########### 50
50 ########### 51
51 ########### 52
52 ########### 53
53 ########### 54
54 ########### 55
55 ########### 56
56 ########### 57
57 ########### 58
58 ########### 59
59 ########### 60
60 ########### 61
61 ########### 62
62 ########### 63
63 ########### 64
64 ########### 65
65 ########### 66
66 ########### 67
67 ########### 68
68 ########### 69
69 ########### 70
70 ########### 71
71 ########### 72
72 ########### 73
73 ########### 74
74 ########### 75
75 ########### 76
76 ########### 77
77 ########### 78
78 ########### 79
79 ########### 80
80 ########### 81
81 ########### 82
82 ########### 83
83 ########### 84
84 ########### 85
85 ########### 86
86 ########### 87
87 ########### 88
88 ########### 89
89 ########### 90
90 ########### 91
91 ########### 92
92 ########### 93
93 ########### 94
94 ########### 95
95 ########### 96
96 ########### 97
97 ########### 98
98 ########### 99
99 ########### 100

Atomic类中的value值都是一些被volatile标注的类型, volatile是java提供的轻量级变量同步机制,它确保了变量可见性,即任何一个线程修改了volatile修饰的变量,其他线程将立即可见.对于普通变量因为存在主内存和工作区内存的复制和同步,所以无法具备此特性.volatile变量存储在主内中,任何线程需要使用此变量时,必须再次read,因为其他线程对此变量的更改,将会被其他线程在使用此变量时立即获得新值.
volatile只是保证了可见性,但是它并非线程安全,因为如果线程一旦read到此值然后进行计算,在尚未write到主内存时其他线程也做了同样的操作,那么volatile变量的最终结果将无法达到预期..如果期望volatile变量线程安全,必须同步或者CAS.volatile变量操作时,read->load->use三个操作是连续的,assign->store->write三个操作是连续的.
里面采用的是CAS(compareAndSet)的值替换方法,像一种”乐观锁”,通过”比较”-“更新”这种无阻塞的手段实现数据在多线程下的”安全性”.

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

SBF胜博发娱乐老虎机java的中断线程interrupt()方法,为什么还要把run()方法走完呢?那中断线程不就没有意义了吗?

( SBF胜博发娱乐老虎机 )

当线程调用interrupt方法后,为什么还要运行完run方法呢?那中断线程还有什么意义?

Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。

详细分析Java中断机制

Java线程也有一个不让run方法走完的方式,那就是stop方法,可是这个方法已经被jdk弃用了,为什么呢?如果你的线程正在修改某处数据,可以是数据库,可以是写文件,stop方法不由分说就把线程杀死了,那数据是不是就出现混乱,不一致的状况?所以Java的线程采用的是中断机制,并且你可以捕获这个中断,并作出中断后需要做出的操作。

(看完/读完)这篇文章有何感想! SBF胜博发娱乐老虎机的分享…

胜博发游戏官网ssm配置的一个问题

( 胜博发游戏官网 )

<bean id=”sqlSessionFactory” class=”org.mybatis.spring.SqlSessionFactoryBean”>

    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis.xml" />
    <!-- mapper和resultmap配置路径 -->
    <property name="mapperLocations">
        <list>
            <value>classpath:entity/config/*.xml</value>
        </list>
    </property>
</bean>
<!-- 自动扫描mapper接口,注入sqlsessionfactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.xdemo.example.springrestful.mapper" />
</bean>

Mapper接口是怎么样注入到sqlsessionfactory里的啊?

你下面的加个
<property name=”sqlSessionFactoryBeanName” value=”sqlSessionFactory”></property>

(看完/读完)这篇文章有何感想! 胜博发游戏官网的分享…