什么是JDK API?
Application Programming Interface 应用程序接口
已经写好的,可供直接调用的类。
比如: 字符串操作、IO流、集合操作、线程、网络编程Socket等等
String类
1.1 String对象不能改变
(1)String的底层是字符数组 private final char value[];//定义了一个字符数组
(2)String类是final修饰的,不能继承,不能改变,但引用可以重新赋值
原理:字符串一旦初始化不可更改,但是可以通过在字符串常量池中重写创建一个字符串, 改变引用的指向,进而改变字符串的值
(3)String采用的编码方式是Unicode
1.2 String常量池
(1)Java为了提高性能,静态字符串在常量池中创建,并且是同一对象,使用时直接拿取。
(2)对于重复的字符串直接量,JVM会去常量池查找,如果有则返回,无则创建。
扩展 : 常量池创建了几个对象的问题 String s = new String(String:"a");
两个或1个,如果常量池中有a则返回,如果没有则创建一个a,加上new的对象是两 个。
1.3 String构造方法
String字符串的初始化
(1)直接赋值
(2)通过构造方法初始化
a.public Sting(String str);
b.public String(char[] c);
1.4 String常用方法
(1)判断
boolean equals(Object obj):比较字符串的内容是否相同
(2)截取
int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
(3)转换
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串
(4)其他
String trim():去除字符串两端空格
String[] split(String str):按照指定符号分割字符串
1.5 StringBuilder
1.可变字符串
StringBuilder底层在其父类(AbstractStringBuilder)中封装了一个char类型的数组
StringBuilder创建的初始容量是16
2.构造方法
StringBuilder() 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
StringBuilder(int capacity) 构造一个不带任何字符自己定义容量的字符串生成器
StringBuilder(String str) 构造一个字符串生成器,并初始化为指定的字符串内容。
3.常用方法
append(任意内容):追加字符串
扩容实现原理:数组的Arrays.copyOf方法
扩容算法:源数组容量乘2加2
(长度跟容量不是一个概念)
public static void main(String[] args) {
//1.append方法
StringBuilder sb1 =new StringBuilder();//初始容量16
sb1.append("lllllllllllllllll");//追加的字符串长度:17 超出了初始容量
System.out.println("sb1的容量:" + sb1.capacity());//34 17*2+2
sb1.append("llllllllllllllllll");//18 再次追加超出
System.out.println("sb1的内容:" + sb1);
System.out.println("sb1的容量:" + sb1.capacity());//70 34*2+2
System.out.println("sb1的长度:" + sb1.length());//35
}
insert(int,任意类型)方法:插入
delete(int start,int end):删除
replace(int start,int end,String s):替换
reverse():字符串的反转
4.StringBuilder和StringBuffer区别
(1)StringBuffer是线程安全的
(2)StringBuilder是线程非安全的,因此运行速率较快。
StringBuffer用了synchronized关键字
正则表达式(不是很懂)
Object类
1.Object
java.lang.Object位于java继承关系的顶端。
Object类是所有类的父类
Object类的引用可以指向任意对象。
2.toString方法
当我们直接打印对象时,结果为对象地址值。
重写父类Object的toString方法可以将对象以字符串的形式输出
所以在定义实体类时强烈建议给每一个对象都重写toString方法
3.equals方法
在没有重写equals方法的情况下,它俩比较的都是地址值。
一般情况下,在每一个类中都应重写父类Object的equals方法,使比较更有意义
重写equals后,对象比较的是它的成员变量值。
4.equals和==区别
如果没有重写equals方法,则==和equals没有区别。都比较的是地址信息。
如果重写equals,则比较的是两个对象内容(成员变量的值)。
5.实体类创建
创建时应进行如下操作:
私有化属性
无参构造
有参构造
set和get方法
toString方法
equals和hashcode方法
import java.util.Objects;
public class User {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && Objects.equals(username, user.username) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(id, username, password);
}
}