目录
1.5 StringBuffer与StringBuilder
1.5.1 StringBuffer和StringBuilder中的常用方法
2.1 System类的currentTimeMillis()
一、String
1.1 String的理解
1.1.1 类的声明
- public final class String
- implements java.io.Serializable, Comparable<String>, CharSequence
- final:string是不可被继承的
- Serializable:可序列化的接口。凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输。
- Compsrable:凡是实现此接口的类,其对象都可以比较大小。
1.1.2 内部声明的属性:
-
jdk8中:
-
private final char valve[];//存储字符串数据的容器
-
final :指明此valve数组一旦初始化,其地址就不可变,
-
jdk9开始:为了节省内存空间,做了优化
-
private final byte[] value;//存储字符串数据的容器
1.2 String的实例与连接
1.2.1 字符串常量的存储位置
-
字符串常量都存储在字符串常量池(StringTable)中
-
字符串常量池不允许存放两个相同的字符串常量。
-
字符串常量池,在不同的jdk版本中,存放位置不同。
-
jdk7之前:字符串常量池存放在方法区
-
jdk7及之后:字符串常量池存放在堆空间。
1.2.2 Strinq的不可变性的理解
- 当对字符串变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改
- 当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有的位置修改
- 当调用字符串的replace()替换现有的某个字符时,需要重新开辟空间保存修改以后的字符串,不能在原有的位置修改
1.2.3 String的连接操作:+
- 情况1:常量 + 常量 --->结果仍然存储在字符串常量池中,返回此字面量的地址。注:此时的常量可能是字面量,也可能是final修饰的常量
- 情况2:常量 + 变量 或 变量 + 变量 --->都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址
- 情况3:调用字符串的intern():返回的是字符串常量池中字面量的地址
- 情况4:concat(xxx):不管是常量调用此方法,还是变量调用,同样不管参数是常量还是变量,总之,调用完concat()方法都返回一个新new的对象。
1.3 String的构造器与常用方法
1.3.1 常用方法
- boolean isEmpty():字符串是否为空
- int length():返回字符串的长度
- String concat(xx):拼接
- boolean equals(0bject obj):比较字符串是否相等,区分大小写
- boolean equalsIgnogeCase(0bject obj):比较字符串是否相等,不区分大小写
- int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
- int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
- String toLowerCase():将字符串中大写字母转为小写
- String toUpperCase():将字符串中小写字母转为大写
- String trim():去掉字符串前后空白符
- public String intern():结果在常量池中共享
- boolean contains(xx):是否包含xx
- int indexof(xx):从前往后找当前字符串中xx,如果有返回第一次出现的下标,要是没有返回-1
- int indexof(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
- int lastlndexof(xx):从后往前找当前字符串中x,即如果有返回最后一次出现的下标,要是没有返回-1
- int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
- string substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginindex开始截取到最后的一个子字符串。
- String substring(int beginlndex,int endindex):返回一个新字符串,它是此字符串从beginindex开始截取到endlndex(不包含)的一个子字符串。
- char charAt(index):返回[index]位置的字符
- char[] tocharArray(): 将此字符串转换为一个新的字符数组返回
- boolean startswith(xx):测试此字符串是否以指定的前缀开始
- boolean startswith(string prefix,int tofset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
- boolean endswith(xx):测试此字符串是否以指定的后缀结束
作用相同的方法:
作用: 返回指定数组中表示该字符序列的 String
- static String value0f(char[] data)
- static String value0f(charl] data,int offset, int count)
- static string copyValueof(char[]data)
- static string copyValueOf(charl] data,int offset,int count)
1.4 String的课后练习
题目1
将一子符串进行反转。将子符串中指定部分进行反转。"abcdefg"反转为"abfedcg"
import org.junit.Test;
* 将一个字符串进行反转,“abcdefg” 反转成abfedcg
*
public class ApiTest {
@Test
public void test(){
String s = "abcdefg";
String s1 = show(s,2,5);
String s2 = show(s,2,5);
System.out.println(s1);
System.out.println(s2);
}
//方式1
public String show(String str,int fromindex,int toindex){
char[] a1 = str.toCharArray();
char temp;
for (int i = fromindex, j = toindex; i < j ; i++,j--) {
temp = a1[i];
a1[i] = a1[j];
a1[j] = temp;
}
return new String(a1);
}
//方式2
public String show1(String str,int fromindex,int toindex){
String finalstr = str.substring(0,fromindex);
for (int i = toindex; i >= fromindex; i--) {
finalstr += str.charAt(i);
}
finalstr += str.charAt(toindex + 1);
return new String(finalstr);
}
}
结果:
题目2
获取一个字符串在另一个字符串中出现的次数。获取"ab"在"abkkcadkabkebfkabkskab"中出现的次数
import org.junit.Test;
public class ApiTest{
@Test
public void test1(){
String str = "abcefsabeabfeab";
String subStr = "ab";
int count = show3(str,subStr);
System.out.println("该字符串出现次数为:" + count);
}
public int show3(String str,String subStr){
int count = 0;
if (str.length() >= subStr.length()) {
int index = str.indexOf(subStr);
while(index >= 0){
count++;
index = str.indexOf(subStr,index + subStr.length());
}
}
return count;
}
}
结果:
题目3
模拟用户登录
(1)定义用户类,属性为用户名和密码,提供相关的getter和setter方法,构造器,tostring()
(2)使用数组存储多个用户对象。
(3)录入用户和密码
- 对比用户信息,匹配成功登录成功,否则登录失败。
- 当用户名错误,提示没有该用户;
- 当密码错误时,提示密码有误。
import java.util.Scanner;
class User {
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "库中的用户有:[" + name + '-'+ password + ']';
}
}
public class userTest {
public static void main(String[] args) {
User[] user = new User[3];
user[0] =new User("Tom","8888");
user[1] =new User("songhk","123");
user[2] =new User("jerry","6666");
for (int i = 0; i < user.length; i++) {
System.out.println(user[i]);
}
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名: ");
String userName = scanner.next();
System.out.print("请输入密码: ");
String password = scanner.next();
boolean isFlag = true;
for (int i = 0; i < user.length; i++) {
if (user[i].getName().equals(userName)) {
isFlag = false;
if (user[i].getPassword().equals(password)){
System.out.println("用户登录成功!"+userName);
}else {
System.out.println("输入的密码有误!");
}
break;
}
}
if (isFlag) {
System.out.println("没有该用户!");
}
scanner.close();
}
}
1.5 StringBuffer与StringBuilder
1.5.1 StringBuffer和StringBuilder中的常用方法
增:
-
append(xx)
删:
- delete(int start,int end)
- deleteCharAt(int index)
改:
- replace(int start,int end,String str)
- setCharAt(int index,char c)
查:
- charAt(int index)
插:
- insert(int index,xx)
长度:
- length()
测试:
@Test
public void test(){
String str = null;
StringBuffer sb =new StringBuffer();
sb.append(str);
System.out.println(sb.length());
System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str);
System.out.println(sb1);
}
结果:输出4,“null”,空指针异常
二、日期API的使用
2.1 System类的currentTimeMillis()
- 获取当前时间对应的毫秒数,long类型,时间戳
- 当前时间与1970年1月1日0时0分0秒之间的毫秒数
- 常用来计算时间差
2.2 两个Date类
--java.util.Date
- 两个构造器的使用
- 两个方法的使用:①tostring()② long getTime()
- ----java.sql.Date:对应着数据库中的date类型
2.3 SimpleDateFormat类
SimpleDateFormat类:用于日期时间的格式化和解析
- 格式化:日期--->字符串
- 解析:字符串--->日期
2.4 Calendar:日历类
- 实例化 由于calendar是一个抽象类,所以我们需要创建其子类的实例。这里我们通过calendar的静态方法getInstance()即可获取
- 常用方法:get(int field) / set(int field,xx) / add(int field,xx) / getTime() / setTime()
2.5 代码实现
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class DateTest {
@Test
public void test(){
Date date1 = new Date();
System.out.println(date1.toString());
long millitime = date1.getTime();
System.out.println("对应的毫秒数为:" + millitime);
Date date2 = new Date(1370202256045L);
System.out.println(date2.getTime());
}
@Test
public void test2(){
java.sql.Date date4 = new java.sql.Date(1370202256045L);
System.out.println(date4.toString());
}
@Test
public void test3() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat();
Date date1 = new Date();
//格式化:日期--->字符串
String strdate = sdf.format(date1);
System.out.println(strdate);
//格式化:字符串-->日期
Date date2 = sdf.parse("2024/10/16 下午5:28");
System.out.println(date2);
}
@Test
public void test4() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = new Date();
//格式化:日期--->字符串
String strdate = sdf.format(date1);
System.out.println(strdate);
//格式化:字符串-->日期
Date date2 = sdf.parse("2024-10-16 17:28:37");
System.out.println(date2);
}
@Test
public void test5(){
// 实例化Calendar对象
Calendar calendar = Calendar.getInstance();
// 获取当前时间
System.out.println("当前时间: " + calendar.getTime());
// 获取年、月、日、时、分、秒
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.printf("当前日期: %d-%02d-%02d %02d:%02d:%02d%n", year, month, day, hour, minute, second);
// 设置特定的日期和时间
calendar.set(Calendar.YEAR, 2024);
calendar.set(Calendar.MONTH, Calendar.OCTOBER);
calendar.set(Calendar.DAY_OF_MONTH, 31);
calendar.set(Calendar.HOUR_OF_DAY, 18);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
// 打印设置后的日期和时间
System.out.println("设置后的时间: " + calendar.getTime());
// 添加一个月
calendar.add(Calendar.MONTH, 1);
System.out.println("添加一个月后的时间: " + calendar.getTime());
// 减去五天
calendar.add(Calendar.DAY_OF_MONTH, -5);
System.out.println("减去五天后的时间: " + calendar.getTime());
// 设置为当前时间
calendar.setTime(new Date());
System.out.println("重置为当前时间: " + calendar.getTime());
}
}
2.6 JDK8后的日期时间API
1. LocalDate,LocalTime,LocalDateTime:--->类似于Calendar
- 实例化:now()/of(xxx,xx,xx)
- 方法:get()/withXxx()/plusXxx()/ minusXxx()
2.Instant:瞬时 --->类似于Date
- 实例化:now()/ofEpochMilli()
- 方法:toEpochMilli()
3.DateTimeFormatter--->类似于SimpleDateFormat
- 用于格式化和解析LocalDate,LocalTime,LocalDateTime
2.6.1 练习
使用Calendar获取当前时间,把这个时间设置为你的生日,再获取你的百天(出生后100天)日期
使用LocalDateTime获取当前时间,把这个时间设置为你的生日,再获取你的百天(出生后100天)日期。
代码实现:
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Calendar;
public class DateTest {
@Test
public void test(){
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println("你的生日是: "+ date);
calendar.add(Calendar.DAY_OF_YEAR,100);
Date newDate = calendar.getTime();
System.out.println("生日的一百天后的时间为:"+ newDate);
}
@Test
public void test1(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("你的生日为: "+localDateTime);
LocalDateTime localDateTime1 = localDateTime.plusDays(100);
System.out.println("生日的一百天后的时间:"+localDateTime1);
}
}
三、 Comparator接口
3.1 Comparable接口实现自然排序
3.1.1 实现步骤
- 具体的类A实现Comparable接口
- 重写Comparable接口中的compareTo(0bject obj)方法,在此方法中指明比较类A的对象的大小的标准
- 创建类A的多个实例,进行大小的比较或排序。
3.1.2 代码实现
class Product implements Comparable{
private String name;
private double price;
public Product() {
}
public Product(String name, int 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(int price) {
this.price = price;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
public int compareTo(Object o) {
if (o == this) {
return 0;
}
if (o instanceof Product) {
Product p = (Product) o;
int value = Double.compare(this.price,p.price);
if (value != 0) {
return value;//如果是从大到小加一个 '-' 号
}
return this.name.compareTo(p.name);//如果是从大到小加一个 '-' 号
}
throw new RuntimeException("类型不匹配");
}
}
public class DateTest {
@Test
public void test() {
Product[] arr = new Product[5];
arr[0] = new Product("HuaweiMate50pro", 6299);
arr[1] = new Product("Xiaomi13pro", 4999);
arr[2] = new Product("Vivox90pro", 5999);
arr[3] = new Product("Iphone14ProMax", 9999);
arr[4] = new Product("HonorMagic4", 6299);
Arrays.sort(arr);
//排序后,遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
结果:
3.2 Comparator接口实现定制排序及对比
3.2.1 实现步骤
- 创建一个实现了Comparator接口的实现类A
- 实现类A要求重写Comparator接口中的抽象方法compare(0bject o1,0bject o2),在此方法中指明要比较大小的对象的大小关系。(比如,string类、Product类)
- 创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如:Arrays.sort(..,类A的实例)
3.2.2 代码实现
import org.junit.Test;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
class Product{
private String name;
private double price;
public Product() {
}
public Product(String name, int 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(int price) {
this.price = price;
}
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
public class DateTest {
@Test
public void test() {
Product[] arr = new Product[5];
arr[0] = new Product("HuaweiMate50pro", 6299);
arr[1] = new Product("Xiaomi13pro", 4999);
arr[2] = new Product("Vivox90pro", 5999);
arr[3] = new Product("Iphone14ProMax", 9999);
arr[4] = new Product("HonorMagic4", 6299);
//使用comparator
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Product && o2 instanceof Product) {
Product p1 = (Product) o1;
Product p2 = (Product) o2;
return Double.compare(p1.getPrice(), p2.getPrice());
}
throw new RuntimeException("类型不匹配'");
}
};
Comparator comparator1 = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Product && o2 instanceof Product) {
Product p1 = (Product) o1;
Product p2 = (Product) o2;
return p1.getName().compareTo(p2.getName());
}
throw new RuntimeException("类型不匹配'");
}
};
Arrays.sort(arr,comparator1);//比较不同的内容,依靠调用不同的对象
//排序后,遍历
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
3.3 两种方式的对比
角度一:
- 自然排序:单一的,唯一的
- 定制排序:灵活的,多样的
角度二:
- 自然排序:一劳永逸的
- 定制排序:临时的
角度三:
- 自然排序:对应的接口是Comparable,对应的抽象方法compareTo(0bject obj)
- 定制排序:对应的接口是Comparator,对应的抽象方法compare(0bject obj1,0bject obj2)
四、其他常用类
4.1 System类
- 属性:out、in、err
- 方法:currentTimeMillis()/gc()/exit(int status)/ getProperty(String property)
4.1.1 代码使用
public class SystemExample {
public static void main(String[] args) {
// 输出当前时间的毫秒数
long currentTime = System.currentTimeMillis();
System.out.println("获取当前时间的毫秒数: " + currentTime);
// 执行垃圾回收
System.gc();
// 获取系统属性
String javaHome = System.getProperty("java.home");
System.out.println("使用的jak版本: " + javaHome);
// 退出程序,状态码0表示正常退出
// System.exit(0); // Uncomment to exit
}
}
4.2 Runtime类
- 对应着Java进程的内存使用的运行时环境,是单例的
4.2.1 代码使用
public class RuntimeExample {
public static void main(String[] args) {
// 获取 Runtime 实例
Runtime runtime = Runtime.getRuntime();
// 输出 Java 虚拟机的内存信息
long memoryBefore = runtime.totalMemory() - runtime.freeMemory();
System.out.println("使用之前的内存: " + memoryBefore + " bytes");
// 请求垃圾回收
runtime.gc();
// 输出当前使用的内存
long memoryAfter = runtime.totalMemory() - runtime.freeMemory();
System.out.println("使用之后的内存: " + memoryAfter + " bytes");
}
}
4.3 Math类
- 凡是与数学运算相关的操作,大家可以在此类中找相关的方法即可
4.3.1 代码使用
public class MathExample {
public static void main(String[] args) {
// 计算平方根
double sqrtValue = Math.sqrt(16);
System.out.println("16的平方根: " + sqrtValue);
// 计算幂
double powerValue = Math.pow(2, 3);
System.out.println("2 的 3 次方: " + powerValue);
// 计算绝对值
int absValue = Math.abs(-10);
System.out.println(" -10 的绝对值: " + absValue);
}
}
4.4 BigInteger类和BigDecimal类
- BigInteger:可以表示任意长度的整数
- BiqDecimal:可以表示任意精度的浮点数
4.4.1 代码使用
import java.math.BigInteger;
import java.math.BigDecimal;
public class BigNumberExample {
public static void main(String[] args) {
// BigInteger 示例
BigInteger bigInt1 = new BigInteger("123456789012345678901234567890");
BigInteger bigInt2 = new BigInteger("987654321098765432109876543210");
BigInteger bigIntSum = bigInt1.add(bigInt2);
System.out.println("BigInteger 总和: " + bigIntSum);
// BigDecimal 示例
BigDecimal bigDec1 = new BigDecimal("12345.67890");
BigDecimal bigDec2 = new BigDecimal("0.00001");
BigDecimal bigDecSum = bigDec1.add(bigDec2);
System.out.println("BigDecimal 总和: " + bigDecSum);
}
}
4.5 Random类
- 获取指定范围的随机整数:nextInt(int bound)
4.5.1 代码使用
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
// 获取指定范围的随机整数
int bound = 100; // 随机范围是 0 到 99
int randomInt = random.nextInt(bound);
System.out.println("介于 0 和 " + (bound - 1) + "之间的随机整数为:" + randomInt);
}
}
标签:常用,Java,String,int,System,API,new,public,out
From: https://blog.csdn.net/m0_72047169/article/details/142969264