查看: 1050|回复: 0

[Mysql数据库] 【寒假学Java】 第四天收获: 随机数,可变参数,JDBC,访问控制

发表于 2018-2-28 08:04:27
正文之前

突遭大变,家道中落。竟沦落至此!!可悲可叹!!!
好吧, 就是昨晚停电了不是,然后早上起来来电了。美滋滋!!!施施然起床,洗脸刷牙,再回首!又停电??!!!WTF?至今都还没来!!只能继续依靠(充电)宝儿苟活,持续飞行(mode),聊以《一世之尊》此书度日!!辅以《java编程思想》,好不快哉!!?

正文 第一点:随机数的巧妙!
  1. public static void main(String[] args) {
  2. // for(int i=9999;i>999;--i){
  3. // zombieNum(i);
  4. // }
  5. Random rand=new Random(50);
  6. int [] a;
  7. a=new int[rand.nextInt(40)];
  8. for(int x:a){
  9. x=rand.nextInt(30);
  10. System.out.print(x+" ");
  11. }
  12. System.out.println("\n\nThe Length of Array is: "+a.length);
  13. }
复制代码
  1. 18 23 22 1 1 16 18 6 28 20 2 0 5 8 12 2 17 5 22 5 3 1 1 2 14 28 5 6 26 20 27 26 24 26 14 2 26
  2. The Length of Array is: 37
  3. [Finished in 1.4s]
复制代码

这个结果不论你运行多少次,都会是一样的,我明明用的是Random啊,Java你哄我啊呢???What Random?But, 关键是seed,以前在C++里面也有,现在不过是换了个花样!关键在此!!

  1. Random rand=new Random(50);
复制代码

若是把上文中的50去掉,那么每一次运行的结果都不一样。如果换掉另一个数,那么再次运行也会产生一个始终一致的结果,假如我换为30,运行就会一直如下:

  1. 18 5 4 16 8 16
  2. The Length of Array is: 6
  3. [Finished in 1.5s]
复制代码

但是如果里面啥都不填写,保持默认值,那么运行一次就会有不同的结果:

  1. 19
  2. The Length of Array is: 1
  3. [Finished in 1.5s]
复制代码
  1. 22 13 10 4 13 2 18 28
  2. The Length of Array is: 8
  3. [Finished in 1.5s]
复制代码
  1. 17 1 22 1 2 25 23 12 27 16 23 24 19 29 12 6 23
  2. The Length of Array is: 17
  3. [Finished in 1.5s]
复制代码

这时候又发现一个奥妙,那么就是,随机出来的数受限于下列代码中的数字。

  1. a=new int[rand.nextInt(40)];
  2. x=rand.nextInt(30);
复制代码

也即是不会 超过40/30 ,这就是界限!我们可以认为 的规定随机出来的数字的范围。

突发奇想,试验下蒙特卡洛的圆周率计算法了!!很简单的想法,一个边长为2的正方形内切一个半径为1 的圆,然后随机丢点,在圆内的点是总的点的pi/4这个大概的概率,所以只要算出这个比例,乘以4??4就是pi了。代码如下:

  1. public static void main(String[] args) {
  2. // for(int i=9999;i>999;--i){
  3. // zombieNum(i);
  4. // }
  5. Random rand=new Random();
  6. double [] a=new double[100000];
  7. double [] b=new double[100000];
  8. for(int i=0;i<100000;++i){
  9. a[i]=((double)rand.nextInt(1000))/1000;
  10. // System.out.print(a[i]+" ");
  11. }
  12. Random rnd=new Random();
  13. for(int i=0;i<100000;++i){
  14. b[i]=((double)rnd.nextInt(1000))/1000;
  15. // System.out.print(b[i]+" ");
  16. }
  17. // System.out.println(a[100]+" "+b[100]);
  18. **** int count=0;
  19. for(int i=0;i<100000;++i){
  20. if((a[i]*a[i]+b[i]*b[i])<1){
  21. count++;
  22. }
  23. }
  24. System.out.println((double)count/100000*4);
  25. // System.out.println("\n\nThe Length of Array is: "+a.length);
  26. }
复制代码

The Result:

  1. 3.14608
  2. [Finished in 1.4s]
