不快乐爪洼_JavaSE_常用类

JavaSE

7. 常用类

7.1 String
7.1.0 base
/*
 * String:字符串,使用一对 " " 引起来表示。
 *
 * 1.String声明为final的,不可被继承
 *
 * 2.String实现了Serializable接口: 表示字符串是支持序列化的。
 *
 *         实现了Comparable接口: 表示String可以比较大小
 *
 * 3.String内部定义了final char[] value用于存储字符串数据
 *
 * 4.String:代表不可变的字符序列。简称:不可变性。
 *
 *      体现:
 *           1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
 *           2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
 *           3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
 *
 * 5.通过字面量的方式 (区别于new) 给一个字符串赋值,此时的字符串值声明在字符串常量池中。
 *
 * 6.字符串常量池中是不会存储相同内容的字符串的。
 *
 */

public class testString_1 {
    public static void main(String[] args) {

        /*
         * String的实例化方式
         * 方式一:通过字面量定义的方式
         * 方式二:通过new + 构造器的方式
         *
         * 面试题:String s = new String("abc");方式创建对象, 在内存中创建了几个对象?
         *      两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"
         *
         * 1.字面量:
         *      栈 (常量池中的地址) --------> 常量池
         * 2.new :
         *      栈 (堆中的地址)    --------> 堆 (常量池中的地址) --------> 常量池
         */

        //字面量的定义方式 => 字符串常量存储在字符串常量池, 目的是共享
        String str1 = "nuo";
        String str2 = "nuo";
        System.out.println((str1 == str2)); //true

        // new 对象的定义方式 => 字符串非常量对象存储在堆中。
        String str3 = new String("nuo");
        String str4 = new String("nuo");
        System.out.println((str3 == str4)); //false

        String str5 = str3.replace('n', 'a');
        System.out.println(str5); // auo
        System.out.println(str3); // nuo

        // 易错小栗子
        testString_1_0 t1 = new testString_1_0("nuo", 18);
        testString_1_0 t2 = new testString_1_0("nuo", 18);
        System.out.println((t1.name == t2.name)); //true => 类似于字面量的定义方式

    }
}

class testString_1_0 {
    public String name;
    public int age;

