java开发面试题

1、如何解决spring单例的线程不安全问题?
一般线程不安全问题都是因为成员变量,因为成员变量放在堆上,堆是线程共享的。
如何解决呢?
a.改变单例作用域
在对应的类名上加上该注解@Scope("prototype"),表示每次调用该接口都会生成一个新的Bean。下图示例
b.解决方案二 ThreadLocal解决问题
c.尽量不使用成员变量
d.更改作用于为request 每次请求相当于重新生成对象

2、union和union all的区别
union:查询的结果集会合并 不会包含重复项
union all:查询的结果集不会合并 会包含重复项

3、spring的aop通知

4.git和svn的区别
git是分布式的
svn不是分布式的
git把数据按元数据存储
svn是按文件存储
git没有一个全局版本号 svn有
svn提交必须先update然后在commit,忘记合并会出现问题

5、left join、right join,join的区别
left join 左链接 以左边为主关联表2,表1数据全部显示,表2展示与表1交集数据

right join 右链接 以右边为主关联表2,表1数据全部显示,表2展示与表1有交集数据

join 内链接 表1 表2只展示有交集的数据

6、msql函数
char_length()
format()
left()
right()
weekday()
year()
now()

7、Sql查询时如果某字段是null值排序问题
当sql语句是升序时 null值会为最大“默认值”排序最底部,如何解决呢? 在sql语句后面添加 nulls first 排前面 ,nulls last 排后面解决
select * form user where order by id nulls first / nulls last

8、工作流了解

9、ehcache和redis的区别
ehcache是一个纯java的进程缓存框架,运行在jvm上,效率高,速度快,但是缓存共享麻烦,分布式架构麻烦
redis是一个独立程序,通过socket访问到缓存服务,效率比ehcache慢比数据库访问快
如果是单个应用独立程序,对缓存要求高的推荐用ehcache
如果是分布式架构,大型应用推荐用redis

10、spring有哪些组成?
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。

integer a=100,integer b=100比较

integer a=100;
integer b=100;

a==b true

integer c=1000;
integer d=1000;

c==d false

因为integer的大小在-128 到正127之间 因为integer内部有一个类 对于超过存储大小的会 new lnteger()

解决validate无法验证多个相同name的input

解决validate无法验证多个相同name的input (动态生成的表格)

记录实际业务遇到问题

首先给input分别设置不同的id

//用于生成uuid
    function S4() {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }

    function guid() {
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    }
//为动态添加的元素绑定事件
    $('#contentTable').on('click', '.addTable', function () {
        // var uuid = "qty" + guid();
        //步骤预设
        var str1 = ' <tr>\n' +
            '                                <td>\n' +
            '                                    <input id="qty' + guid() + '" type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                           name="gspStepTaskPresetChildtable.stepName"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                    <input id="qty' + guid() + '" type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                           name="gspStepTaskPresetChildtable.workContent"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                    <input id="qty' + guid() + '"  type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                       onkeyup="value=value.replace(/[^\\d\\.]/g,\'\')"     name="gspStepTaskPresetChildtable.completeDays"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                    <input  id="qty' + guid() + '" type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                           name="gspStepTaskPresetChildtable.milestone"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                    <input id="qty' + guid() + '" type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                           name="gspStepTaskPresetChildtable.precautions"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                    <input id="qty' + guid() + '" type="text" style="width: 126px;height: 32px" class="input-xlarge required"\n'
            +
            '                                      onkeyup="value=value.replace(/[^\\d\\.]/g,\'\')"      name="gspStepTaskPresetChildtable.standardWorkingHours"></input>\n' +
            '                                </td>\n' +
            '                                <td>\n' +
            '                                   <p class="addTable">+</p>\n' +
            '                                   <p class="delTable" onclick="delTable(this);">-</p>\n' +
            '                                </td>\n' +
            '                            </tr>';

        $('#contentTable > tbody:nth-child(2)').append(str1);

    });

设置validate的多个input验证方法为根据id验证

$(function () {
        if ($.validator) {
            $.validator.prototype.elements = function () {
                var validator = this,
                    rulesCache = {};
                return $([]).add(this.currentForm.elements)
                    .filter(":input")
                    .not(":submit, :reset, :image, [disabled]")
                    .not(this.settings.ignore)
                    .filter(function () {
                        var elementIdentification = this.id || this.name;
                        !elementIdentification && validator.settings.debug && window.console && console.error("%o has no id nor name assigned", this);
                        if (elementIdentification in rulesCache || !validator.objectLength($(this).rules()))
                            return false;
                        rulesCache[elementIdentification] = true;
                        return true;
                    });
            };

        }
        # [id^=qty] 根据实际业务需求修改 id以qty开头的
        $('[id^=qty]').each(function (e) {
            $(this).rules('add', {
                minlength: 2,
                required: true
            })
        });
    });

    

MySQL之You can't specify target table for update in FROM clause解决办法

MySQL中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。 例如下面这个sql:

delete from tbl where id in 
(
        select max(id) from tbl a where EXISTS
        (
            select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
        )
        group by tac
)

也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和Oracle不会出现此问题。


delete from tbl where id in 
(
    select a.id from 
    (
        select max(id) id from tbl a where EXISTS
        (
            select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
        )
        group by tac
    ) a
)
    UPDATE t_user_asset SET f_cashAmount =   
    (  
      SELECT ub.cashAmount FROM  
            (  
                 SELECT (ua.f_cashAmount+50000) cashAmount FROM t_user_asset ua WHERE ua.f_userId = 290  
            ) ub  
    )  
    WHERE f_userId = 290