根据凸多边形顶点坐标来计算面积的算法与实现

把凸多边形划分成若干个三角形,取多边形的一个顶点为三角形共同顶点

double x0 = x.get(0);
double y0 = y.get(0);

三角形个数 = 坐标对数 – 2

// 每个三角形的三条边 i从0开始
double s1 = Math.sqrt(Math.pow(x0 - x.get(i + 1), 2) + Math.pow(y0 - y.get(i + 1), 2));
double s2 = Math.sqrt(Math.pow(x0 - x.get(i + 2), 2) + Math.pow(y0 - y.get(i + 2), 2));
double s3 = Math.sqrt(Math.pow(x.get(i + 1) - x.get(i + 2), 2) + Math.pow(y.get(i + 1) - y.get(i + 2), 2));
// 每个三角形的面积
double s = (s1 + s2 + s3) / 2;
double area = Math.pow((s * (s - s1) * (s - s2) * (s - s3)), 1.0 / 2);

Java实现代码等待一段时间后执行

方法一:线程睡眠,根据系统计时器和调度程序的精度和准确性,使当前正在执行的线程进入休眠状态(暂时停止执行)达指定的毫秒数。 该线程不会失去任何监视器的所有权,参数单位是毫秒

Thread.sleep(3000); // 毫秒

// 特殊情况
Thread.currentThread().sleep(1000); // 毫秒

方法二:java.util.concurrent.TimeUnit 类中的 sleep() 方法,底层调用的也是线程睡眠

import java.util.concurrent.TimeUnit;

TimeUnit.DAYS.sleep(1); // 天
TimeUnit.HOURS.sleep(1); // 小时
TimeUnit.MINUTES.sleep(1); // 分
TimeUnit.SECONDS.sleep(1); // 秒
TimeUnit.MILLISECONDS.sleep(1000); // 毫秒
TimeUnit.MICROSECONDS.sleep(1000); // 微妙
TimeUnit.NANOSECONDS.sleep(1000); // 纳秒

报未处理异常: java.lang.InterruptedException?
使用 try/catch 环绕

try{
    TimeUnit.MINUTES.sleep(1);
} catch (InterruptedException e) {
    e.printStackTrace();
}

微信无法登录,扫码后报错:java.lang.NumberFormatException:null

原因:微信需加JVM运行参数

找到你的IDE所在的安装目录下的bin文件夹,打开,找到你的exe运行参数文件,如(idea64.exe.vmoptions,studio64.exe.vmoptions)使用编辑器打开,在最后一行添加

-Djsse.enableSNIExtension=false
// 保存后重启IDE

也可以通过exe快捷方式添加参数,如快捷方式目标指向:

E:\Android\eclipse\eclipse.exe -nl=en -Djsse.enableSNIExtension=false

这种方式要求exe所在的路径不能带空格

*Java系统属性的修改通常只能用于本次运行

将Java系统属性Djsse.enableSNIExtension设置为false,$java -Djsse.enableSNIExtension=false
尝试运行时只输出帮助信息?解决方法:

$java -Djsse.enableSNIExtension=false MainClass
$java -Djsse.enableSNIExtension=false -jar foobar.jar

String类valueOf(int i)方法的实现

Java 库 String 类的 valueOf 方法大致可以分为三种:

  • String.valueOf(Object)
  • String.valueOf(char[])
  • String.valueOf(基本数据类型)


String.valueOf(int i)源码:

public static String valueOf(int i) {
        return Integer.toString(i);
}


Integer.toString(int i)源码:

public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(buf, true);
}


Integer.getChars(int i, int index, char[] buf)的源码:

static void getChars(int i, int index, char[] buf) {
        int q, r;
        int charPos = index;
        char sign = 0;

        if (i < 0) {
            sign = '-';
            i = -i;
        }

        // Generate two digits per iteration
        while (i >= 65536) {
            q = i / 100;
        // really: r = i - (q * 100);
            r = i - ((q << 6) + (q << 5) + (q << 2));
            i = q;
            buf [--charPos] = DigitOnes[r];
            buf [--charPos] = DigitTens[r];
        }

        // Fall thru to fast mode for smaller numbers
        // assert(i <= 65536, i);
        for (;;) {
            q = (i * 52429) >>> (16+3);
            r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
            buf [--charPos] = digits [r];
            i = q;
            if (i == 0) break;
        }
        if (sign != 0) {
            buf [--charPos] = sign;
        }
    }

