热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java面向对象8常用类2(MathString)

Math1、直接使用,无需导包packagejava.lang;2、final修饰类不能被继承publicfinalclassMath3、构造器私有化ÿ

Math

1、直接使用,无需导包

package java.lang;

2、final 修饰类 不能被继承

public final class Math

3、构造器私有化,不能创建Math类的对象

private Math() {}

4、Math所有的属性和方法都被static修饰,直接 类名. 调用

5、常用方法

package msb.javase.oop.javase_220310_math;public class Test {public static void main(String[] args) {System.out.println(Math.random());System.out.println(Math.PI);System.out.println(Math.abs(-80));//绝对值System.out.println(Math.ceil(9.1));//向上取值System.out.println(Math.floor(9.9));//向下取值System.out.println(Math.round(3.5));//四舍五入System.out.println(Math.max(3, 6));//取大值System.out.println(Math.min(3, 6));//取小值}
}

6、静态导入

import static java.lang.Math.*;
System.out.println(random());

存在问题:如果跟Math中的方法重复,那么会优先走本类的自定义方法(就近原则)

package msb.javase.oop.javase_220310_math;import static java.lang.Math.*;public class Test {public static void main(String[] args) {System.out.println(random()); //100}public int random(){return 100;}
}

Random

package msb.javase.oop.javase_220311_random;import java.util.Random;public class Test {public static void main(String[] args) {//学习Random类//(1)利用带参数的构造器创建对象(相对用得比较少)Random r1 = new Random(System.currentTimeMillis());System.out.println(r1.nextInt());//(2)利用空参构造器创建对象Random r2 = new Random();//表面是在调用无参构造器,底层还是在调用带参构造器System.out.println(r2.nextInt(10));System.out.println(r2.nextDouble());}
}

Math.random()

在这里插入图片描述


String

1、直接使用,无需导包

package java.lang;

2、形象地说一下

* The {@code String} class represents character strings.

在这里插入图片描述

3、所有字符串字面常量都是String的具体 实例/对象

* All string literals in Java programs, such as {@code "abc"}, are* implemented as instances of this class.

4、字符串是不可变的

* Strings are constant;

5、String类不能有子类,不可以被继承

public final class String

6、字符串底层是一个char类型的数组

private final char value[];

在这里插入图片描述

7、常用方法

(1)Constructor
底层就是给对象底层的value数组进行赋值操作

String s1 = new String("abc");String s2 = new String(new char[]{'a','b','c'});

(2)length、isEmpty、charAt

//字符串长度System.out.println("s1的长度:"+s1.length());//s1的长度:3//是否为空String s3 = new String();System.out.println("s3为空:"+s3.isEmpty());//s3为空:trueSystem.out.println("s1为空:"+s1.isEmpty());//s1为空:false//charAtSystem.out.println("s1的第3个字符:"+s1.charAt(2));//s1的第3个字符:c

(3)equals(重点)
比较字符串内容,而非比较对象

String s6 = new String("abc");String s7 = new String("edf");System.out.println(s6.equals(s7));//false

在这里插入图片描述
(4)compareTo(重点)
String类实现了Comparable接口,里面有一个抽象方法叫compareTo,所以String一定要对这个方法重写
只要字符串不一样,返回非0

String s8 = new String("abc");String s9 = new String("abc");System.out.println(s8.compareTo(s9)); //0

在这里插入图片描述
(5)subString、concat、replace、split、toUpperCase、toLowerCase、trim
subString:字符串的截取
concat:字符串的合并/拼接
replace:字符串中字符的替换
split:按照指定的字符串分裂为数组
trim:去除首尾空格

String s10 = new String("abcdefjk");System.out.println(s10.substring(3));//defjkSystem.out.println(s10.substring(2,6));//[3,6)

System.out.println(s10.concat("bbb"));//abcdefjkbbb

String s11 = s10.replace("k","c");System.out.println(s11);//abcdefjc

String s12 = new String("a-b-c-d-e-f");String[] strs = s12.split("-");System.out.println(Arrays.toString(strs));//[a, b, c, d, e, f]

注意此处Arrays.toString的使用

String s12 = new String("a-b-c-d-e-f");System.out.println(s12.toUpperCase());//A-B-C-D-E-FSystem.out.println(s12.toUpperCase().toLowerCase());//a-b-c-d-e-f

String s13 = new String(" a b c ");System.out.println(s13.trim());//a b c

(6)valueOf:转换为String类型

System.out.println(String.valueOf(13));//13System.out.println(String.valueOf(13.4));//13.4System.out.println(String.valueOf(false));//false

8、String的内存分析

(1)字符串拼接
在这里插入图片描述
在这里插入图片描述
内存:
在这里插入图片描述
(2)new关键字创建对象

String s6 = new String("abc");

内存:开辟两个空间(1.字符串常量池中的字符串 2.堆中开辟的对象空间)
在这里插入图片描述
(3)有变量参与的字符串拼接

package msb.javase.oop.javase_220312_string;public class Test2 {public static void main(String[] args) {//有变量参与的字符串拼接String a = "abc";String b = a + "def"; //a变量在编译时不知道a的值是"abc",所以不会进行编译期优化,不会直接合并为"abcdef"System.out.println(b);}
}

a变量在编译时不知道a的值是"abc",所以不会进行编译期优化,不会直接合并为"abcdef"

反编译(反汇编)过程:为了更好的分析字节码文件是如何进行解析的


  1. 重新编译Build->Recompile ‘Test03.java’
  2. 在out文件夹找到.class字节码文件,重新同步syntho/reload
  3. Terminal:
    cd out/production/testJava/msb/javase/oop/javase_220312_string/
    javap -c Test2.class

在这里插入图片描述
9、可变字符串StringBuilder/StringBuffer

extends AbstractStringBuilder

/*** The value is used for character storage.*/char[] value;/*** The count is the number of characters used.*/int count;

count:数组有效长度(被使用的长度)

StringBuilder sb = new StringBuilder();//底层是对value数组进行初始化,且长度为16StringBuilder sb2 = new StringBuilder(30);//底层是对value数组进行初始化,指定长度

表面上调用StringBuilder空构造器,实际底层是对value数组进行初始化,且长度固定

public StringBuilder() {super(16);}

public StringBuilder(int capacity) {super(capacity);}

与上述两种情况不同,传入str的情况下,源码分析:

第一部分

StringBuilder sb3 = new StringBuilder("abc");

  1. 第一步

public StringBuilder(String str) {super(str.length() + 16);append(str);}

  1. 第二步

@Overridepublic StringBuilder append(String str) {super.append(str);return this;}

public AbstractStringBuilder append(String str) {int len = str.length(); //3ensureCapacityInternal(count + len);str.getChars(0, len, value, count); //this.value即调用者StringBuilder的valuecount += len; //count数组被使用的长度,此时为默认值0return this;}

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) { // 3-19=-16不满足value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}

public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) { //分别为 0 3 value 0System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); //此处value为调用者str的底层value(字符串"abc"的value)}

在这里插入图片描述

第二部分

字符串append

sb3.append("def");

  1. 第一步

public StringBuilder append(String str) {super.append(str);return this;}

  1. 第二步

public AbstractStringBuilder append(String str) {int len = str.length();ensureCapacityInternal(count + len); //此时count为3str.getChars(0, len, value, count); //"def"调用getCharscount += len;return this;}

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) { //3-19value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}

public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);}

在这里插入图片描述

第三部分

空间不够进行扩容

sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo");

private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0) { //24-19>0 空间不够进行扩容value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}

private int newCapacity(int minCapacity) {// overflow-conscious codeint newCapacity &#61; (value.length << 1) &#43; 2; // 19*2 &#43; 2 &#61; 40if (newCapacity - minCapacity < 0) {newCapacity &#61; minCapacity;}return (newCapacity <&#61; 0 || MAX_ARRAY_SIZE - newCapacity < 0)? hugeCapacity(minCapacity): newCapacity;}

在这里插入图片描述
7个o赋值到新的长度为40的空间

PS: return this 才可以串连调用

StringBuilder sb4 &#61;sb3.append("def").append("aaaaaaaa").append("bbb").append("ooooooo"); //return this 才可以串连调用System.out.println(sb4);//abcdefdefaaaaaaaabbbooooooo

推荐阅读
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • java 单链表和双_Java链表,单链表和双链表
    Java-链表1、什么是链表?2、链表的特点是什么?3、链表的实现原理?4、如何自己写出一个链表?1、什么是链表࿱ ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 题目描述:一个DNA序列由ACGT四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个 ... [详细]
  • 将字符串数字拆分成单个数字_【LeetCode】842. 将数组拆分成斐波那契序列
    【LeetCode】842.SplitArrayintoFibonacciSequence将数组拆分成斐波那契序列(Medium)(JAVA)题目描述:Givenas ... [详细]
  • 两个N位数a和b相乘,手算的话一般是a的末位分别乘以b的末位到首位,然后a的倒数第二位分别乘以b的末位到首位,直到a的首位分别乘以b的末位到首位,最后按位数相加。这个过程的时间复杂度是O(n2)的。 ... [详细]
author-avatar
910621rh_270
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有