hello world
获取发送http请求的设备类型
一:获得浏览器请求头中的User-Agent
String ua = request.getHeader("User-Agent")
二:获得浏览器类型,操作系统类型:(注意,UserAgent类在UserAgentUtils.jar中,自行下载)
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
OperatingSystem os = userAgent.getOperatingSystem();
关于for-each语法遍历集合操作
假设现有两个集合
List list1 = Arrays.asList(new Integer[]{1,2,3,4});
List list2 = new ArrayList();
for(int i=1;i<=4;i++){
list2.add(new User(i));
}
其中对象类User的结构为
public Class User{
private Integer id;
public User(){
}
public User(Integer id){
this.id = id;
}
public setId(Integer id){
this.id = id;
}
public Integer getId(){
return this.id;
}
}
现对list1做for-each操作
for(Integer i : list1){
i = 123;
}
list1.forEach(i->System.out.println(i));
控制台打印日志为
1
2
3
4
现对list2做for-each操作
for(User i : list2){
i.setId(123);
}
list2.forEach(i->System.out.println(i.getId()));
控制台打印日志为
123
123
123
123
问题:已在for-each迭代器中对集合list1中的元素做了i.valueOf(123)操作,但为什么集合list1中的元素打印出来的结果并不是123?
暂时未查明是何原因导致此结果,有空时再查源码及资料
暂时对引起对此现象的原因进行推测:
当集合中元素的类型是java自带的原始数据类型(byte、short、int、long、boolean、char、float、double)及java自带的上述类型的封装类(如String,Integer,Boolean等)时,
集合for-each遍历的元素作为一个新的值保存在JVM中新的堆内存地址
当集合中元素的类型不是java自带的原始数据类型或java自带的封装类时,
集合for-each遍历的元素作为一个对象的地址引用指向JVM中旧的堆内存地址
其结论就是,1.for-each操作的元素与集合中的元素并不是在相同的JVM栈内存中
2.for-each操作的元素是java自带原始数据类型或其封装类型时,操作的元素与集合中的元素保存在不同的堆内存地址
3.for-each操作的元素是自定义的对象类型时,操作的元素与集合中的元素保存在相同的堆内存地址
4.集合list1及list2打印出来的值均是原集合的JVM堆内存地址中的值。根据结论2及3,list1的值在for-each操作中并没有被更改,而list2的值在for-each操作中被更改了
5.其实就是值传递和地址传递的区别
P.S.需要对java迭代器关于集合元素在JVM中的内存操作进行更多的探索
参考资料https://www.cnblogs.com/ibelieve618/p/6380328.html
https://www.cnblogs.com/itcqx/p/5850231.html
欲了解更多,请阅览不怎么更新的笔记内容>
备案号(粤ICP备18070736号)