其他方式实现MyString1 valueOf(int i)

public static MyString1 valueOf(int i) {
        int n;
        char[] temp;
        int count;

        if (i <= Character.MAX_VALUE)
            return new MyString1(Character.toChars(i));
        else {
            n = i % Character.MAX_VALUE;
            count = i / Character.MAX_VALUE;
            temp = new char[count + 1];
            temp[0] = (char) n;
            for (int j = 1; j <= count; j++)
                temp[j] = Character.MAX_VALUE;
            return new MyString1(temp);
        }
    }

Java提示错误: 找不到或无法加载主类

C:\Java\IdeaProjects\java>java xxxx
错误: 找不到或无法加载主类 xxxx


检查java在Idea终端中是否可用,如不可用,编辑编译器输出路径:文件→项目结构→模块→路径→输出目录 或 设置→工具→终端→项目设置→环境变量

C:\Java\IdeaProjects\java>java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)


检查java在命令行PowerShell中是否可用,如不可用配置好环境变量

PS C:\Users\XX> java
...
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
PS C:\Users\XX> java xxxx
错误: 找不到或无法加载主类 xxxx


手动拷贝项目路径下的class文件到C:\Users\XX> 下可正常执行
在各终端下cd到class文件存放路径即可“临时”解决此问题

PS C:\Java\IdeaProjects\java\out\production\first> java Demo
OK

Java精确计算闰年

闰年366天(2月中多一天),闰年2月29天
普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年)
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)

import java.util.Scanner;
public class LeapYear {
    public static void main(String[] args) {    
        Scanner input = new Scanner(System.in);
        System.out.print("输入年份:");
        int year = input.nextInt();
         
        if((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0)
            System.out.print(year + "年是闰年");
        else 
            System.out.print(year + "年不是闰年");
    }
}

Math.random()随机整数错误用法

public class Ans3_4_page93{
    public static void main(String[] args){
        //错误用法 导致month的值等于0,永不等于12,可以把12改成13
        //可用于抽奖排除中奖号码
        int month = (int)(Math.random() * 12);

        switch (month) {
            case 1:
                System.out.println("January");
                break;
            case 2:
                System.out.println("February");
                break;
            case 3:
                System.out.println("March");
                break;
            case 4:
                System.out.println("April");
                break;
            case 5:
                System.out.println("May");
                break;
            case 6:
                System.out.println("June");
                break;
            case 7:
                System.out.println("July");
                break;
            case 8:
                System.out.println("August");
                break;
            case 9:
                System.out.println("September");
                break;
            case 10:
                System.out.println("October");
                break;
            case 11:
                System.out.println("November");
                break;
            case 12:
                System.out.println("December");
                break;
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        while (true) {
            double number0 = Math.random();
            double number1 = number0 * 12;
            int number = (int) (number1);
            System.out.println("原始数      " + number0);
            System.out.println("原始数乘以12 " + number1);
            System.out.println(number);
            System.out.println("---------------------");
        }
    }
    }

原始数      3.111564749883611E-4
原始数乘以12 0.003733877699860333
0
---------------------
原始数      0.07859998705330462
原始数乘以12 0.9431998446396554
0
---------------------

Process finished with exit code -1

Java移位运算符>>和无符号右移运算符>>>的区别

Java 移位运算符是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
左移使用两个小于符号”<<“表示,右移使用两个大于符号”>>”表示。
应用逻辑移位时,移位后空缺的部分全部填0。原码为整数,补码为负数,补码=反码+1。

无符号右移指的是,右移后前面补零,如:
-1的补码为11111111111111111111111111111111,>>>2=0011111111111111111111111111111111。

最高位 1表示负数,0表示整数。

>> 符号右移时,对于正数,高位补0,对于负数,高位补1。
>>>无符号右移,长度扩展为4字节,最高位都为0,但正数扩展位补0,负数扩展位补1。

   0001(十进制1)
<<    3(左移3位)
 = 1000(十进制8)

    1010(十进制10)
>>    2(右移2位)
 = 0010(十进制2)

 1010           原始数         number
10100           左移一位       number = number << 1;
 1010           右移一位       number = number >> 1;