    public testString_1_0(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
7.1.1 字符串拼接
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中

class String_2{
    public static void TestString_2(){
        String str1 = "xiao";
        String str2 = "nuo";
        String str3 = "xiaonuo";

        String str4 = "xiao" + "nuo";
        String str5 = str1 + "nuo";
        String str6 = str1 + str2;
        String str7 = str5.intern();

        final String str8 = "xiao";
        String str9 = str8 + "nuo";

        //常量与常量的拼接
        System.out.println((str3 == str4)); // true
        //常量与常量的拼接
        System.out.println((str9 == str4)); // true
        //调用intern()方法,返回值就在常量池
        System.out.println((str3 == str7)); // true
        //其中有一个是变量,结果就在堆中
        System.out.println((str3 == str5)); // false
        //其中有一个是变量,结果就在堆中
        System.out.println((str5 == str6)); // false
    }
}
7.1.2 String 常用方法
int length():返回字符串的长度:return value.length

char charAt(int index):返回某索引处的字符return value[index]

boolean isEmpty():判断是否是空字符串:return value.length==0

String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写

String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写

String trim():返回字符串的副本,忽略前导空白和尾部空白

boolean equals(Object obj):比较字符串的内容是否相同

boolean equals IgnoreCase(String anotherString):与equals方法类似,忽略大小写

String concat(String str):将指定字符串连接到此字符串的结尾。等价于用“+int compareTo(String anotherString):比较两个字符串的大小

String substring(int beginIndex):返回一个新的字符串,它是此字符串的从

beginIndex开始截取到最后的一个子字符串。

String substring(int beginIndex,int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

class String_4 {
    public static void TestString_4_() {

        String str1 = "Xiao";
        String str2 = "xiao";
        String str3 = "nuo";
        String str4 = " xiao nuo ";

        //int length():返回字符串的长度:return value.length
        System.out.println(str1.length());  // => 4

        //char charAt(int index):返回某索引处的字符return value[index]
        System.out.println(str1.charAt(0)); // => X

        //boolean isEmpty():判断是否是空字符串:return value.length==0
        System.out.println(str1.isEmpty()); // => false

        //String toLowerCase():使用默认语言环境,将String中的所有字符转换为小写
        System.out.println(str1.toLowerCase()); // => xiao

        //String toUpperCase():使用默认语言环境,将String中的所有字符转换为大写
        System.out.println(str1.toUpperCase()); // => XIAO

        //String trim():返回字符串的副本,忽略前导空白和尾部空白
        System.out.println(str4.trim());    // => "xiao nuo"

        //boolean equals(Object obj):比较字符串的内容是否相同
        System.out.println(str1.equals(str2));  // => false

        //boolean equals IgnoreCase(String anotherString):与equals方法类似,忽略大小写
        System.out.println(str1.equals(str2));  // => false

        //String concat(String str):将指定字符串连接到此字符串的结尾。等价于用“+”
        System.out.println(str2.contains(str3));    // => false

        //int compareTo(String anotherString):比较两个字符串的大小
        System.out.println(str1.compareTo(str2));   // => -32

        //String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
        System.out.println(str4.substring(1));  // => "xiao nuo "

        //String substring(int beginIndex,int endIndex):返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
        System.out.println(str4.substring(1, 9));   // => "xiao nuo"

    }
}
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始

boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
    
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始

int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1

class String_5 {
    public static void String_5_() {
        String str1 = "xiao";
        String str2 = "nuo";
        String str3 = "xixi";

        //boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
        System.out.println(str1.endsWith("o")); // => true

        //boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
        System.out.println(str1.startsWith("x"));   // => true

        //boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
        System.out.println(str1.startsWith("i", 1));    // => true

        //boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
        System.out.println(str1.contains("ia"));    // => true

        //int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
        System.out.println(str3.indexOf("xi")); // => 0

        //int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
        System.out.println(str3.indexOf("xi", 1));  // => 2

        //int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
        System.out.println(str3.lastIndexOf("xi")); // => 2

        //int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
        System.out.println(str3.lastIndexOf("xi", 3));   // => 2
    }
}
替换:
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

匹配:
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。

切片:
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

class String_6{
    public static void String_6_(){
        String str1 = "西藏布达拉宫欢迎您";
        String str2 = str1.replace('西','东');

        System.out.println(str1);
        System.out.println(str2);

        String str3 = str1.replace("北京", "南京");
        System.out.println(str3);

        System.out.println("*************************");
        String str = "12hello34world5java7891mysql456";
        //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉
        String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", "");
        System.out.println(string);

        System.out.println("*************************");
        str = "12345";
        //判断str字符串中是否全部有数字组成,即有1-n个数字组成
        boolean matches = str.matches("\\d+");
        System.out.println(matches);
        String tel = "0571-4534289";
        //判断这是否是一个杭州的固定电话
        boolean result = tel.matches("0571-\\d{7,8}");
        System.out.println(result);

        System.out.println("*************************");
        str = "hello|world|java";
        String[] strs = str.split("\\|");
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
        }
        System.out.println();
        str2 = "hello.world.java";
        String[] strs2 = str2.split("\\.");
        for (int i = 0; i < strs2.length; i++) {
            System.out.println(strs2[i]);
        }
    }
}
7.1.3 String与基本数据类型、包装类之间的转换
详情见 4.0.10 包装类的使用

String --> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类 --> String:调用String重载的valueOf(xxx)
7.1.4 String 同 char[] 的转换
Stringchar[]之间的转换

String --> char[]:调用StringtoCharArray()
char[] --> String:调用String的构造器
7.1.5 String 同 byte[] 的转换
Stringbyte[]之间的转换

编码:String --> byte[]:调用StringgetBytes()
解码:byte[] --> String:调用String的构造器

编码:字符串 --> 字节  (看得懂 --->看不懂的二进制数据)
解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 ---> 看得懂)

说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。


class String_9{
    public static void String_9_() throws UnsupportedEncodingException {
        String str1 = "abc123重工";
        byte[] bytes = str1.getBytes();//使用默认的字符编码集,进行转换
        System.out.println(Arrays.toString(bytes));

        byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。
        System.out.println(Arrays.toString(gbks));

        System.out.println("*****************************");

        String str2 = new String(bytes);//使用默认的字符集,进行解码。
        System.out.println(str2);

        String str3 = new String(gbks);
        System.out.println(str3);//出现乱码。原因:编码集和解码集不一致!

        String str4 = new String(gbks,"gbk");
        System.out.println(str4);//没有出现乱码。原因:编码集和解码集一致!

    }
}
7.1.6 String、StringBuffer、StringBuilder
StringStringBufferStringBuilder三者的异同?

String :
     不可变的字符序列;底层使用char[]存储
     String str = new String();//char[] value = new char[0];
     
StringBuffer :
     可变的字符序列;线程安全的,效率低;底层使用char[]存储
     StringBuffer sb1 = new StringBuffer();
     //char[] value = new char[16];底层创建了一个长度是16的数组。
	 System.out.println(sb1.length());  //0
     StringBuffer sb2 = new StringBuffer("abc");
	//char[] value = new char["abc".length() + 16];
    //问题1.System.out.println(sb2.length());//3
    //问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组.默认情况下,扩容为原来容量的 2倍 + 2,同时将原有数组中的元素复制到新的数组中。
       
StringBuilder :
     可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
     
对比StringStringBufferStringBuilder三者的效率 :
     从高到低排列:StringBuilder > StringBuffer > String
     
     
     指导意义:开发中建议大家使用:StringBuffer(int capacity)StringBuilder(int capacity)
7.1.7 StringBuffer的常用方法
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容
StringBuffer replace(int start, int end, String str):把[start,end)位置替换
StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
int indexOf(String str)
String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区
int length()
char charAt(int n )
void setCharAt(int n ,char ch)

总结:
    增:append(xxx)
    删:delete(int start,int end)
    改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
    查:charAt(int n )
    插:insert(int offset, xxx)
    长度:length();
    遍历:for() + charAt() / toString()
7.1.8 exer
String的一道面试题 => 重点体会 String 类中声明的 "private final char value[]" 中的 final
    
详情见 4.1.2.4)方法的值传递机制

