# Java 常用类


<!--more-->
String、System、Math、BigInteger、BigDecimal

## 字符串

### String
字符串,是一个final类,不可变字符序列,字符内容存储在一个字符数组value[]中
* 不可变性
* char[]存储

#### 实例化方式
* 字面量
* 构造器new

#### 常用方法
...略过

### StringBuffer
* 可变
* 线程安全,效率低
* char[]存储
* 默认capacity为16,不够时会继续扩容,默认扩容为capacity<<1 + 2,并将原有元素复制到新数组中

#### 常用方法
...略过

### StringBuilder
* 可变
* 线程不安全,效率高
* jdk5.0新增
* char[]存储

#### 常用方法
...略过

> 建议:
> 使用 StringBuffer(int capacity) 或 StringBuilder(int capacity)

### 字符串常见算法
* 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”

```java
public class StringDemo {
    //方式一：转换为char[]
    public String reverse(String str, int startIndex, int endIndex) {

        if (str != null) {
            char[] arr = str.toCharArray();
            for (int x = startIndex, y = endIndex; x < y; x++, y--) {
                char temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
            }

            return new String(arr);
        }
        return null;
    }

    //方式二：使用String的拼接
    public String reverse1(String str, int startIndex, int endIndex) {
        if (str != null) {
            //第1部分
            String reverseStr = str.substring(0, startIndex);
            //第2部分
            for (int i = endIndex; i >= startIndex; i--) {
                reverseStr += str.charAt(i);
            }
            //第3部分
            reverseStr += str.substring(endIndex + 1);

            return reverseStr;

        }
        return null;
    }

    //方式三：使用StringBuffer/StringBuilder替换String
    public String reverse2(String str, int startIndex, int endIndex) {
        if (str != null) {
            StringBuilder builder = new StringBuilder(str.length());

            //第1部分
            builder.append(str.substring(0, startIndex));
            //第2部分
            for (int i = endIndex; i >= startIndex; i--) {

                builder.append(str.charAt(i));
            }
            //第3部分
            builder.append(str.substring(endIndex + 1));

            return builder.toString();
        }
        return null;

    }

    @Test
    public void testReverse() {
        String str = "abcdefg";
        String reverse = reverse1(str, 2, 5);
        System.out.println(reverse);
    }

}
```

* 获取一个字符串在另一个字符串中出现的次数。比如：获取“ab”在 “abkkcadkabkebfkaabkskab” 中出现的次数

```java
public class StringDemo {
    /**
     * 获取subStr在mainStr中出现的次数
     */
    public int getCount(String mainStr, String subStr) {
        int mainLength = mainStr.length();
        int subLength = subStr.length();
        int count = 0;
        int index = 0;
        if (mainLength >= subLength) {
            //方式一：
//            while((index = mainStr.indexOf(subStr)) != -1){
//                count++;
//                mainStr = mainStr.substring(index + subStr.length());
//            }
            //方式二：对方式一的改进
            while ((index = mainStr.indexOf(subStr, index)) != -1) {
                count++;
                index += subLength;
            }

            return count;
        } else {
            return 0;
        }
    }

    @Test
    public void testGetCount() {
        String mainStr = "abkkcadkabkebfkaabkskab";
        String subStr = "ab";
        int count = getCount(mainStr, subStr);
        System.out.println(count);
    }
}
```

* 获取两个字符串中最大相同子串。比如：str1 = "abcwerthelloyuiodefabcdef";str2 = "cvhellobnm" 提示：将短的那个串进行长度依次递减的子串与较长的串比较。

