首页 >> 大全

1.String类空间概述

2023-11-15 大全 26 作者:考证青年

目录

4.类

1.类空间概述

2.特性

3.常用方法

4.案例

1.模拟用户登陆

2.手机号码屏蔽

5.可变字符串

1.用法

2.效率

5.

1.由来

2.为什么使用?

3.怎么使用?

4.的概括及四则运算的应用

5.总结

6.Math类

4.类

类是final类,不可以被继承

1.类空间概述

字符串是常量,创建之后不可变

字符串字面值存储在字符串池中,可以共享

s = "hello";产生一个对象,字符串池中存储(推荐使用)

s=""则产生一个张三,然后把s指向""这个对象而不指向"hello",也在字符串池中储存

s1=""只是重新在字符串池中寻找""对象,如果有则直接指向,如果没有则重新创建一个,因为s和s1直接指向的""对象存在,两个在栈里的位置也会相同

s = new ("Hello"); 产生两个对象,堆、池各一个

s1 = new ("Hello");也产生两个对象,堆、池各一个

s1会先指向在堆里的对象,虽然最后指向都是字符串池中的"Hello"对象,但是s1和s2都各自创建了一个自己独有的堆对象,两个值是从不同的堆地址去前往字符串池的,所以不相等

例:1(人)是a(妈妈)和b(爸爸)生的,然后a和b离婚了,a又和c(爸爸)结婚生了1(人),虽然最后生的都是人,但是生的人的途径不一样

字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空 间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池 中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