public class testString_3 {
    public static void main(String[] args) {
        String str = new String("xiao");
        char[] ch = new char[]{'n','u','o'};
        Change.change(str,ch);

        System.out.println(str); // nuo
        System.out.println(ch);  // ruo
    }
}

class Change{
    public static void change(String str,char[] ch){
        str = "nuo";
        ch[0] = 'r';
    }
}
7.2 date

太自闭了,现搜现用吧

7.3 比较器
7.3.0 base
Java实现对象排序的方式有两种:

    自然排序:java.lang.Comparable
    定制排序:java.util.Comparator
    
    
Comparable接口与Comparator的使用的对比:
     Comparable 接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
     Comparator 接口属于临时性的比较。
7.3.1 Comparable
Comparable接口的使用举例:自然排序

    1.String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。
    2.String、包装类重写compareTo()方法以后,进行了从小到大的排列
    3.重写 compareTo(obj) 的规则:
           如果当前对象this大于形参对象obj,则返回正整数,
           如果当前对象this小于形参对象obj,则返回负整数,
           如果当前对象this等于形参对象obj,则返回零。
           

class Goods implements Comparable{

    private String name;
    private double price;

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    //指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序
    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods goods = (Goods)o;
            //方式一:
            if(this.price > goods.price){
                return 1;
            }else if(this.price < goods.price){
                return -1;
            }else{
//                return 0;
                return -this.name.compareTo(goods.name);
            }
            //方式二:
//           return Double.compare(this.price,goods.price);
        }
//        return 0;
        throw new RuntimeException("传入的数据类型不一致!");
    }
}
7.3.2 Comparator
Comparator接口的使用:定制排序
    1.背景:
    当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序
    2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
        如果方法返回正整数,则表示o1大于o2;
        如果返回0,表示相等;
        返回负整数,表示o1小于o2。
        
        
class testComparatorDemo{
    public static void testComparator(Goods[] arr){
        Arrays.sort(arr, new Comparator() {
            //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Goods && o2 instanceof Goods){
                    Goods g1 = (Goods)o1;
                    Goods g2 = (Goods)o2;
                    if(g1.getName().equals(g2.getName())){
                        return -Double.compare(g1.getPrice(),g2.getPrice());
                    }else{
                        return g1.getName().compareTo(g2.getName());
                    }
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        });
    }
}
7.4 other
7.4.1 System
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
     由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
     
成员变量 :
    System 类内部包含 in 、 out 和 err 三个成员变量,分别代表标准输入流 (键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。

成员方法 :
    native long currentTimeMillis():
    该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)197011000秒所差的毫秒数。
    void exit(int status):
    该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。
    void gc():
    该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。String
    getProperty(String key)【该方法的作用是获得系统中属性名为key的属性对应的值】:
         java.version => Java 运行时环境版本
         java.home => Java 安装目录
         os.name => 操作系统的名称
         os.version => 操作系统的版本
         user.name => 用户的账户名称
         user.home => 用户的主目录
         user.dir => 用户的当前工作目录
7.4.2 Math
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类 型一般为double型。

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.01.0的随机数
long round(double a) double型数据a转换为long型(四舍五入)
toDegrees(double angrad) 弧度—>角度
toRadians(double angdeg) 角度—>弧度
7.4.3 BigInteger / BigDecimal
1.BigInteger
Integer类作为int的包装类,能存储的最大整型值为2^31 -1Long类也是有限的,最大为2^63 -1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。
java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger提供所有Java 的基本整数操作符的对应物,并提供java.lang.Math 的所有相关方法。另外,BigInteger还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

构造器
    BigInteger(String val):根据字符串构建BigInteger对象
    
常用方法
    public BigInteger abs():返回此 BigInteger的绝对值的BigIntegerBigInteger 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)BigIntegerBigInteger[] divideAndRemainder(BigInteger val):返回包含(this/val)后跟(this % val)的两个BigInteger的数组。
    BigInteger pow(int exponent):返回其值为(this^exponent)BigInteger


2.BigDecimal

BigDecimal类支持不可变的、任意精度的有符号十进制定点数。

构造器
    public BigDecimal(double val)
    public BigDecimal(String val)
    
常用方法
    public BigDecimal add(BigDecimal augend)
    public BigDecimal subtract(BigDecimal subtrahend)
    public BigDecimal multiply(BigDecimal multiplicand)
    public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值