Java基础–API、Random、String类
从零开始学习java,一天进步一点点,一天学习一点点,多掌握知识和多多做题,本篇主要写API、Random、String类的基础内容
1、API概述
- 什么是API
- API (Application Programming Interface) :应用程序编程接口
- java中的API
- 指的就是JDK中提供的Java类,这些类将底层的实现封装了起来,而我们只需学会使用即可
1.2 API文档
打开帮助文档,一般情况下点击索引,输入关键字即可
2、 Random随机数类
2.1 Random
- 此类的对象用于生产伪随机数
- 可在API文件里,查询Random的使用和详情
2.2 构造方法
- Random() 创建一个新的随机数生成器,默认使用当前的时间(毫秒值)作为种子
- Random(long seed) 使用单个long 种子创建一个新的随机数生成器
- 如果两个随机数的对象使用相同的种子,那么这两个随机数对象调用相同的方法时,那么生成的随机数也一致
2.3 使用
- 获取一个随机的int数字(范围是int所有范围,有正有负):int num = random.nextInt();
- 获取一个随机的int数字(参数代表了范围,左闭右开区间):int num = random.nextInt(3);
- 实际上代表的含义是:(左闭右开----->)[0,3),也就是0~2的范围
import java.util.Random;
public class RanS {
public static void main(String[] args) {
Random random = new Random();
//创建对象
Random rd1=new Random();
System.out.println(rd1.nextInt());
System.out.println(rd1.nextInt(10));
System.out.println(rd1.nextDouble());
System.out.println(rd1.nextBoolean());
//指定种子参数,创建 Random 对象
Random rd2=new Random(565789L);
System.out.println(rd2.nextInt());
Random rd3=new Random(565789L);
System.out.println(rd3.nextInt(10));
int num = random.nextInt();
System.out.println("无参的int随机数:"+num);
int num1 = random.nextInt(3);
System.out.println("有参且到3的int随机数(实际范围是0~2):"+num1);
}
}
2.4 练习
2.4.1 练习一:根据int变量n的值,来获取随机数字,范围是[1,n],可以取到1也可以取到n。但不要0
import java.util.Random;
// 题目要求:
//根据int变量n的值,来获取随机数字,范围是[1,n],可以取到1也可以取到n。但不要0
// 思路:
//1、定义一个int变量,随意赋值
// 2、使用Random
// 3、假设写一个数字“x”,范围为[0~x)(也就是[0~x-1]),但是想要的是:1~x,所以两边共同加一即可
public class Practice {
public static void main(String[] args) {
int n = 10;
Random random = new Random();
//因为“n=10”但结果不取‘0’,但取‘n’,所以在对象后+1即可
int in1 = random.nextInt(n)+1; // 本来范围为[0~n),整体加一后成了:[1~n+1) 也就是[1,n]
System.out.println(in1);
//如果将 “+1” 放在里面
int in2 = random.nextInt(n+1); // 此时,括号里为: n+1 而n为10,所以 int in1 = random.nextInt(11); 范围[0~11)
System.out.println(in2);
}
}
注:+1写在括号外面意思是:我先在[0~n)中拿一个随机数,在+1就是在[1~n]中的了
2.4.2 猜数字
import java.util.Random;
import java.util.Scanner;
// 猜数字
//游戏开始,随机生成一个 1-100 之间的整数,玩家猜测一个数字,与随机生成的对比,系统 提示大或者小,直到玩家猜中,游戏结束
// 思路:
// 1、产生一个随机数字,并不再变化 Random
// 2、用户输入 Scanner
// 3、将随机数与输入数进行比较判断 if
// 4、如果猜错,提示太大或者太小,并且重试
// 5、重试就是在进行一次循环、一次判断,所以次数不固定,则需要死循环
// 6、死循环: while(true) 或者 for(;;){}
public class Practice02 {
public static void main(String[] args) {
Random random =new Random();
int in1 = random.nextInt(100)+1;
// System.out.println(in1);
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入你猜的数字:");
int insc = sc.nextInt();
if (insc>in1) {
System.out.println("输入过大");
}else if(insc<in1){
System.out.println("输入过小");
}else{
System.out.println("输入正确");
break; //跳出死循环
}
}
}
}
2.4.3 随机生成字母
-
随机生成五个不重复的小写字母,并按照字母顺序排列输出
-
package com.bdit.test; import java.util.Arrays; import java.util.Random; //随机生成5个不重复的小写字母,并按照字母顺序排列输出。 //97-122 public class Test03 { public static void main(String[] args) { int[] a= new int[5]; Random random = new Random(); //使随机产生的数,输入到数组里面 for (int i = 0; i < a.length; i++) { a[i] = random.nextInt(25)+97; //判断,随机产生的数 for (int j = 0; j < i; j++) { if(a[i]==a[j]){ i--; break; } } } //排序 Arrays.sort(a); for (int i = 0; i < a.length; i++) { System.out.println("==="+a[i]); char crr = (char)a[i]; // System.out.print(crr+" "); } System.out.println(); System.out.println("英文第一个数"+a[0]); System.out.println("英文第二个数"+a[1]); System.out.println("英文第三个数"+a[2]); System.out.println("英文第四个数"+a[3]); System.out.println("英文第五个数"+a[4]); } }
-
3、 包装类
- 为了丰富基本数据类型之间的各种操作,以及更加符合面向对象编程的思想,java 为基本数 据类型提供了所对应的类,这个类称为包装类。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
位于 java.lang 包下的所有类、无需导包,可以直接使用
-
装箱:就是把基本数据类型可以直接赋值给所对应的包装类对象
-
拆箱:可以把一个包装类对象之间赋值给所对应的基本数据类型
-
装箱和拆箱都是自动完成的
-
package com.bdit.test; public class Test04 { public static void main(String[] args) { //int // Integer()有int和String类型的;String类型的必须都是数字 Integer integer = new Integer(2); Integer integer1 = new Integer("123456"); System.out.println(integer); System.out.println(integer1); // Integer()以过时,可以用但是后续可能会删除,所以一般用其替代类 // Integer.valueOf();也是有int和String类型的;String类型的必须都是数字 Integer integer001 = Integer.valueOf(3); Integer integer002 = Integer.valueOf("123123"); System.out.println(integer001); System.out.println(integer002); Integer integer003 = Integer.parseInt("123456"); System.out.println(integer003); //boolean Boolean boolean001 = Boolean.valueOf("s"); Boolean boolean002 = Boolean.valueOf(true); System.out.println(boolean001); System.out.println(boolean002); Boolean boolean003 = Boolean.parseBoolean("true"); Boolean boolean004 = Boolean.parseBoolean("yes"); System.out.println(boolean003); System.out.println(boolean004); //char System.out.println(Character.valueOf('4'));//与 【 Character character = Character.valueOf('4'); sout 】一致 System.out.println("是否为数字"+Character.isDigit('x'));//isDigit(char ch) 确定指定的字符是否是数字。 System.out.println("是否为数字"+Character.isDigit('4'));//isDigit(char ch) 确定指定的字符是否是数字。 System.out.println("确定指定的字符是字母还是数字"+Character.isLetterOrDigit('*'));//isLetterOrDigit(char ch) 确定指定的字符是字母还是数字。 System.out.println("确定指定的字符是否是一个字母"+Character.isLetter('e'));//isLetter(char ch) 确定指定的字符是否是一个字母。 //装箱 Long long01 = Long.valueOf(5); long lo1=long01; System.out.println(lo1); //拆箱 long lo2 = 23L; Long long02 = lo2; System.out.println(long02); } }
-
4、 String类
4.1 概述
- java.lang.String 类代表字符串。 Java 程序中所有的字符串文字都可以被看作是实现此类的实 例(对象),也就是说凡是用双引号引起来的内容,都是一个字符串 String 类的对象。
- 特点
- 1、字符串是一个不可变的类,也就是字符串的值在创建后不能修改。
- 此处说的不可变指的是值本身不能更改,但是重新给字符串对象赋值,会改变字符串对象指向的内存地址。
- 字符串池的原理来实现以上的过程:字符串池是一个专门用来存储字符串 值得空间,所有创建的字符串对象在赋值时,都需要和字符串池中已有的 内容进行对比,如果内容已经存在,直接引用已存在的值得内存地址;如果不存在,才会把新的内容放到字符串池中。
4.1.1 String 的构造方法
-
三种构造方法:
-
public String(); 创建一个空白字符串,不含有任何内容
-
public String(char[] array); 根据字符数组的内容,来创建对应的字符串
-
public String(byte[] array); 根据字节数组的内容,来创建对应的字符串
-
-
直接创建
-
String str = "Hello"; 右边双引号
-
-
注意: 直接写上双引号,就是字符串对象。
-
默认创建一个字符串对象时,可以直接把内容使用双引号引起来即可。
- 例如: String name=”张三”;
-
可以使用 String 的构造方法来创建对象。
-
例如: String name=new String(“李四”);但是,该方式会创建两个对象,原始对象是构造方法中的字符串参数,name 其实就是一个对象副本
String str1 = new String(); System.out.println(str1); char[]chars={'a','b','c','d'}; String str2=new String(chars); System.out.println(str2); byte[]bytes={48,49,50,51}; String str3=new String(bytes); System.out.println(str3);
-
4.1.2 字符串常量池
- 字符串常量池:程序中直接写上双引号字符串,就在池中(只有直接写双引号,才在池中)。
- 对于基本类型来说: == 是进行数值的比较
- 对于引用类型来说: == 是进行【地址值】的比较
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] ch = {'a','b','c'};
String str3 = new String(ch);
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
4.2 字符串特点
- 程序中所有的双引号字符串都是String类的对象,就算没有new也照样是
- 字符串的内容永不可变
- 字符串不可改变但是字符串可以共享使用(节约内存,前提字符串不可改变)
- 字符串效果上相当于是 char[]字符数组,但底层字节是byte[]字节数组
4.3 String类中比较方法
- ==:比较的是两个字符串对象指向的内存地址是否一样
- public boolean equals(Object str ):判断两个字符串的内容是否一样
- 【compareTo()方法比较两个字符串,首先比较两个字符串的首字母是否一致,如果不一致 就直接使用它们的 ASCII 码值相减作为最终的结果;如果相同,则比较第二个字符,以此类 推。如果有一方已经比较完毕,这种情况下,直接把两个字符串的长度相减作为最终的结果;
package com.bdit.test;
public class Test06 {
public static void main(String[] args) {
// ==:比较的是两个字符串对象指向的内存地址是否一样
// public boolean equals(Object str ):判断两个字符串的内容是否一样
System.out.println("aa".equals("aa"));
System.out.println("aa".equals("AA"));
// 比较两个字符串是否相同,忽略大小写
System.out.println("aa".equalsIgnoreCase("AA"));
// 按字典顺序比较,字符串相等返回0、字符串在参数值之前,返回值小于0,之后大于0
// 【compareTo()方法比较两个字符串,首先比较两个字符串的首字母是否一致,如果不一致 就直接使用它们的 ASCII 码值相减作为最终的结果;如果相同,则比较第二个字符,以此类 推。如果有一方已经比较完毕,这种情况下,直接把两个字符串的长度相减作为最终的结果
System.out.println("aa".compareTo("aa"));
System.out.println("aa".compareTo("ab"));
System.out.println("aa".compareTo("abc"));
System.out.println("ac".compareTo("ab"));
// 按字典顺序比较,忽略大小写
System.out.println("aa".compareToIgnoreCase("AA"));
// 检查一个字符串是否以参数字符串开始
System.out.println("zhangsan".startsWith("a"));
// 检查一个字符串是否以参数个字符串结束
System.out.println("zhangsan".endsWith("n"));
// indexOf(int ch) 返回指定字符第一次出现的字符串内的索引。
// indexOf(int ch, int fromIndex) 返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
// indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。
// indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
System.out.println("zhangsan".indexOf("n"));
System.out.println("zhangsan".indexOf("m"));
System.out.println("zhangsan".indexOf("a",4));//6
System.out.println("zhangsan".indexOf("an"));//2
System.out.println("zhangsan".indexOf("an",4));//6
// charAt(int index) 返回指定索引处的 char值。
System.out.println("zhangsan".charAt(5));
// substring(int beginIndex) 返回一个字符串,是除此位置的剩余所有字符从1开始。
// substring(int beginIndex, int endIndex) 提取从beginIndex开始到endIndex(不包括此位置)之间的字符串
System.out.println("zhangsan".substring(1));
System.out.println("zhangsan".substring(2,5));
// concat(String str) 将指定的字符串连接到该字符串的末尾。
System.out.println("zhangsan".concat("lisi"));
// replace(char oldChar, char newChar) 返回从替换所有出现的导致一个字符串 oldChar ,在这个字符串 newChar 。
System.out.println("zhangsan".replace("zhangsan","lisilii"));
// trim()忽略前后空白
System.out.println(" 前后空白 后".trim());
// toUpperCase()所有字符都转为大写
System.out.println("zhangsan".toUpperCase());
// toLowerCase()都转为小写
System.out.println("TIMI".toLowerCase());
// 将此字符串转换为新的字符数组
char[] ch1 = "zhangsan".toCharArray();
for (int i = 0; i < ch1.length; i++) {
System.out.print(ch1[i]+" ");
}
System.out.println();
// 将此字符串按照给定的规则进行字符串的拆分
String str1 ="String-lei-de-ying-yong";
String[] str2 =str1.split("-");
for (int i = 0; i < str2.length; i++) {
System.out.println(str2[i]);
}
}
}
5、 StringBuffer 和 StringBuilder 类
5.1 概述
- 由于String类的对象的内容是不可改变的,所以在每次字符串操作后,总会在内存中创建一个新的对象,即耗时又浪费内存空间,所以为了解决这一个问题,java中提供了java.lang.StringBuffer 和 java.lang.StringBuilder 类,这两个类又称为可变字符序列,他是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该对象的长度和内容
- StringBuffer 和 StringBuilder 是个字符串的缓冲区,即它是一个容器,容器中可以装很多字 符串,并且能够对其中的字符串进行各种操作。
- 它们的内部都拥有一个数组用来存放字符串内容,进行字符串操作时,直接在数组中操作, 它们会自动维护数组的扩容。
5.2 StringBuffer 构造方法
- public StringBuffer() :构造一个没有字符的字符串缓冲区,初始容量为 16 个字符。
- public StringBuffer(String str) :构造一个初始化为指定字符串内容的字符串缓冲区
5.3 StringBuilder 构造方法
- public StringBuilder() :构造一个没有字符的字符串缓冲区,初始容量为16个字符。
- public StringBuilder(String str) :构造一个初始化为指定字符串内容的字符串缓冲区。
5.4 两者区别
【StringBuffer 和 StringBuilder 两者的操作几乎是一模一样的,只不过 StringBuffer 是线程安 全(同步)的,StringBuilder 是线程不安全(同步)。】 如果不考虑,线程问题,那么 StringBuilder 的效率是最高的,String 永远效率是最低的
5.总结
本篇大部分为应用,不要死记硬背,因为如果死记硬背算记住在应用上也是很生涩的,并没有那种依靠自己理解来记住用的方便,而基础的问题一定要掌握,基础打好等到后面难的也会变简单。