个人笔记5

2017-09-05 Map遍历取得key=value的entry

Map<String, String> map=new HashMap<>();
    map.put("1", "guyan");
    map.put("2", "gao");
    map.put("3", "fei");
    Set entrySet = map.entrySet();
    if(entrySet !=null){
        Iterator iterator = entrySet.iterator();
        while(iterator.hasNext()){
        //Object obj=iterator.next();
            Map.Entry<String, String> entry = (Entry<String, String>) iterator.next();
            String key = entry.getKey();
            System.out.println("key="+key);
            String value = entry.getValue();
            System.out.println("value="+value);
        }
    }

通过 iterator.next()可以获取key=value形式,实际就是entry的数据结构,强转为Map.Entry就可以进行获取key,获取value。
这里写图片描述
Entry为HashMap的内部类,它包含了键key、值value、下一个节点next,以及hash值,这是非常重要的,正是由于Entry才构成了table数组的项为链表。
这里写图片描述
HashMap在存储过程中并没有将key,value分开来存储,而是当做一个整体key-value来处理的,这个整体就是Entry对象。同时value也只相当于key的附属而已。在存储的过程中,系统根据key的hashcode来决定Entry在table数组中的存储位置,在取的过程中同样根据key的hashcode取出相对应的Entry对象。

参考相关资料:java提高篇:hashmap,博主对hashmap分析的很好,很有启发性。



2017-09-07 一个解决生产环境数据量大,查询缓慢地办法—sql加分页

查询缓慢的原因分析: 正常我们用分页控件来对查询条数多来进行分页,而后台的查询sql并没有任何分页控制。说白了就是分页的实现实际上是每次都是按条件查询全部,然后在返回页面时对数据进行了截取罢了。

因此这里只需要把sql也进行分页控制就可以实现每次就从数据库查询固定条数就返回,而不是查询全部。就解决了查询缓慢的问题。
针对不同的数据库,实现方式不同。但思路是一致的。就是从查询语句上进行限制。
1.mysql
在sql的最后加上limit nowpage,pagesize ,其中
nowpage:当前页是第几页的数据
pagesize:每页显示多少条数据

具体做法是在页面上除了分页控件外,另加上一个下拉控制每次查询多少条的控件,我们假设为200条,然后将这个值传给limit的pagesize。而nowpage则通过分页控件的nowPage*pageSize>pagesize来判断是否该翻页。假设分页控件是每页显示10条,当分页控件当前页为第三页,实际3*10=30<200,所以传给sql的nowpage还是第一页,即nowpage=1,当分页控件翻到第21页时,21*10>200,这时才会传到sql的nowpage=2.
这样。分页控件的查询总条数会一直是200条。从而让查询速度快起来。
2.DB2
db2中实现查询条数的方法有两种,一种是用ROW_NUMBER() OVER函数,另一种是用fetch 。
执行语句:select * from sp_express_com where branch="10"查询前20条数据

1.fetch用法

select * from sp_express_com where branch="10" fetch first 20 rows only  with ur

2.row_number()用法。

分解步骤
1.(select * from sp_express_com where branch="10" with ur)m
2.(select m.*,rownumber() over() as rownum from(...)m)temp
3.最终  select * from (...)temp where temp.rownum<=20 and temp.rownum>=0

一般的,用fetch来实现效率高,语句也更简单。
遇到的问题:我们为查询sql传参: 限制前多少条 时,老是报错,就是因为对应的参数并未赋值到sql的对应参数上。这时可以把#{} 改成 {}里面传的是原值,而没有区分是整数还是String。



2017-09-09 easyui框架下的查询页面,如何为查询框中加入下拉框-最大结果?效果如下:
这里写图片描述
页面部分代码如下图:
这里写图片描述


2017-09-12 jvm,jre,jdk的关系

jre(java运行环境),也就是java平台。所有java程序都要在jre下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可

jdk是程序开发者用来编译,调试java程序用的开发工具包。jdk的工具也是java程序,也需要jre才能执行,为了保持jdk的独立性和完整性,在jdk的安装过程中,jre也是安装的一部分,所以,在jdk的安装目录下有一个名为jre的目录,用户存放jre文件

jvm是jre的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,jvm有自己完善的硬件架构,如处理器,堆栈,寄存器等,
还有相应的指令系统,java语言最重要的特点就是跨平台运行,使用jvm就是为了支持与操作系统无关