```java
public class StringDemo2 {
    //前提：两个字符串中只有一个最大相同子串
    public String getMaxSameString(String str1, String str2) {
        if (str1 != null && str2 != null) {
            String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
            String minStr = (str1.length() < str2.length()) ? str1 : str2;
            int length = minStr.length();

            for (int i = 0; i < length; i++) {
                for (int x = 0, y = length - i; y <= length; x++, y++) {
                    String subStr = minStr.substring(x, y);
                    if (maxStr.contains(subStr)) {
                        return subStr;
                    }

                }
            }

        }
        return null;
    }

    // 如果存在多个长度相同的最大相同子串
    // 此时先返回String[]，后面可以用集合中的ArrayList替换，较方便
    public String[] getMaxSameString1(String str1, String str2) {
        if (str1 != null && str2 != null) {
            StringBuffer sBuffer = new StringBuffer();
            String maxString = (str1.length() > str2.length()) ? str1 : str2;
            String minString = (str1.length() > str2.length()) ? str2 : str1;

            int len = minString.length();
            for (int i = 0; i < len; i++) {
                for (int x = 0, y = len - i; y <= len; x++, y++) {
                    String subString = minString.substring(x, y);
                    if (maxString.contains(subString)) {
                        sBuffer.append(subString + ",");
                    }
                }
//                System.out.println(sBuffer);
                if (sBuffer.length() != 0) {
                    break;
                }
            }
            String[] split = sBuffer.toString().replaceAll(",$", "").split("\\,");
            return split;
        }

        return null;
    }

    @Test
    public void testGetMaxSameString() {
        String str1 = "abcwerthello1yuiodefabcdef";
        String str2 = "cvhello1bnmabcdef";
        String[] maxSameStrings = getMaxSameString1(str1, str2);
        System.out.println(Arrays.toString(maxSameStrings));

    }

}
```

## System
* 代表系统,系统级的很多属性和方都放置在此内部
* 构造器是private,成员变量和方法是static
* 成员变量  
    > in, out , err
* 成员方法
    > currentTimeMillis(), exit, gc, getProperty(String key)

### getProperty(String key)

|属性名|属性说明|
|:---|:---|
|java.version|java运行时环境版本|
|java.home|java安装目录|
|os.name|操作系统名称|
|os.version|操作系统版本|
|user.name|用户账户名称|
|user.home|用户的目录|
|user.dir|用户的当前工作目录|

## Math
* abs  绝对值
* acos,asin,atan,cos,sin,tan  三角函数
* sqrt  平方根
* pow(double a,doble b)  a的 b 次幂
* log  自然对数
* exp  e为底指数
* max(double a,double b)
* min(double a,double b)
* random()  返回 0.0 到 1.0 的随机数
* long round(double a)  double型数据 a 转换为long 型（四舍五入）
* toDegrees(double angrad)  弧度 角度
* toRadians(double angdeg)  角度 弧度

## BigInteger
java.math 包的 BigInteger 可以表示不可变的任意精度的整数 。 BigInteger 提供所有 Java 的基本整数操作符的对应物，并提供 java.lang.Math 的所有相关方法。
另外， BigInteger 还提供以下运算：模算术、 GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
* 构造器 
    > BigInteger(String val)
* 常用 方法
    > public BigInteger abs ()()：返回此 BigInteger 的绝对值的 BigInteger 。  
    > BigInteger add (BigInteger val) ：返回其值为 (this + val) 的 BigInteger  
    > BigInteger subtract (BigInteger val) ：返回其值为 (this val) 的 BigInteger  
    > BigInteger multiply (BigInteger val) ：返回其值为 (this * val) 的 BigInteger  
    > BigInteger divide (BigInteger val) ：返回其值为 (this/val) 的 BigInteger 整数相除只保留整数部分    
    > BigInteger remainder (BigInteger val) ：返回其值为 (this % val) 的 BigInteger  
    > BigInteger [] divideAndRemainder (BigInteger val)：返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组  
    > BigInteger pow (int exponent) ：返回其值为 (this exponent ) 的 BigInteger   

## BigDecimal
* 一般的 Float 类和 Double 类可以用来做科学计算或工程计算，但在 商业计算中，要求数字精度比较高，故用到 java.math.BigDecimal 类
* BigDecimal 类支持不可变的、任意精度的有符号十进制定点数
* 构造器
    > public BigDecimal(double val)  
    > public BigDecimal (String val)
* 常用方法
    > public BigDecimal add (BigDecimal)  
    > public BigDecimal subtract (BigDecimal)  
    > public BigDecimal multiply (BigDecimal)  
    > public BigDecimal divide (BigDecimal divisor, int scale, int roundingMode)