package java_se.java_jinjie.neibulei.demo06;public class Demo {public static void main(String[] args) {String name="hello";//"hello"常量存储在字符串池中name="zhangsan";//"zhangsan"赋值给name变量,给字符串赋值时,并没有修改数据,而是重新开辟一个空间,然后引用新的地址String name2="zhangsan";//创建name2给他赋的值,会先去查看有没有"zhangsan"这个空间,如果有直接指向,如果没有则重新开辟//演示字符串的另一种创建方式 new String();String str = new String("java");String str1 = new String("java");System.out.println(str==str1);//false因为两个的地址不一样,==比较的是地址System.out.println(str.equals(str1));//true,在String类中equals被重写了,之比较内容}
}

package java_se.java_jinjie.neibulei.demo06;public class demo05 {public static void main(String[] args) {String s1="abc";String s2="ab";String s3= s2+"c";System.out.println(s1 ==s3);//false//Java存在编译优化机制,程序在编译时: “a” + “b” + “c” 会直接转成 "abc"String a1="abc";String a2="a"+"b"+"c";System.out.println(a1==a2);//true}
}

2.特性 3.常用方法

1.();返回字符串长度

2.chaAt(int index);返回某个位置的字符

3.( str);判断是否包含某个字符串

4.();返回字符串对应的数组

5.();返回字符串首次出现的下标位置

6.();返回字符串最后一次出现的下标位置

7.trim();去掉字符串前后的空格

8.();把小写转成大写(字母) ();把大写转成小写(字母)

9.(str);判断是否以str结尾 (str);判断是否以str开头

10.(char php,char c#);用新的字符或字符串替换旧的字符或字符串

11.split();对字符串进行拆分

12.()比较两个内容是否一样(这里的是重写的)==在基本数据类型比较时用

()比较大小,先比较首个字符大小并输出差值,如果首字符相同依次比较,相等或不同停,如果前面都相等到最后一个个数不同,则输出相差的个数

12.();判断字符串的长度是不是0,如果是0返回true

13.(1);从字符串下标1到最后输出 (1,5)从下标1到下标5的值输出

package java_se.java_jinjie.neibulei.demo06;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {//字符串方法使用//1.length();返回字符串长度//2.chaAt(int index);返回某个位置的字符//3.contains(String str);判断是否包含某个字符串//4.toChaArray();返回字符串对应的数组//5.indexOf();返回字符串首次出现的下标位置//6.lastIndexOf();返回字符串最后一次出现的下标位置//7.trim();去掉字符串前后的空格//8.toUpperCase();把小写转成大写(字母)  toLowerCase();把大写转成小写(字母)//9.endsWith(str);判断是否以str结尾   starWith(str);判断是否以str开头//10.replace(char php,char c#);用新的字符或字符串替换旧的字符或字符串//11.split();对字符串进行拆分//12.isEmpty();判断字符串的长度是不是0,如果是0返回true//13.substring(1);从字符串下标1到最后输出 substring(1,5)从下标1到下标5的值输出String content ="   java1php2 java3java   ";//1System.out.println(content.length());//空格也算字符 19//2System.out.println(content.charAt(0));//第一个字符 jSystem.out.println(content.charAt(content.length()-1));//最后一个字符,不减一会超出范围 a//3System.out.println(content.contains("java"));//字符串中有java    trueSystem.out.println(content.contains("19"));//字符串中没有19   false//4System.out.println(Arrays.toString(content.toCharArray()));//把字符串变成数组 [j, a, v, a, 1, p, h, p, 2,  , j, a, v, a, 3, j, a, v, a]//5System.out.println(content.indexOf("java"));//第一次出现的下标位置 0System.out.println(content.indexOf("java",2));//(第一次出现的下标位置,从第几个下标开始) 10//6System.out.println(content.lastIndexOf("java"));//最后一次出现的下标位置  15//7System.out.println(content.trim());//去掉字符串前后的空格"java1php2 java3java"//8System.out.println(content.toUpperCase());//小写转大写    JAVA1PHP2 JAVA3JAVASystem.out.println(content.toLowerCase());//大写转小写   java1php2 java3java//9String filename="hello.java";System.out.println(filename.endsWith(".java"));//是否以.java结尾System.out.println(filename.startsWith("he"));//是否以he开头//10String content1="js是最好的语言s";System.out.println(content1.replace("js","java"));//用新的字符串(java)替换旧的字符串(js)System.out.println(content1.replace("s","ava"));//用新的字符串(ava)替换旧的字符串(s)//11String text = "sdad sda das, dgad fas,tgas";String[] arr= text.split(" ");//遇到 空格 就拆分String[] arr1= text.split("[ ,]+");//遇到 空格和,单个出现就拆分 +表示可以多个出现拆分 []里面的单位都可以单个被拆分 []+表示大括号里面的单个或多个连着都可以被拆分for (String s : arr) {//遍历数组arr 增强for循环System.out.print(s);//sdadsdadas,dgadfas,tgas}System.out.println();for (String s2 : arr1) {System.out.print(s2);//sdadsdadasdgadfastgas}System.out.println();System.out.println("------------补充-----------");//equals()比较两个内容是否一样、compareTo()比较大小String a1="hello";String a2="Hello";System.out.println(a1.equals(a2));//比较是否一样System.out.println(a1.equalsIgnoreCase(a2));//省略大小写比较是否一样String a3="abcabc";//a:97String a4="xyz";//x:120String a5="abc";String a6="abc";//先比较第一个字母的大小,如果第一个一样,则比较第二个依次比直到不一样(输出差值)或一样的(输出0),如果个数不一样前面一样,则差几个算距离System.out.println(a3.compareTo(a4));//-23 因为第一个字母不一样则比较第一个字母差值System.out.println(a5.compareTo(a6));//0 内容字母大小都一样System.out.println(a5.compareTo(a3));//-3  依次比较,内容相同但个数不相同开始比较距离,a5比a3少三个距离System.out.println(a3.compareTo(a5));//3  依次比较,内容相同但个数不相同开始比较距离,a3比a5多三个距离System.out.println(a5.compareTo(a5));//0  自己和自己比较数值都相同//12//比较字符串是否为0,0则输出true 不是则输出falseString a7="";String a8=" ";System.out.println(a7.isEmpty());//trueSystem.out.println(a8.isEmpty());//false//13String a9="123456";System.out.println(a9.substring(1,5))//23456 从下标1到5System.out.println(a9.substring(3))//456     从下标3到最后}
}

4.案例

package java_se.java_jinjie.neibulei.demo06;public class Demo2 {public static void main(String[] args) {String str = "this is a text";//1.将里面单词单独获取出来String[] arr = str.split(" ");for (String s : arr) {System.out.println(s);}System.out.println("=============");//2.将Str的text替换为practiceString str2=str.replace("text","practice");System.out.println(str2);//3.在text前面插入easyString str3=str.replace("text","easy text");System.out.println(str3);//4.将每个单词的首字母改为大写System.out.println("===============");for (int i = 0; i < arr.length; i++) {//获取数组的单词的下标为0的字符起名firstchar first = arr[i].charAt(0);//把第一个字符转成大写起名为upperfirstchar upperfirst=Character.toUpperCase(first);//遍历下标为0的字符+从下标1开始到最后一个下标位置的内容  substring(1)从下标一到下标最后的内容 substring(1,5)从下标1到下标5的内容String news=upperfirst+arr[i].substring(1);System.out.println(news);//This换行Is换行A换行Text}}
}

1.模拟用户登陆

package java_se.java_jinjie.zuoye8_11;import java.util.Scanner;
public class StringTest3 {public static void main(String[] args) {/*模拟用户登录功能,最多只给三次机会。*///先定义账户String userName = "junhua";String passWord = "123456";//循环三次完成判断三次for(int x = 0; x<3;x++){Scanner sc = new Scanner(System.in);System.out.print("输入账号:");String name = sc.nextLine();Scanner sc1 = new Scanner(System.in);System.out.print("请输入密码:");String pwd = sc1.nextLine();//比较账号密码if (name.equals(userName)){if (pwd.equals(passWord)){System.out.println("登录成功");break;//退出循环}else{//如果错误重新输入 减去循环次数为剩余次数System.out.println("密码错误,你还有"+(2-x)+"机会");}}else{//如果错误重新输入 减去循环次数为剩余次数System.out.println("登录失败,你还有"+(2-x)+"机会");}}}
}

2.手机号码屏蔽

package java_se.java_jinjie.zuoye8_11;public class Test1 {public static void main(String[] args) {/*键盘录入一个手机号,将中间四位号码屏蔽*/String a="12345678910";StringBuilder a1 = new StringBuilder();a1.append("12345678910");//替换从下标3到下标7之间的电话号码替换为****System.out.println(a1.replace(3,7,"****"));//获取从下标0到下标3之前的值+上****然后+下标7到下标11的值;System.out.println(a.substring(0,3)+"****"+a.substring(7,11));}
}

5.可变字符串

和的区别:

(1)效率比快、(2)比节省内存、(3)可变性

和的区别:

: 可变长字符串,运行效率慢、线程安全,适用于多线程

: 可变长字符串、运行快、线程不安全,适用于单线程效率:>>

和里的用法:

1.(); 追加

2.(); 添加、插入

3.(); 替换

4.(); 删除;清空

5.();反转数组

6.();把转换为

7.();返回内容长度

名称说明

()

创建一个空白的可变的字符串对象,不包含任何内容

( str)

创建一个指定字符串内容的可变字符串对象

1.用法

package java_se.java_jinjie.neibulei.demo06;public class Demo03 {public static void main(String[] args) {
//        StringBuffer sb = new StringBuffer();StringBuilder sb = new StringBuilder();//StringBuilder和StringBuffer的内容完全一样//1.append();追加sb.append("java世界第一");System.out.println(sb.toString());//java世界第一sb.append("java真香");System.out.println(sb.toString());//java世界第一java真香sb.append("java不错");System.out.println(sb.toString());//java世界第一java真香java不错//2.insert(x,"sdsadas");添加 x为下标 sdsadas为内容sb.insert(0,"我在最前面");System.out.println(sb.toString());//我在最前面java世界第一java真香java不错//3.replace(x,x,"sss");sb.replace(0,5,"hello");//替换从下标第0个到下标第5个之前的字符(包含头不包含尾部),修改为hello,如果为(0.5,"he")替换从下标第0个到第5个之前的字符为he 输出为hejava....System.out.println(sb.toString());//hellojava世界第一java真香java不错//4.delete();sb.delete(0,5);//删除从下标第0个到下标第5个之前的字符(包含头不包含尾部)System.out.println(sb.toString());//java世界第一java真香java不错//清空sb.delete(0,sb.length());//从下标0到字符串总长度全部删除System.out.println(sb.toString());//因为全删了所以没有显示输出但是println换行了System.out.println(sb.length());//0 输出sb字符串的长度StringBuilder sb2 = new StringBuilder();sb2.append("java是全世界最好的语言");//追加内容//5.反转字符串输出System.out.println(sb2.reverse());//言语的好最界世全是avaj  }
}

2.效率

package java_se.java_jinjie.neibulei.demo06;/*** 验证StringBuilder效率高于String* 效率:StringBuilder>StringBuffer>String*/
public class demo04 {public static void main(String[] args) {//开始时间long start=System.currentTimeMillis();//String实现String string="";for (int i = 0; i < 99999; i++) {string+=i;}System.out.println(string);//StringBuilder实现
//        StringBuilder sbi = new StringBuilder();
//        for (int i = 0; i < 99999; i++) {
//            sbi.append(i);
//        }
//        System.out.println(sbi.toString());//StringBuffer实现
//        StringBuffer sb = new StringBuffer();
//        for (int i = 0; i < 99999; i++) {
//            sb.append(i);
//        }
//        System.out.println(sb.toString());//结束时间long end =System.currentTimeMillis();//StringBuilder循环9999:用时4 循环99999:21 21 20 19 22平均20.6//StringBuffer循环9999:用时5 循环99999:23 20 20 20 23平均21.2//String    循环9999:用时297 循环99999:16091System.out.println("用时"+(end-start));}
}

5. 1.由来

百度解释: java在java.math包中提供的API类,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和只能用来做科学计算或者是工程计算,在商业计算中要用java.math.。所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是的对象。

通俗易懂就是: flaot和处理小数时会出现精度缺失,于是就引进了对象处理小数。而是对象,不可以直接使用+、-、*、/等 [算术运算符] 直接对其对象进行数学运算,需要使用对象中的方法进行四则运算。

2.为什么使用?

浮点数处理时可能会发生精度缺失。当处理金额相关的数字时,一点点精度缺失当数量级大的时候就是很大损失。

浮点数为什么会发生精度缺失呢?

因为float和都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。

注:根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确,只能无限接近于那个值

什么时候使用?

需要慎重使用!虽然解决了浮点数精度问题,但基本上每步运算都需要创建新的对象,比float和更加的损耗性能。当处理比较重要和对精度有要求的数据(金额)时使用。

3.怎么使用?

有如上图所示的构造方法创建对象,而常用的有如下四种:

(int) 创建一个具有参数所指定整数值的对象

() 创建一个具有参数所指定双精度值的对象(不推荐使用)

(long) 创建一个具有参数所指定长整数值的对象

() 创建一个具有参数所指定以字符串表示的数值的对象(推荐使用)

不推荐将浮点数作为形参传入构造函数

//测试浮点数当做形参传入构造函数时精度缺失
@Test
void contextLoads() {BigDecimal bigDecimal = new BigDecimal(0.1);System.out.println("bigDecimal值为: " + bigDecimal);/**控制台输出:bigDecimal值为: 0.1000000000000000055511151231257827021181583404541015625*/

空间的类别_分析空间类型_

如上代码结果所示: 参数类型为的构造方法的结果有一定的不可预知性。(0.1)它实际上等于0.。

这是因为0.1无法准确地表示为 (或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

推荐使用字符串为形参传入构造函数

(1)类型形参的构造方法是完全可预知的。比如 new ("0.1") 将创建一个 对象,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用构造方法。

(2)当是形参为浮点数时,推荐先将浮点数转换为字符串类型然后放入构造函数中。

例如:new (.(value))或者((value).())。

代码如下图所示:

@Test
void contextLoads() {BigDecimal bigDecimal = new BigDecimal(Double.toString(2.1));BigDecimal bigDecimal1 = new BigDecimal(new Double(2.1).toString());System.out.println("bigDecimal值为: " + bigDecimal);System.out.println("bigDecimal1值为: " + bigDecimal1);
}/**
*控制台输出:
*bigDecimal值为: 2.1
*bigDecimal1值为: 2.1
*/

4.的概括及四则运算的应用

位置: java. math包中。

作用:精确计算浮点数。

创建方式: bd=new (“1.0”);

四则运算:

●Bi add ( bd) 加

● fmal (Bi bd) 减

● imal ( bd) 乘

● div ide ( bd) 除

除法: ( bd, int scal, mode)

●参数scal :指定精确到小数点后几位。

参数mode:

●指定小数部分的取舍模式,通常采用四舍五入的模式,

●取值为. HALF_ UP。

例:

r6=new ("10") .(new ("3"),2,.);

.out.(r6);//3.33

package java_se.java_jinjie.neibulei.demo07;import java.math.BigDecimal;public class Demo01 {public static void main(String[] args) {double d1=1.0;double d2=0.9;System.out.println(d1-d2);//0.09999999999999998//面试题double result=(1.4-0.5)/0.9;System.out.println(result);//0.9999999999999999//BigDecimal,大的浮点数精确计算BigDecimal bd1 = new BigDecimal("1.0");//一定要用字符串BigDecimal bd2 = new BigDecimal("0.9");//一定要用字符串//减法.subtractBigDecimal r1 = bd1.subtract(bd2);System.out.println(r1);//0.1// 加法.addBigDecimal r2 = bd1.add(bd2);System.out.println(r2);//1.9//乘法.multiplyBigDecimal r3 = bd1.multiply(bd2);System.out.println(r3);//0.90// 除法.divide      (1.4-0.5)/0.9BigDecimal r4=new  BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal("0.9"));System.out.println(r4);//1//除不尽时 x填保留位数 后面为四舍五入之意BigDecimal r5=new BigDecimal("10").divide(new BigDecimal("3"));System.out.println(r5);//算数异常(.ArithmeticException),因为除不断BigDecimal r6=new BigDecimal("10")// 保留2位小数 BigDecimal类的四舍五入.divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);System.out.println(r6);//3.33}
}

5.总结

(1) 基本上每步运算都需要创建新的对象,比float和更加的损耗性能。当处理比较重要和对精度有要求的数据(金额)时使用。

(2)不推荐将浮点数作为形参传入构造函数,推荐使用字符串为形参传入构造函数。

(3)当调用(除法)时,为了避免此java.lang.错误产生,可以调用 ( , int scale, ) 也就是(new (value),保留小数点后几位小数,舍入模式)方法。

6.Math类 Math常用方法 方法说明

PI

圆周率

E

自然数的底数

int abs(int a)

获取参数的绝对值

ceil( d)

获取大于或者等于参数的最小整数

floor( d)

获取小于或者等于参数的最大整数

long round( d)

获取对参数四舍五入

pow( a, b )

获取a的b次幂

sqrt( d)

获取参数的平方根

()

获取随机数,0.0-1.0之间

package java_se.java_jinjie.neibulei.demo08;public class TestMath1 {public static void main(String[] args) {//圆周率System . out. println("Math.PI ="+ Math.PI);//Math.PI =3.141592653589793//自然界底数System . out. println("Math.E = " + Math.E);//Math.E = 2.718281828459045//static int abs(int a)返回参数的绝对值System.out.println(Math.abs(-6));//6//static double ceil(double d) 返回大于或者等于参数的最小整数System.out.println(Math.ceil(12.3)); //向上取整数  13.0//static double floor(double d)返回小于或者等于参数的最大整数System.out.println(Math.floor(5.5));//向下取整数   5.0//static 1ong round(double d)对参数四舍五入long round = Math.round(5.5); //取整数部分参 数+0.5System.out.println("round="+ round);//6//static double pow(double a,double b ) a的b次幂System.out.println("Math. pow(2,3) = " + Math.pow(2, 3));//8//static double sqrt(double d) 参数的平方根System.out.println("Math. sqrt(4) ="+ Math.sqrt(3));//平方根(有兴趣可以去了解)1.7320508075688772System.out.println("================");// static double randomO 返回随机数0.0-1.0之间for (int x = 0; x < 5; x++) {System.out.println(Math.random()); //伪随机数}}
}

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了