jdk5以前 手动 装箱/拆箱 jdk5以后 自动 装箱/拆箱
范围 -128-127 缓存数组 同一地址
构造器多种,重载
实现了 序列化接口 和 比较接口
final类 不能被继承
String 的注意事项:
8. final char value【】 不可以修改地址,但内容可以更改
String的两种创建方式
1 .String = "sadas";
2 .String value = new String("sadas");
方式一:直接去 常量池 找sadas 如果找到 直接指向 如果没有找到 就创建
方式二:直接去堆中开空间 然后去 常量池 找 ,有就指向 没有就创建
·
内存图:
注意: intern()方法返回的是常量池的地址
String = "sada" + "sadsa"; 常量 相加看 变量池地址
String a = "hello";
String b = "assada";
String = a + b; 变量 相加看 堆地址
demo测试题: 堆内存流程
/**
Created with IntelliJ IDEA.
@Author: 曾豪杰
@Date: 2022/10/17/9:30
@Description: demo */ public class home {
String str = new String("hsp"); final char[] ch={'j','a','v','a'};
public static void main(String[] args) { home home = new home(); home.change(home.str, home.ch);
System.out.print(home.str+"\tand\t");//输出的是 hsp and hava 不是 java and hava
System.out.println(home.ch);
}
public void change(String str,char ch[]){
str="java";
ch[0]='h';
}
}
substring 左闭右开
大写 toUpperCase 大写
小写 toLowerCase 小写
拼接 a.concat("b").concat("c")
替换replace("a","b")a替换成了b
分割字符串(转义) split("\\\\")按照\\进行切割
(1)如果长度相同 内容不同 前者减去后者
(2)如果长度相同 内容相同 返回0
(3)如果长度不同 前面的内容相同 前者减去后者
(4)如果长度不同 前面的内容不同 直接从不同 前减去后
toCharArray 每个字符分割存到 字符数组中
很多方法与String相同,是可变长度的,是一个容器
String: final char【】每次更新value时 ,常量池的地址就会新建,变化
StringBuffer: char【】 每次更新不用变化,在堆中 如果超出才 新建 堆中地址
所以: StringBuffer 比 String 更高效!!!
stringBuffer常用方法:
1 .增 append
2 .删 delete (涉及范围的都是左闭右开)
3 .改 repleace
4 .查 indexOf //查找子串在字符串第一次出现的索引
5 .插入 insert
6 .获取长度
StringBuffer 练习(工具):
价格的 小数点 前面 每三位 加一个逗号
/**
* @Description: 价格的小数点前面每三位用逗号隔开
* @Param: [name, price]
* @return: java.lang.String
* @Author: 曾豪杰
* @Date: 2022/10/18
*/
public static String setPrice(String name, String price) {
Double aDouble = Double.valueOf(price);//把字符串转成 小数
String format1 = String.format("%.2f", aDouble);//保证小数点 后面有2位
int i = format1.indexOf(".");//获取小数点的下标
int l = 0;
if (i % 3 == 0) {//如果能被整除 ,就减少一个 防止出现 ,456,546.65 情况
l -= 1;
} else {
l = i / 3;//如果不是就 整除
}
StringBuffer stringBuffer = new StringBuffer(format1);//转成stringBuffer
for (int f = 1; f <= l; f++) {//循环增加
stringBuffer.insert(i - 3 * f, ",");//增加 ,
}
String s = stringBuffer.toString();//转成string类型
return String.format("商品\t商品价格\n%s\t%s", name, s);
}
多线程不安全 没有加锁 单线程 比 StringBuffer 快 和StringBuffer API 一模一样 都继承 AbstractBuilder/Buffer类 存放 在char【】 value 都实现了序列化 可以进行传输
StringBuffer 是 线程安全 多线程 使用 可变字符 增改使用
StringBuidler 线程不安全 单线程 使用 可变字符 增改使用
String 是 不可变的 复用性 较高 效率低下
StringBuffer 和 StringBuidler 和 String 的选择
demo题 随机生成 a-b 的一个数 使用Math.Random()
/**
返回指定数组的内容的字符串表示形式。
该类包含用于操作数组的各种方法(如排序和搜索)
Arrays.toString 返回指定数组的内容的字符串表示形式。
Arrays.sort()排序 ,底层用的二叉法 可以实现Comparator接口的匿名内部类 体现了接口编程 排序后堆地址的内容也会改变,数组是引用类型.
自然排序:
Arrays.sort(a, new Comparator() {//影响堆地址
@Override
public int compare(Object o1, Object o2) {
int a1 =(Integer) o1;
int a2 =(Integer) o2;
return a1-a2;
}
});
System.out.println("------------");
System.out.println(Arrays.toString(a));
//[1, 10, 92, 500, 801]
定制排序:
sort(a, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Integer a1=(Integer) o1;
Integer a2=(Integer) o2;
return a2-a1;
}
});
System.out.println(Arrays.toString(a));
}
public static void sort(Integer[] a,Comparator comparator){
int temp;
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if (comparator.compare(a[j],a[j+1])>0){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
二叉搜索,必须有序列,找不到就报-1,
底层是 return-(low+1)找不到就这样返回
int[] b={1,2,3,4,100,900};
int[] ints = Arrays.copyOf(b, b.length+1);
System.out.println(Arrays.toString(ints));
//[1, 2, 3, 4, 100, 900, 0]
Arrays.fill(b,9999);
System.out.println(Arrays.toString(b));
//[9999, 9999, 9999, 9999, 9999, 9999]
boolean equals = Arrays.equals(b, c);
List<Integer> stringList = Arrays.asList(1,65,65,455,88);
System.out.println(stringList);
//[1, 65, 65, 455, 88]
int[] arr={25,645,87,96};
int[] dest=new int[3];
//Arrays.copyOf() 方法也是 底层 arraycopy
/*
* arr 代表 源数组
* srcPos 代表 从原数组 下标哪里开始复制
* dest 代表 要复制的 目标数组
* destPos 代表 目标数组 的第几行开始
* length 代表 复制几个
* */
System.arraycopy(arr,0,dest,0,3);
System.out.println(Arrays.toString(dest));
BigInteger 大整数 new BigInteger("123333333333")
BigDecimal 大小数 new BigDecimal("1111111111.454")
add 加
subtract 减
multiply 乘
divide 除
BigInteger bigInteger = new BigInteger("44444444444444444444444444444444444444444");
BigInteger bigInteger1 = new BigInteger("666666666666666666666666666666666666666666666666");
BigDecimal bigDecimal = new BigDecimal("1111111115555555555555555555.55555555");
BigDecimal bigDecimal1 = new BigDecimal("1.4556");
//加
BigInteger add = bigInteger.add(bigInteger1);
System.out.println(add);
//减
BigInteger subtract = bigInteger1.subtract(bigInteger);
System.out.println(subtract);
//乘
BigInteger multiply = bigInteger.multiply(bigInteger1);
System.out.println(multiply);
//除法
BigDecimal divide = bigDecimal.divide(bigDecimal1, RoundingMode.CEILING);//BigDecimal 要精确
System.out.println(divide);
//666666711111111111111111111111111111111111111110
//666666622222222222222222222222222222222222222222
//29629629629629629629629629629629629629629333333303703703703703703703703703703703703703704
//763335473725993099447345119.23300052
时间 new Date()当前时间
Date date = new Date();
SimpleDateFormat dataFormat = new SimpleDateFormat("YYYY年MM月DD日 HH时mm分ss秒 E");
String format = dataFormat.format(date);
System.out.println(format);
String s="2022年10月291日 20时45分51秒 星期二";
try {
Date parse = dataFormat.parse(s);
System.out.println(parse);
} catch (ParseException e) {
e.printStackTrace();
}
2022年10月291日 20时48分50秒 星期二
Tue Dec 28 20:45:51 GMT+08:00 2021
单例创建 对象直接 调用 静态方法
Calendar instance = Calendar.getInstance();
月份要+1
Calendar instance = Calendar.getInstance();
System.out.println("年:"+instance.get(Calendar.YEAR));
System.out.println("月:"+instance.get(Calendar.MONTH)+1);
System.out.println("日:"+instance.get(Calendar.DAY_OF_MONTH));
instance.get(Calendar.HOUR);
instance.get(Calendar.MINUTE);
instance.get(Calendar.SECOND);
年:2022
月:10
日:19
LocalDate: 年月日
LoaclDateTime: 年月日时分秒
LocalTime: 时分秒
注意:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒 E");
String format = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(format);
//2022年10月19日 14时06分07秒 星期三
SimpleDateFormat dataFormat = new SimpleDateFormat("YYYY年MM月DD日 HH时mm分ss秒 E");
String format = dataFormat.format(new Date());
System.out.println(format);
时间戳
Instant now = Instant.now();
Date from = Date.from(now);
System.out.println(from);
Instant instant = from.toInstant();
System.out.println(instant);
Stirng的常用方法,和业务异常处理
·
package demo10;
import java.util.Scanner;
/**
Created with IntelliJ IDEA.
@Author: 曾豪杰
@Date: 2022/10/19/20:45
@Description: String 异常处理 demo 练习 */ public class home { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); try { System.out.print("请输入用户名:"); String next = scanner.next(); if (!(1 < next.length() && next.length() < 5)) { throw new RuntimeException("用户名格式不对!"); } System.out.print("请输入密码:"); String psd = scanner.next(); Integer integer = Integer.valueOf(psd); if (psd.length() != 6) { throw new RuntimeException("密码格式不对!"); } System.out.print("请输入邮箱:"); idDigital(scanner.next()); System.out.println("信息录入正确!!!"); } catch (RuntimeException e) { System.out.println(e.getMessage()); System.out.println("程序结束!!!"); }
}
public static void idDigital(String email) { if (email.contains("@") && email.contains(".")) { if (email.indexOf("@") > email.indexOf(".")) { throw new RuntimeException("格式错误,@ 必须在 . 的前面!!!"); } return; } throw new RuntimeException("邮件没有包含 @ 和 .");
}
}
intern() 返回的是 池中的地址
当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自池的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用。
评论