2017-09-13 解决: java中double类型转换成字符串自动格式化成科学计数法

问题描述:
double Amount=99999999.00
String Amou=Amount.toString();
这时Amou=9.9999E7;而不是99999999.00
问题分析:
    使用String.valueOf(Double d)方法来将double转换成String,而String.valueOf(Double)调用的是Double自身的toString()方法。这个方法的上面有段注释内容折磨说的:“如果数字大于107次方或者小于10的-3次方,就会使用科学计数法。”
    这个toString()方法在很多时候很适用,同时在很多地方也让很多人很头疼。想要避免这个问题,就要自己使用格式化类去重新格式化。最简单的使用DecimalFormat类去格式化,用这个可以很容易的得到不转换成科学计数法的字符串。
解决办法:
    //最多保留几位小数,就用几个#,最少位就用0来确定,注意如果小数点后显示位数如果小于数据小数点后的位数,就会四舍五入。
    DecimalFormat df = new DecimalFormat("###0.0#");
    tring s=df.format(d);
举例说明:
        Double d = 123456789.1234540000;
        DecimalFormat df = new DecimalFormat("###0.0####");
        String s=df.format(d); 
        System.out.println(s);
显示结果:
123456789.12345



2017-09-16 遇到一个修饰符导致的问题

首先对方法的修饰符总结如下:按照范围从小到大排列

1.private,私有的访问权限,也是最严格的访问权限,仅只能在设置了该权限的类中访问,利用这个访问权限,表现出封装思想。
2.default,默认的访问权限,也是可以省略的访问权限,它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问。
3.protected,受保护的访问权限,它除了具有default的访问权限外,还可以在不同包中所继承的子类访问。
4.public,公有的访问权限,也是最宽松的访问权限,不仅可以是同一个类或子类,还是同一个包中的类或子类,又还是不同包中的类或子类,都可以访问。
下面是问题描述:抽象父类PizzaStore和实现父类抽象方法的子类位置如图,抽象方法都是默认的defualt修饰符。不在一个包下导致方法无法在子类中可见。
这里写图片描述
然后子类就会出现这样的错误:
这里写图片描述
这两处错误的理解:
类上的错误是由于子类没有实现父类的抽象方法。
方法上的错误是由于用@override,但是由于defualt,子类的这个方法父类无法看到,就以为没有这个方法。就报错了。
这时。如果在父类的抽象方法上把修饰符改成protected 则子类上的错误就消失了。但方法上的错误还在,这时在方法上加上protected,则不在报错。



2017-09-19 easyui提交表单时,用serializeArray后,如何给参数接着添加别的参数?

//先获得表单中的参数
var querydata=$("#addForm").serializeArray();
//为参数集合补充缺少的参数,用push方法
querydata.push({name:"salecom",value:$("#currentno").val()});
querydata.push({name:"contno",value:contno});



2017-09-20 查看本机ip,物理地址mac 命令,和测试ip端口是否通

ipconfig -all

telnet  ip  端口
例如:telnet 10.102.37.32 3568



2017-09-20 easyui js 取消复选框和删除动作给确认提示

$('#tt').datagrid('clearSelections');

function deleteFunction(){
    if(confirm("确认要删除吗?")){
        //do something...
    }else{
    //取消动作。
    }
}



2017-09-21 insert into () select表复制语句来实现表数据初始化。

1.为表sp_policy_functionConfig初始化   一步到位

insert into sp_policy_functionConfig(salemangecom,salecom,plancode,useelecpolicy,usepaperpolicy,adduser,addtime) select managecom,salecom,plancode,'Y','Y','admin',sysdate from soa_datadict_salecom,soa_datadict_plan order by managecom,salecom;

2.为表sp_policy_queryrange初始化。分两步
insert into sp_policy_queryrange(salemanagecom) select distinct managecom from soa_datadict_com where managecom <> '0';

update sp_policy_queryrange set queryrange='MA',operator='wow',operatetime=current timestamp,enabled='Y' WHERE SALEMANAGECOM in (select distinct managecom from soa_datadict_com where managecom <> '0');

也可以合成一步:
insert into sp_policy_queryrange(salemanagecom,queryrange,operator,operatorcode,operatetime,enabled) select distinct managecom,'MA''admin','admin',current timestamp,'Y' from soa_datadict_comwhere managecom <> '0';

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/77850667
今日推荐