复制代码
第二点:可变参数与自动包装机制

可变参数列表这是哪儿都逃不开的问题。当然,C++里面用容器我感觉挺好的,虽然感觉容器就是也该加强版的可变长数组以及自由特性的数组吧!

可变参数列表言简意赅! 看代码: 自动包装机制类似于多态,可以传入一个子类到形参为父类的地方

二者结合,很骚气!!比如用Object做可变长形参的!!骚操作啊!!!!废话不多说:看代码:

  1. public static void CV(Object... s){
  2. System.out.println("The length of the Object is :"+s.length);
  3. System.out.println("The kind of the Object is :"+s.getClass());
  4. for(Object x:s){
  5. System.out.println(x);
  6. }
  7. }
  8. public static void main(String[] args) {
  9. Random rand=new Random();
  10. int a=rand.nextInt(20);
  11. int b=rand.nextInt(20);
  12. int c=rand.nextInt(20);
  13. CV(a,b,c);
  14. String s1=new String("No .1");
  15. String s2=new String("No .2");
  16. String s3=new String("No .3");
  17. CV(s1,s2,s3);
  18. }
复制代码

The Result:

  1. The length of the Object is :3
  2. The kind of the Object is :class [Ljava.lang.Object;
  3. 12
  4. 7
  5. 5
  6. The length of the Object is :3
  7. The kind of the Object is :class [Ljava.lang.Object;
  8. No .1
  9. No .2
  10. No .3
  11. [Finished in 1.6s]
复制代码

Object 不知道我前面讲过没?所有类的头头,所有对象的父类或者往上肯定是他没错的!

不知道把零散的一些元素打包成数组算是打包机制不?我觉得四啊!!《Java编程思想》里面说把int 的零散元素打包成Integer算是,或者是把char打包到Character算是的。那就是啊吧!这些东西现在搞这么清白干嘛???啊?上天啊!!

第三点:枚举类型 enum

这个东西只说一点:与switch可以搭配使用,这就很骚了!!以前因为在有限范围内做switch老是会要变成1,2,3,4这些整形数,虽然简单了,但是确实看起来比较费劲啊。十年之后鬼还记得你这是啥?所以用枚举简直就是贴合人类的设计啊!至于那一丁点的损耗?那也叫事???

  1. public static enum Mei{
  2. Zhang,Yan
  3. }
  4. public static void main(String[] args) {
  5. Mei BG=Mei.Zhang;
  6. switch (BG) {
  7. case Zhang:
  8. System.out.println("颜雨薇,我好想你啊!");
  9. break;
  10. case Yan:
  11. System.out.println("张照博,我好喜欢你的!");
  12. break;
  13. }
  14. }
复制代码

简单点说的话就是可以作为一个集合,你可以看做是1-10这种组合,当然如果要使用。不需要new,只要定义下。比如说Mei作为一个枚举集合,如果要使用其中的Zhang,那么就只要

  1. Mei x=Mei.Zhang
复制代码

就ok的。跟基本数据类型很相似啊!!!

第四点:好神奇的Static啊!!

今天看到了《Java编程思想》的第6章,访问控制,发现了一个很神奇,虽然我早知道了但是还没有吃透的东西--Static,具体的请看下面的代码:

  1. import java.util.*;
  2. class Xa{
  3. public static int TY(){
  4. System.out.println("Can I have a try?");
  5. return 0;
  6. }
  7. }
  8. public static enum Mei{
  9. Zhang,Yan
  10. }
  11. public static void main(String[] args) {
  12. Random rand=new Random();
  13. Mei BG=Mei.Zhang;
  14. switch (BG) {
  15. case Zhang:
  16. System.out.println("颜雨薇,我好想你啊!");
  17. break;
  18. case Yan:
  19. System.out.println("张照博,我好喜欢你的!");
  20. break;
  21. }
  22. int s=Xa.TY();
  23. System.out.println(s);
  24. }
  25. }
复制代码

The Result:

  1. /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=52223:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/zhangzhaobo/IdeaProjects/Java_Program_Spirit/out/production/Java_Program_Spirit Java_Program_Spirit
  2. 颜雨薇,我好想你啊!
  3. Can I have a try?
  4. 0
  5. Process finished with exit code 0
复制代码

可以看到,静态的方法根本不需要定义一个对象,它的存在只与自身有关,也就是说定义了它,那么要用到它的第一时间它就会实例化!所以这其实就跟C++里面直接在最外层定义一个函数是一个道理,要用到就直接调用即可,当然Java是面向对象编程的,所以前头还得加个类名才可以!!

第五点:访问权限控制

default就是没有控制符的意思,private用于类“助手”的成员。protected用于一些想要在包内继承的地方,而对于包外就没那么友好了。至于public最为开放也最受人们喜爱。default,既可以偷懒,而且防范的也挺不错的。老实说对于这些访问控制的理解我还不够,现在也不需要那么深刻。以后再说吧!

第六点:JDBC,Java结合数据库Mysql操作,可以做好东西啦!!

具体的配置参考下面几篇文章你就会了,记得按照我的顺序来:

1. Mac 如何配置JDBC的教程,Windows类似intelliJ IDEA for mac with JDBC

2. 下载JDBC的替代,国内版

3. 配置好之后的使用手段

看我的代码:

  1. import java.sql.*;
  2. public class JDBC_Test {
  3. public static void main(String[] args){
  4. String driver = "com.mysql.jdbc.Driver";
  5. String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=GBK";
  6. String user = "root";
  7. String password = "root";
  8. try {
  9. Class.forName(driver);
  10. Connection conn = DriverManager.getConnection(url, user, password);
  11. if(!conn.isClosed())
  12. System.out.println("Succeeded connecting to the Database!");
  13. Statement statement = conn.createStatement();
  14. String sql = "select * from tcount_tbl";
  15. String insert = "insert into tcount_tbl(runoob_author,runoob_count) values(\"张照博\",50)";
  16. // String delete = "delete from tcount_tbl where runoob_author = \"RUNOOB.COM\" ";
  17. boolean rs1 = statement.execute(insert);
  18. // boolean rs1 = statement.execute(delete);
  19. ResultSet rs = statement.executeQuery(sql);
  20. System.out.println("-----------------");
  21. System.out.println("执行结果:");
  22. System.out.println("-----------------");
  23. System.out.println(" Name" + "\t\t" + " ID");
  24. System.out.println("-----------------");
  25. String name = null;
  26. while(rs.next()) {
  27. name = rs.getString("runoob_author");
  28. name = new String(name.getBytes("UTF-8"),"UTF-8");
  29. System.out.println(name+ "\t\t" + rs.getString("runoob_count") );
  30. }
  31. rs.close();
  32. conn.close();
  33. } catch(ClassNotFoundException e) {
  34. System.out.println("Sorry,can`t find the Driver!");
  35. e.printStackTrace();
  36. } catch(SQLException e) {
  37. e.printStackTrace();
  38. } catch(Exception e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
复制代码

我的代码与上面第三个教程略有不同,主要集中于对编码方式的设置。

  1. String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=GBK";
  2. name = new String(name.getBytes("UTF-8"),"UTF-8");
复制代码

具体来说是上面两句,大家伙自己体会其中的差别哦,我先溜了!!效果如下:

  1. /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=57104:/Applications/IntelliJ IDEA.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Users/zhangzhaobo/IdeaProjects/JDBC/out/production/JDBC:/Applications/IntelliJ IDEA.app/Contents/lib/mysql-connector-java-5.1.44-bin.jar" JDBC_Test
  2. Sun Jan 28 23:58:57 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
  3. Succeeded connecting to the Database!
  4. -----------------
  5. 执行结果:
  6. -----------------
  7. Name ID
  8. -----------------
  9. 菜鸟教程 10
  10. Google 22
  11. 今日成神 11
  12. 张照博 50
  13. Process finished with exit code 0
复制代码
正文之后

今天到此为止,真的沉迷小说不可自拔了。今天看了三四个小时了!!烦躁!另外,今天主要是冒雪出去买了零食,还有就是揭开井盖然后把水泵调整了位置。解决了家中饮水问题!!我觉得自己还是很6的,有图为证:

揭开井盖的我,心中MMP,野外的老鼠跑起来飞快的,不像我室友那种残疾家养的



回复

使用道具 举报