博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA进阶学习笔记(2):常用类(String、StringBuffer、StringBuilder、System、Math、BigInteger、BigDecimal)
阅读量:2159 次
发布时间:2019-05-01

本文共 28640 字,大约阅读时间需要 95 分钟。

标题

1. 字符串及相关类

1.1 String类概述

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.字符串常量池中是不会存储相同内容的字符串的。

@Test    public void test1(){
String s1 = "abc"; //字面量 String s2 = "abc"; //比较s1和s2的地址值 System.out.println(s1 == s2);//true s1 = "hello"; System.out.println(s1 == s2);//false System.out.println(s1);//hello System.out.println(s2);//abc System.out.println("****************"); String s3 = "abc"; s3 += "def"; System.out.println(s3);//abcdef System.out.println(s2);//abc System.out.println("****************"); String s4 = "abc"; String s5 = s4.replace('a', 'm'); System.out.println(s4);//abc System.out.println(s5);//mbc

String的实例化方式:

方式一:通过字面量定义的方式
方式二:通过new + 构造器的方式

@Test    public void test2(){
//通过字面量定义的方式:此时s1和s2的数据在javaEE声明在方法区中的字符串常量池中 String s1 = "javaEE"; String s2 = "javaEE"; //通过new + 构造器的方式:s3和s4保存的地址值,是数据在堆空间中开辟空间以后的地址值 String s3 = new String("javaEE"); String s4 = new String("javaEE"); System.out.println(s1 == s2);//true System.out.println(s1 == s3);//false System.out.println(s1 == s4);//false System.out.println(s3 == s4);//false System.out.println("***********************"); Person p1 = new Person("Tom",12); Person p2 = new Person("Tom",12); System.out.println(p1.name.equals(p2.name)); System.out.println(p1.name == p2.name); }

在字符串常量的拼接中会出现一些情况,记住下面的一些结论:

1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中

@Test    public void test3(){
String s1 = "java"; String s2 = "ee"; String s3 = "javaee"; String s4 = "java" + "ee"; String s5 = s1 + "ee"; String s6 = "java" + s2; String s7 = s1 + s2; System.out.println(s3 == s4);//true System.out.println(s3 == s5);//false System.out.println(s3 == s6);//false System.out.println(s3 == s7);//false System.out.println(s5 == s7);//false System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false String s8 = s5.intern();//返回值得到的s8使用的是常量池中已经存在的"javaee" System.out.println(s3 == s8);//true }

注意用下面的小例子:

@Test    public void test4(){
String s1 = "javaEEhadoop"; String s2 = "javaEE"; String s3 = s2 + "hadoop"; System.out.println(s1 == s3);//false final String s4 = "javaEE";//s4常量 String s5 = s4 + "hadoop"; System.out.println(s1 == s5);//true }

1.2 String类的常用方法

  1. int length():返回字符串的长度: return value.length
  2. char charAt(int index): 返回某索引处的字符return value[index]
  3. boolean isEmpty():判断是否是空字符串:return value.length == 0
  4. String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
  5. String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
  6. String trim():返回字符串的副本,忽略前导空白和尾部空白
  7. boolean equals(Object obj):比较字符串的内容是否相同
  8. boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
  9. String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
  10. int compareTo(String anotherString):比较两个字符串的大小
  11. String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
  12. String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
@Test    public void test2(){
String s1 = "helloworld"; String s2 = "HelloWorld"; System.out.println(s1.equals(s2));//false System.out.println(s1.equalsIgnoreCase(s2));//true String s3 = "abc"; String s4 = s3.concat("def"); System.out.println(s4); String s5 = "abc"; String s6 = "abe"; System.out.println(s5.compareTo(s6)); String s7 = "河北省张家口市"; String s8 = s7.substring(3); System.out.println(s7); System.out.println(s8); String s9 = s7.substring(3,6); System.out.println(s9); } @Test public void test1(){
String s1 = "HelloWorld"; System.out.println(s1.length()); System.out.println(s1.charAt(1)); System.out.println(s1.charAt(2)); System.out.println(s1.charAt(9)); System.out.println(s1.isEmpty()); String s2 = s1.toLowerCase(); System.out.println(s1);//HelloWorld s1是不可变的仍然为原来的字符串 System.out.println(s2);//helloworld 改成小写以后的字符串 System.out.println(s1.toUpperCase()); String s3 = " hello world "; String s4 = s3.trim(); System.out.println(s4); }
  1. boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
  2. boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
  3. boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
  4. boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
  5. int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
  6. int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
  7. int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
  8. int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
    注意:indexOf和lastIndexOf方法如果未找到都是返回-1
@Test    public void test3(){
String str1 = "helloworld"; boolean b1 = str1.endsWith("ld"); System.out.println(b1);//true boolean b2 = str1.startsWith("he"); System.out.println(b2);//true boolean b3 = str1.startsWith("ll",2); System.out.println(b3);//true String str2 = "owo"; System.out.println(str1.contains(str2));//true System.out.println(str1.indexOf("lo"));//3 System.out.println(str1.indexOf("lo",5));//-1 String str3 = "hellorworld"; System.out.println(str3.lastIndexOf("or"));//7 System.out.println(str3.lastIndexOf("or",6));//4 }
  1. String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
  2. String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
  3. String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
  4. String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
    匹配:
  5. boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
    切片:
  6. String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
  7. String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
@Test    public void test4(){
String str1 = "河北省张家口市"; String str2 = str1.replace('北','被'); System.out.println(str2); String str3 = str1.replace("河北", "和倍"); System.out.println(str3); String str = "12hello34world5java7891mysql456"; //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉 String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", ""); System.out.println(string); 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); 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]); } }

1.3 String与其他数据类型的转化

1.3.1 String类与基本数据类型转换

@Test    public void test1(){
String str1 = "123"; //String --> 基本数据类型、包装类 int num = Integer.parseInt(str1); //基本数据类型、包装类 --> String String str2 = String.valueOf(num); }

1.3.2 String类与char[]之间的转换

String --> char[]:调用String的toCharArray()

char[] --> String:调用String的构造器

/*    String 与 char[] 之间的转换     */    @Test    public void test2(){
//String --> char[] String str1 = "abc123"; char[] charArray = str1.toCharArray(); for (int i = 0; i
String char[] arr = new char[]{
'h','e','l','l','o'}; String str2 = new String(arr); System.out.println(str2); }

1.4 StringBuffer和StringBuilder

tringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样

1.4.1 Sting、StringBuffer、StringBuilder对比

String(JDK1.0):不可变的字符序列;底层使用byte[]存储

StringBuffer(JDK1.0):可变的字符序列;线程安全的,效率低;底层使用byte[]存储
StringBuilder(JDK5.0):可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用byte[]存储
注意:在JDK8.0及之前是char[]数组存储的
源码分析:

String str = new String();//byte[] value = new byte[0];    String str1 = new String("abc");//byte[] value = new byte[]{'a','b','c'};    StringBuffer sb1 = new StringBuffer();//byte[] value = new byte[16];底层创建了一个长度是16的数组。    System.out.println(sb1.length());//    sb1.append('a');//value[0] = 'a';    sb1.append('b');//value[1] = 'b';    StringBuffer sb2 = new StringBuffer("abc");//byte[] value = new byte["abc".length() + 16];    //注意    System.out.println(sb2.length())//3

如果添加的数据底层数组盛不下,就需要进行扩容,默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。

在开发中尽量使用StringBuffer(int capacity) 或 StringBuilder(int capacity)

1.4.2 StringBuffer和StringBuilder常用方法

  1. StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
  2. StringBuffer delete(int start,int end):删除指定位置的内容
  3. StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
  4. StringBuffer insert(int offset, xxx):在指定位置插入xxx
  5. StringBuffer reverse() :把当前字符序列逆转
  6. public int indexOf(String str)
  7. public String substring(int start,int end):返回一个从start开始到end索引结束的左闭右开区间的子字符串
  8. public int length()
  9. public char charAt(int n )
  10. public 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()*/    @Test    public void test2(){
StringBuffer s1 = new StringBuffer("abc"); s1.append(1); s1.append('1'); System.out.println(s1); s1.delete(2,4); System.out.println(s1); StringBuffer s2 = new StringBuffer("abcdef"); System.out.println(s2); s2.replace(1,4,"hello"); System.out.println(s2); StringBuffer s3 = new StringBuffer("abcd"); System.out.println(s3); System.out.println(s3.reverse()); }

1.4.3 String、StringBuffer、StringBuilder效率对比

@Test    public void test3(){
//初始设置 long starttime = 0L; long endtime = 0L; String text = ""; StringBuffer buffer = new StringBuffer(""); StringBuilder builder = new StringBuilder(""); //开始对比 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i)); } endtime = System.currentTimeMillis(); System.out.println("StringBuffer的执行时间:" + (endtime - starttime) );//5 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i)); } endtime = System.currentTimeMillis(); System.out.println("StringBuilder的执行时间:" + (endtime - starttime) );//2 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) {
text = text + i; } endtime = System.currentTimeMillis(); System.out.println("String的执行时间:" + (endtime - starttime) );//255 }

只使用追加操作对三种类型的字符串进行对比。可以看出String类型效率最低,StringBuilder的效率约为StringBuffer效率的两倍。

2. 与日期时间相关的类

2.1 JDK8之前的日期API

2.1.1 java.lang.System类

System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

注意:此方法常常用来计算时间差

@Test    public void test1(){
long time = System.currentTimeMillis(); //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。 //称为时间戳 System.out.println(time); }

2.1.2 java.util.Date类与java.sql.Date类

import java.util.Date;   @Test    public void test2(){
//构造器一:Date():创建一个对应当前时间的Date对象 Date date1 = new Date(); System.out.println(date1.toString());//Fri Sep 11 20:44:41 GMT+08:00 2020 System.out.println(date1.getTime());//1599828281246 //构造器二:创建指定毫秒数的Date对象 Date date2 = new Date(1599828281246L); System.out.println(date2.toString()); //创建java.sql.Date对象 java.sql.Date date3 = new java.sql.Date(1599828281246L); System.out.println(date3.toString()); System.out.println(date3.getTime()); //如何将java.util.Date对象转换为Date.sql.Date对象 //情况一 Date date4 = new java.sql.Date(1599828281246L); java.sql.Date date5 = new java.sql.Date(date4.getTime()); System.out.println(date5); //情况二 Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); }

2.1.3 java.text.SimpleDateFormat类

/*    SimpleDateFormat的使用    格式化:日期->字符串    解析: 格式化的逆过程 字符串->日期     */    @Test    public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFormat对象 SimpleDateFormat sdf = new SimpleDateFormat(); //格式化:日期->字符串 Date date = new Date(); System.out.println(date); String format = sdf.format(date); System.out.println(format); //解析:逆过程 字符串->日期 String str = "2019/9/12 下午8:40"; Date date2 = sdf.parse(str); System.out.println(date2); System.out.println("************"); //通常使用下面的方法 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //格式化 String format1 = sdf1.format(date); System.out.println(format1); //解析:要求字符串必须符合SimpleDateFormat识别格式(通过构造器参数体现),否则抛出异常 Date date1 = sdf1.parse("2020-09-12 08:45:37"); System.out.println(date1); }

2.1.4 java.util.Calendar日历类

/*    Calender类的使用     */    @Test    public void testCalender(){
//1.实例化 //方式一:创建其子类(GergorianCalendar)的对象 //方式二:调用静态方法getInstance() Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getClass());//GergorianCalendar //2.常用方法 //get() int days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //set() calendar.set(Calendar.DAY_OF_MONTH,22);//修改Calender类中的数据 days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //add() calendar.add(Calendar.DAY_OF_MONTH,3);//修改Calender类中的数据,可以添负数 days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //getTime():日历类->Date Date date = calendar.getTime(); System.out.println(date); //setTime():Date->日历类 Date date1 = new Date(); calendar.setTime(date1); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); }

注意: 获取月份时:一月是0,二月是1,以此类推,12月是11

获取星期时:周日是1,周一是2 , 。。。。周六是7

2.2 JDK8中新日期时间API

2.2.1 LocalDate、LocalTime、LocalDateTime 的使用

@Test    public void test1() {
//now():获取当前的日期、时间、日期+时间 LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); //LocalDateTime类使用的更加频繁 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDate); System.out.println(localTime); System.out.println(localDateTime); //of():设置指定的n年月日时分秒。没有偏移量 LocalDateTime localDateTime1 = localDateTime.of(2020, 10, 6, 12, 23, 45); System.out.println(localDateTime1); //getXXX() System.out.println(localDateTime.getDayOfMonth()); System.out.println(localDateTime.getDayOfWeek()); System.out.println(localDateTime.getDayOfYear()); System.out.println(localDateTime.getMonthValue()); System.out.println(localDateTime.getMonth()); //体现不可变性 //withxxx():设置相关的属性 LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(10); System.out.println(localDateTime); System.out.println(localDateTime2); //不可变性,加或减相应的时间 LocalDateTime localDateTime3 = localDateTime.plusMonths(3); System.out.println(localDateTime); System.out.println(localDateTime3); LocalDateTime localDateTime4 = localDateTime.minusMonths(2); System.out.println(localDateTime); System.out.println(localDateTime4); }

2.2.2 Instant类的使用

/*    Instant的使用     */    @Test    public void test2(){
//now():获取本初子午线对应的标准时间 Instant instant = Instant.now(); System.out.println(instant); //添加时间偏移量 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); //toEpochMilli():获取1970年01月01日00时00分00秒对应的毫秒数 long epochMilli = instant.toEpochMilli(); System.out.println(epochMilli); //ofEpochMilli():通过给定的毫秒数,获取Instant实例 -->Date(long millis) Instant instant1 = Instant.ofEpochMilli(1599999607466L); System.out.println(instant1); }

2.2.3 java.time.format.DateTimeFormatter 类的使用

/*    DateTimeFormatter的使用     */    @Test    public void test3(){
//方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; //格式化:日期 --> 字符串 LocalDateTime localDateTime = LocalDateTime.now(); String str1 = formatter.format(localDateTime); System.out.println(localDateTime); System.out.println(str1); //解析:字符串 --> 日期 TemporalAccessor temporalAccessor = formatter.parse(str1); System.out.println(temporalAccessor); //方式二: // 本地化相关的格式。如:ofLocalizedDateTime() // FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); //格式化 String str2 = formatter1.format(localDateTime); System.out.println(str2);//2020年9月14日 下午9:09:38 //本地化相关的格式。如:ofLocalizedDate() //FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL); String str3 = formatter2.format(LocalDate.now()); System.out.println(str3);//2020年9月14日星期一 //重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”) DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); //格式化 String str4 = formatter3.format(LocalDateTime.now()); System.out.println(str4);//2020-09-14 09:12:44 //解析 TemporalAccessor parse = formatter3.parse("2020-09-14 09:12:44"); System.out.println(parse); }

3. Java比较器

3.1 方式一:自然排序 java.lang.Comparable

实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即 通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回 负整数,如果当前对象this等于形参对象obj,则返回零。

对于字符串对象的排序:

@Test    public void test1(){
String[] arr = new String[]{
"AA","JJ","ZZ","GG","MM"}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }

对于自定义类的排序,需要实现Comparable接口

/** * 商品类 */public class Goods implements Comparable {
private String name; private double price; public Goods(String name, double price) {
this.name = name; this.price = price; } public Goods() {
} 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("传入的数据类型不一致"); }}/** * 测试类 */ @Test public void test2(){
Goods[] arr = new Goods[5]; arr[0] = new Goods("lenovoMouse",34); arr[1] = new Goods("xiaomiMouse",12); arr[2] = new Goods("dellMouse",60); arr[3] = new Goods("huaweiMouse",45); arr[4] = new Goods("microsoMouse",45); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }

3.2 方式二:定制排序:java.util.Comparator

@Test    public void test3(){
String[] arr = new String[]{
"AA","JJ","ZZ","GG","MM"}; Arrays.sort(arr, new Comparator
() {
//按照字符串从大到小的顺序排列 @Override public int compare(String o1, String o2) {
if(o1 instanceof String && o2 instanceof String){
String s1 = (String)o1; String s2 = (String)o2; return -s1.compareTo(s2); } throw new RuntimeException("输入的数据类型不一致"); } }); System.out.println(Arrays.toString(arr)); }
@Test    public void test4(){
//指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序 Goods[] arr = new Goods[5]; arr[0] = new Goods("lenovoMouse",34); arr[1] = new Goods("xiaomiMouse",12); arr[2] = new Goods("dellMouse",60); arr[3] = new Goods("huaweiMouse",45); arr[4] = new Goods("microsoMouse",45); Arrays.sort(arr, new Comparator
() {
@Override public int compare(Goods o1, Goods 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("输入的数据类型不一致!!"); } }); System.out.println(Arrays.toString(arr)); }

3.3 Comparable与Comparator的对比

Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小

Comparator接口属于临时性的比较

4. System类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。

String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见 的属性名以及属性的作用如下表所示:
在这里插入图片描述

@Test    public void test1(){
String javaVersion = System.getProperty("java.version"); System.out.println("java的version:" + javaVersion); String javaHome = System.getProperty("java.home"); System.out.println("java的home:" + javaHome); String osName = System.getProperty("os.name"); System.out.println("os的name:" + osName); String osVersion = System.getProperty("os.version"); System.out.println("os的version:" + osVersion); String userName = System.getProperty("user.name"); System.out.println("user的name:" + userName); String userHome = System.getProperty("user.home"); System.out.println("user的home:" + userHome); String userDir = System.getProperty("user.dir"); System.out.println("user的dir:" + userDir); }

5. 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.0到1.0的随机数
long round(double a) double型数据a转换为long型(四舍五入) toDegrees(double angrad) 弧度—>角度
toRadians(double angdeg) 角度—>弧度

6 BigInteger与BigDecimal类

6.1 BigInteger类

java.math包的BigInteger可以表示不可变的任意精度的整数

6.1.1 构造器

BigInteger(String val):根据字符串构建BigInteger对象

6.1.2 常用方法

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) :返回其值为 (thisexponent) 的 BigInteger

6.2 BigDecimal类

商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类

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

6.2.1 构造器

public BigDecimal(double val)

public BigDecimal(String val)

6.2.2 常用方法

public BigDecimal add(BigDecimal augend)

public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

本节练习

ex1

在这里插入图片描述

public class StringDemo {
public static void main(String[] args) {
String str = " 123 45 "; System.out.println(str); System.out.println(str.trim()); System.out.println("**********"); System.out.println(trim_test(str)); } private static String trim_test(String str){
if(str != null){
int start = 0; int end = str.length() - 1; while(start < end && str.charAt(start)==' '){
start++; } while(start < end && str.charAt(end) == ' '){
end--; } if(str.charAt(start) == ' '){
return ""; } return str.substring(start, end+1); }else{
return null; } }}

ex2

在这里插入图片描述

package com.wzc.exer;public class StringDemo2 {
/* 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg” */ public static void main(String[] args) {
String str = "abcdefg"; System.out.println(Reverse(str,2,5)); System.out.println(Reverse1(str,2,5)); System.out.println(Reverse2(str,2,5)); } /* 方式一:转换为char[] */ public static String Reverse(String str, int startIndex, int endIndex){
if(str != null){
char temp; char[] arr = str.toCharArray(); for(int x=startIndex, y=endIndex; x
= startIndex; i--){
reverseStr += str.charAt(i); } //第三部分 reverseStr += str.substring(endIndex+1); return reverseStr; } return null; } //方式三:使用StringBuffer/StringBuidler替换String public static String Reverse2(String str, int startIndex, int endIndex){
if(str!= null){
StringBuilder builder = new StringBuilder(str.length()); //第一部分 builder.append(str.substring(0,startIndex)); //第二部分 for (int i = endIndex; i >= startIndex ; i--) {
builder.append(str.charAt(i)); } //第三部分 builder.append(str.substring(endIndex+1)); return builder.toString(); } return null; }}

ex3

在这里插入图片描述

public class StringDemo3 {
/* 获取一个字符串在另一个字符串中出现的次数。 比如:获取“ab”在 “abkkcadkabkebfkaabkskab” 中出现的次数 */ public static void main(String[] args) {
String mainStr = "abkkcadkabkebfkaabkskab"; String subStr = "ab"; System.out.println(getCount(mainStr,subStr)); } public static int getCount(String mainStr, String subStr){
int mainLen = mainStr.length(); int subLen = subStr.length(); int count = 0; int index; int index2 = 0; if(mainLen >= subLen){
//方式一:// while( (index = mainStr.indexOf(subStr)) != -1){
// count++;// mainStr = mainStr.substring(index + subStr.length());// } //方式二:对方式一的改进 while((index2 = mainStr.indexOf(subStr,index2)) != -1){
count++; index2 += subStr.length(); } return count; }else{
return 0; } }}

ex4

在这里插入图片描述

ex5

ex6

练习一:字符串“2020-09-08”转换为java.sql.Date

@Test    public void test1() throws ParseException {
String birth = "2020-09-08"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse(birth); java.sql.Date date1 = new java.sql.Date(date.getTime()); System.out.println(date1); }

参考资料:

[1]尚硅谷宋康红java基础教程

转载地址:http://tkgwb.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《每日一题》20200625 139. 单词拆分
查看>>
Leetcode C++《每日一题》20200626 338. 比特位计数
查看>>
Leetcode C++ 《拓扑排序-1》20200626 207.课程表
查看>>
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>
python中xrange和range的异同
查看>>
列表、元组、集合、字典
查看>>