String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf(i); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? 以下是答案: 第一种方法:s=i+""; //会产生两个String对象 第二种方法:s=String.valueOf(i); //直接使用String类的静态方法,只产生一个对象 第一种方法:i=Integer.parseInt(s);//直接使用静态方法,不会产生多余的对象,但会抛出异常 第二种方法:i=Integer.valueOf(s).intValue();//Integer.valueOf(s) 相当于 new Integer(Integer.parseInt(s)),也会抛异常,但会多产生一个对象 ——————————————————————-- 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i = Integer.valueOf(my_str).intValue(); 注: 字串转成 Double, Float, Long 的方法大同小异. 2 如何将整数 int 转换成字串 String ? A. 有叁种方法: 1.) String s = String.valueOf(i); 2.) String s = Integer.toString(i); 3.) String s = "" + i; 注: Double, Float, Long 转成字串的方法大同小异. JAVA数据类型转换 […]
View Details这里使用Random类的nextInt()方法来生成,生成[min,max]区间的随机整数公式: Random rand=new Random(); rand.nextInt(max- min+ 1) + min; 这里封装成方法了:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * 求[Min,Max]区间之间的随机整数。 * @param Min 最小值 * @param Max 最大值 * @return 一个Min和Max之间的随机整数 */ public static int randomIntMinToMax(int Min, int Max) { //如果相等,直接返回,还生成个屁 if(Min==Max) { return Max; } //如果Min比Max大,交换两个的值,如果不交换下面nextInt()会出错 if(Min>Max) { Min^=Max; Max^=Min; Min^=Max; } Random rand=new Random();//nextInt()不是静态方法,不能直接用类名调用 return rand.nextInt(Max - Min + 1) + Min; } |
实例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
package random; import java.util.Random; public class GetRandom { public static void main(String[] args) { Random rand = new Random(); int Min = 0; int Max = 9; int[] count = new int[Max - Min + 1]; for (int i = 0; i < 10000; i++) { count[randomIntMinToMax(Min, Max)]++; } System.out.println(); char percentCh = '%'; for (int i = 0; i < count.length; i++) { double percent = 100 * (double) count[i] / 10000; System.out.printf("%d生成次数:%-4d,占百分比:%.2f%c\n", i, count[i], percent, percentCh); } } /** * 求[Min,Max]区间之间的随机整数。 * * @param Min * 最小值 * @param Max * 最大值 * @return 一个Min和Max之间的随机整数 */ public static int randomIntMinToMax(int Min, int Max) { // 如果相等,直接返回,还生成个屁 if (Min == Max) { return Max; } // 如果Min比Max大,交换两个的值,如果不交换下面nextInt()会出错 if (Min > Max) { Min ^= Max; Max ^= Min; Min ^= Max; } Random rand = new Random();// nextInt()不是静态方法,不能直接用类名调用 return rand.nextInt(Max - Min + 1) + Min; } } |
运行结果:
|
1 2 3 4 5 6 7 8 9 10 |
0生成次数:998 ,占百分比:9.98% 1生成次数:962 ,占百分比:9.62% 2生成次数:1005,占百分比:10.05% 3生成次数:1020,占百分比:10.20% 4生成次数:1020,占百分比:10.20% 5生成次数:997 ,占百分比:9.97% 6生成次数:966 ,占百分比:9.66% 7生成次数:1002,占百分比:10.02% 8生成次数:1006,占百分比:10.06% 9生成次数:1024,占百分比:10.24% |
from:https://blog.csdn.net/qq_21808961/article/details/80526231
View Details什么是伪随机数? 1.伪随机数是看似随机实质是固定的周期性序列,也就是有规则的随机。 2.只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。 (随机这个属性和算法本身就是矛盾的) 3.通过真实随机事件取得的随机数才是真随机数。 Java随机数产生原理: Java的随机数产生是通过线性同余公式产生的,也就是说通过一个复杂的算法生成的。 伪随机数的不安全性: Java自带的随机数函数是很容易被黑客破解的,因为黑客可以通过获取一定长度的随机数序列来推出你的seed,然后就可以预测下一个随机数。 不用种子的不随机性会增大的原因: java.Math.Random()实际是在内部调用java.util.Random()的,使用一个和当前系统时间有关的数字作为种子数。两个随机数就很可能相同。 double a = Math.random(); double b = Math.random(); Random r1 = new Random(); r1.nextInt(10); Random r2 = new Random(); r2.nextInt(10); Java中产生随机数的方法有两种: 第一种:Math.random() 第二种:new Random() 一、java.lang.Math.Random: 调用这个Math.Random()函数能够返回带正号的double值,取值范围是[0.0,1.0),在该范围内(近似)均匀分布。因为返回值是double类型的,小数点后面可以保留15位小数,所以产生相同的可能性非常小,在这一定程度上是随机数。 二、java.util.Random: Random r1 = new Random(); Random r2 = new Random(); Random r3 = new Random(10); Random r4 = […]
View Details时间有关 +1s 1、获取当前毫秒数
|
1 |
long t1=System.currentTimeMillis(); |
2、毫秒数转换为时间
|
1 2 3 |
Date date2=new Date(); date2.setTime(t1); System.err.println(date2); |
3、时间格式化
|
1 2 3 |
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); String fmDate=simpleDateFormat.format(date2); System.err.println(fmDate); |
4、字符串格式时间获取毫秒数
|
1 2 3 4 |
String sdate = "2018-06-01 06-06-06"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); long time = simpleDateFormat.parse(sdate).getTime(); System.err.println(time); |
5、毫秒数的计算 把两个毫秒数差值传进来就可以看见相差多久 原贴:https://blog.csdn.net/sunshinestation/article/details/4568946
|
1 2 3 4 5 6 7 8 |
public static String formatDuring(long mss) { long days = mss / (1000 * 60 * 60 * 24); long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60); long seconds = (mss % (1000 * 60)) / 1000; return days + " days " + hours + " hours " + minutes + " minutes " + seconds + " seconds "; } |
6、java api提供的方法: 待续 7、时间插入数据库 先转换成yyyy-MM-dd HH:mm:ss这个格式,然后可以以字符串格式插入
|
1 2 3 |
Date date=new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String fmDate=simpleDateFormat.format(date); |
——————— 作者:云驿 来源:CSDN 原文:https://blog.csdn.net/sinat_32238399/article/details/80512452 版权声明:本文为博主原创文章,转载请附上博文链接!
View Details1. 用math.random()实现,比较麻烦的一种方式,思路是:math.random()生成的是[0.0, 1.0)的伪随机数,如果 当前值是0.9…,则直接*1000000返回,其他情况可能生成0.8…,0.03…,0.0003…,这些情况都*1000000,但是结果可能是6位,5位,4位都有可能,那么再加上100000,肯定就保证是6位了。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for (int i = 0; i <= 200; i++) { int intFlag = (int)(Math.random() * 1000000); String flag = String.valueOf(intFlag); if (flag.length() == 6 && flag.substring(0, 1).equals("9")) { System.out.println(intFlag); } else { intFlag = intFlag + 100000; System.out.println(intFlag); } } |
2. 面试可以用到的一种方式,一行代码实现,思路是:math.random()范围是[0.0, 1.0),那么math.random()*9+1一定是小于10的,(Math.random()*9+1)*100000一定是<10*100000=1000000的一个数
|
1 2 3 |
for(int j = 0; j< 100; j++){ System.out.println((int)((Math.random()*9+1)*100000)); } |
3. random.nextInt(10)意思是返回大于等于0,小于10的一个正整数, 既然是生成6位随机数,每个数一定是0-9之内的,我循环6次,每次从0-9随机选取一个数字拼接字符串返回,不就行了。
|
1 2 3 4 5 6 7 |
Random random = new Random(); String result=""; for (int i=0;i<6;i++) { result+=random.nextInt(10); } System.out.println(result); |
4. random.nextInt(10)知道是什么意思了,最大的6位数是999999,最小的六位数是100000,我想到了下面的方法:
|
1 2 3 4 5 6 7 8 9 |
for (int i = 0; i <= 100; i++) { int flag = new Random().nextInt(999999); if (flag < 100000) { flag += 100000; } System.out.println(flag); } |
5. 最后的一种方法,是引入了一个source字符串,从这个字符串里可以随机生成一个子串返回,很多pc网站用这个方法生成带字母数字的验证码,原理类似3
|
1 2 3 4 5 6 7 8 9 10 11 |
for (int i = 0; i <= 100; i++) { String sources = "0123456789"; // 加上一些字母,就可以生成pc站的验证码了 Random rand = new Random(); StringBuffer flag = new StringBuffer(); for (int j = 0; j < 6; j++) { flag.append(sources.charAt(rand.nextInt(9)) + ""); } System.out.println(flag.toString()); } |
ps: math.random()生成的是个伪随机数,何为伪随机数,这里java是以当前系统时间的相关数字作为种子数,按照特定复杂算法生成的,其实它生成的大量随机数是线性均匀分布的,黑客是完全可能通过返回的大量随机数结果破解种子数的,所以它并不是真正的随机,叫伪随机数。由此我们可以知道通过计算机生成一个真随机数几乎是不可能的,因为最终的输出结果都是依赖算法程序的,这些算法程序本身就是固定的,我们只能通过更复杂的算法不断优化,让它无限趋近于真随机数,但不绝对。 参考:http://www.cnblogs.com/greatfish/p/5845924.html ——————— 作者:流浪猫走失了 来源:CSDN 原文:https://blog.csdn.net/u012491783/article/details/76862526 版权声明:本文为博主原创文章,转载请附上博文链接!
View DetailsfastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用LinkedHashMap代替HashMap。 以下为实例:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static void main(String[] args) { String jsonStr = "{\"size\":\"7.5\",\"width\":\"M (B)\"}"; System.out.println("无序遍历结果:"); JSONObject jsonObj = JSON.parseObject(jsonStr); for (Map.Entry<String, Object> entry : jsonObj.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } System.out.println("-------------------"); System.out.println("有序遍历结果:"); LinkedHashMap<String, String> jsonMap = JSON.parseObject(jsonStr, new TypeReference<LinkedHashMap<String, String>>() { }); for (Map.Entry<String, String> entry : jsonMap.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } |
from:https://www.cnblogs.com/seely/p/5715512.html
View Details遍历JsonArray
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// 一个未转化的字符串 String str = "[{name:'a',value:'aa'},{name:'b',value:'bb'},{name:'c',value:'cc'},{name:'d',value:'dd'}]" ; // 首先把字符串转成 JSONArray 对象 JSONArray json = JSONArray.fromObject(str ); if(json.size()>0){ for(int i=0;i<json.size();i++){ // 遍历 jsonarray 数组,把每一个对象转成 json 对象 JSONObject job = json.getJSONObject(i); // 得到 每个对象中的属性值 System.out.println(job.get("name")+"=") ; } } |
遍历JsonObject
|
1 2 3 4 5 6 7 8 |
JSONObject jsonObject = new JSONObject(s); //然后用Iterator迭代器遍历取值,建议用反射机制解析到封装好的对象中 JSONObject jsonObject = new JSONObject(jsonString); Iterator iterator = jsonObject.keys(); while(iterator.hasNext()){ key = (String) iterator.next(); value = jsonObject.getString(key); } |
from:https://blog.csdn.net/changhenshui1990/article/details/69950663/
View DetailsGUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值。 GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:76895313-839E-4E89-BAFC-B253BFF3173F 世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。 1.SQL Server数据库 以前开发SQL Server数据库将表定义中将列类型指定为uniqueidentifier,则列的值就为 GUID 类型。 2.使用T-SQL生产一个GUID insert into table1(id,name,…) values(NewID(),’张三',…) 3.在C#中创建一个GUID Guid guid = Guid.NewGuid(); Console.Writeln(guid.ToString()); 4.在Java中创建UUID 在网上查资料才知道在Java中,变成了UUID。创建方式也出奇简单System.out.println( java.util.UUID.randomUUID()); 摘自:http://qfqf16.blog.163.com/blog/static/128109527201272610564410/ from:https://www.cnblogs.com/shirley-1019/archive/2013/07/31/3227671.html
View Details由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题。 刚开始没做任何处理,用jsonp的方式调用 web api 接口,总是报一个错误,如下: 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的:
|
1 |
{"YourSignature":"嫁人要嫁程序员,钱多话少死得早"} |
然而,JSONP请求期望得到这样的JSON:
|
1 |
jQuery123456([{"YourSignature":"嫁人要嫁程序员,钱多话少死得早"}]) |
所以我们需要对WebAPI做拓展,让它支持这样的callback 解决方案如下: 只需要给全局注册一个JsonCallbackAttribute,就可以判断接口的访问是属于跨域,还是非跨域,正常的返回。 因为我们的接口,可能是用来给 移动端(Android 、IOS)做数据接口,也有可能是给网站用,所以,考虑到可能存在跨域的问题。
|
1 |
GlobalConfiguration.Configuration.Filters.Add(new JsonCallbackAttribute()); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class JsonCallbackAttribute : ActionFilterAttribute { private const string CallbackQueryParameter = "callback"; public override void OnActionExecuted(HttpActionExecutedContext context) { var callback = string.Empty; if (IsJsonp(out callback)) { var jsonBuilder = new StringBuilder(callback); jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result); context.Response.Content = new StringContent(jsonBuilder.ToString()); //context.Response.Content = new StringContent("C(\"a\")"); } base.OnActionExecuted(context); } private bool IsJsonp(out string callback) { callback = System.Web.HttpContext.Current.Request.QueryString[CallbackQueryParameter]; return !string.IsNullOrEmpty(callback); } |
结合下面图片不难开出,请求的地址带回了,callback的参数标识。 测试代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<html> <head> <title>团队信息列表</title> <script type="text/javascript" src="@Url.Content("~/scripts/jquery-1.7.1.js")"></script> </head> <body> <ul id="contacts"></ul> <script type="text/javascript"> $(function () { $.ajax({ Type: "GET", url: "http://app.uni2uni.com/api/CloudService/GetAllGroup", dataType: "jsonp", success: listContacts }); }); function listContacts(contacts) { alert(contacts); $.each(contacts.data, function (index, contact) { var html = "<li><ul>"; html += "<li>GroupName: " + contact.GroupName + "</li>"; html += "<li>GroupPicture:" + contact.GroupPicture + "</li>"; html += "</ul>"; $("#contacts").append($(html)); }); } </script> </body> </html> |
返回接口如下: 相关文章推荐:http://diaosbook.com/Post/2013/12/27/tips-for-aspnet-webapi-cors from:https://www.cnblogs.com/Kummy/p/3767269.html
View Details在日常的项目开发时会不可避免的需要进行跨域操作,而在实际进行跨域请求时,经常会遇到类似 No 'Access-Control-Allow-Origin' header is present on the requested resource.这样的报错。 这样的错误,一般是由于CORS跨域验证机制设置不正确导致的,本文将详细讲解CORS跨域验证机制的原理,让您轻松掌握CORS跨域设置的使用方法,安全、方便的进行前端开发。 什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。 例如最常见的,在一个域名下的网页中,调用另一个域名中的资源。 相对于上面这种静态的调用方式,还可以通过Ajax技术来动态发起跨域请求。例如如下的方式,利用XMLHttpRequest对象发送一个GET请求,获取另一个域名下的图片内容。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<!DOCTYPE html> <html> <head>CORS Test</head> <body> <div id="img_Div"></div> <script type="text/javascript"> //XmlHttpRequest对象 function createXmlHttpRequest(){ if(window.ActiveXObject){ //如果是IE浏览器 return new ActiveXObject("Microsoft.XMLHTTP"); }else if(window.XMLHttpRequest){ //非IE浏览器 return new XMLHttpRequest(); } } function getFile() { var img_Container = document.getElementById("img_Div"); var xhr = createXmlHttpRequest(); xhr.open('GET', 'http://oss.youkouyang.com/1.jpg', true); xhr.setRequestHeader('Content-Type', 'image/jpeg'); xhr.responseType = "blob"; xhr.onload = function() { if (this.status == 200) { var blob = this.response; var img = document.createElement("img"); img.onload = function(e) { window.URL.revokeObjectURL(img.src); }; img.src = window.URL.createObjectURL(blob); img_Container.appendChild(img); } } xhr.send(null); } </script> <div class="row"> <input type="button" onclick="getFile()" value="Get" /> </div> </body> </html> |
CORS的作用 为了改善网络应用程序,开发人员要求浏览器供应商允许跨域请求。跨域请求主要用于: 调用XMLHttpRequest或fetchAPI通过跨站点方式访问资源 网络字体,例如Bootstrap(通过CSS使用@font-face 跨域调用字体) 通过canvas标签,绘制图表和视频。 CORS的安全隐患 跨域请求和Ajax技术都会极大地提高页面的体验,但同时也会带来安全的隐患,其中最主要的隐患来自于CSRF(Cross-site request forgery)跨站请求伪造。 CSRF攻击的大致原理是: 用户通过浏览器,访问正常网站A(例如某银行),通过用户的身份认证(比如用户名/密码)成功A网站。 网站A产生Cookie信息并返回给用户的浏览器; 用户保持A网站页面登录状态,在同一浏览器中,打开一个新的TAB页访问恶意网站B; 网站B接收到用户请求后,返回一些攻击性代码,请求A网站的资源(例如转账请求); 浏览器执行恶意代码,在用户不知情的情况下携带Cookie信息,向网站A发出请求。 网站A根据用户的Cookie信息核实用户身份(此时用户在A网站是已登录状态),A网站会处理该请求,导致来自网站B的恶意请求被执行。 CORS验证机制 出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略, 即JavaScript或Cookie只能访问同域下的内容。 W3C推荐了一种跨域的访问验证的机制,即CORS(Cross-Origin Resource Sharing 跨源资源共享)。 这种机制让Web应用服务器能支持跨站访问控制,使跨站数据传输更加安全,减轻跨域HTTP请求的风险。 CORS验证机制需要客户端和服务端协同处理。 CORS浏览器支持情况 目前主流浏览器都已基本提供对跨域资源共享的支持,移动端浏览器也几乎全部支持。 客户端处理机制 基于上述的CSRF的风险,各主流的浏览器都会对动态的跨域请求进行特殊的验证处理。验证处理分为简单请求验证处理和预先请求验证处理。 简单请求 当请求同时满足下面两个条件时,浏览器会直接发送GET请求,在同一个请求中做跨域权限的验证。 请求方法是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain 简单请求时,浏览器会直接发送跨域请求,并在请求头中携带Origin 的header,表明这是一个跨域的请求。 服务器端接到请求后,会根据自己的跨域规则,通过Access-Control-Allow-Origin和Access-Control-Allow-Methods响应头,来返回验证结果。 如果验证成功,则会直接返回访问的资源内容。 如果验证失败,则返回403的状态码,不会返回跨域请求的资源内容。 可以通过浏览器的Console查看具体的验证失败原因 预先请求 当请求满足下面任意一个条件时,浏览器会先发送一个OPTION请求,用来与目标域名服务器协商决定是否可以发送实际的跨域请求。 请求方法不是下列之一: GET HEAD POST 请求头中的Content-Type请求头的值不是下列之一: application/x-www-form-urlencoded multipart/form-data text/plain 浏览器在发现页面中有上述条件的动态跨域请求的时候,并不会立即执行对应的请求代码,而是会先发送Preflighted requests(预先验证请求),Preflighted requests是一个OPTION请求,用于询问要被跨域访问的服务器,是否允许当前域名下的页面发送跨域的请求。 OPTIONS请求头部中会包含以下头部:Origin、Access-Control-Request-Method、Access-Control-Request-Headers。 服务器收到OPTIONS请求后,设置Access-Control-Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers头部与浏览器沟通来判断是否允许这个请求。 如果Preflighted requests验证通过,浏览器才会发送真正的跨域请求。 如果Preflighted requests验证失败,则会返回403状态,浏览器不会发送真正的跨域请求。 可以通过浏览器的Console查看具体的验证失败原因 […]
View Details