1.String 类
1.字符串基础知识
1.字符串:一串字符在内存中的连续排序
2.Java中有两个类来表示字符串:String和StringBuffer
3.Java中字符串的封装使得程序更健壮、安全
4.String和String Buffer可以在运行时作边界检查,自动捕获异常,提高程序的健壮性
2.String类的构造方法
public String();
public String(String s);
public String(char c[]);
public String(StringBuffer but);
public String(byte b[]);
public String(char c[], int offset, int count);
public String(byte b[], int offset, int count);
认识即可
3.String类的常用方法
求字符串长度
public int length();
字符串连接
public String concat(String s);
字符串截取
public char charAt(int index); substring(int start, int end);
判断字符串的前缀和后缀
public boolean startsWith(String prefix);
public boolean endsWith(String prefix);
字符串比较
public boolean equals(Object obj);
public int compareTo(String s);
字符串分隔
public String[] split(String tag);
字符串中子串的查找
public int indexOf(string s);
public int indexOf(String s, int fromIndex);
public int lastIndexOf(String s);
字符数组->字符串
public static String copyValueOf(char[] data);
public static String copyValueOf(char[] data, int offset, int count);
字符串->数组(字符、字节)
public char[] toCharArray();
public char[] getChars(int start, int end, char c[], int i);
public byte[] getBytes();
字符串大小写转换
public String toUpperCase();
public String toLowerCase();
字符替换
public String replace();
删除字符串前后空格
public String trim();
String和其他类型数据的转换
| 类型 | 字符串 | 转化方法 |
|---|---|---|
| int i | String s | s=String.valjueOf(i); 或者 s = “”+I; i = Integer.parseInt(s) |
| double d | String s | s = String.valueOf(d); s=’’ ‘’ + d; d=Double.parseDouble(s); |
| boolean b | String s | s= String.valueOf(b); s = " " + b; b=Boolean.parseBoolean(s); |
4.对象的字符串表示
Object类有一个toString()方法,一个对象通过调用这个方法可以返回该对象的字符串表示:类的名字@对象的引用的字符串
5.正则表达式
- 含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式中的元字符
- 可以用方括号括起来的若干个字符来表示一个元字符,可以代表方括号中的任何一个字符
- regex="[159]ABC",那么"1ABC","5ABC"都是和正则表达式regex匹配的字符串
- 正则表达式中可以使用限定修饰符
| 带限定符号的模式 | 意义 |
|---|---|
| X? | X出现0次或1次 |
| X* | X出现0次或多次 |
| X+ | X恰好出现n次 |
| X{n} | X恰好出现n次 |
| X{n,} | X至少出现n次 |
| X{n,m} | X出现n至m次 |
例:regex = “@\\w{4}”,那么"@abcd"、"@girl"都是与正则表达式regex匹配的字符串之一
2.StringBuffer类
1.StringBuffer 对象 创建
- StringBuffer类可以改变一个串的值和长度,可以方便地在字符串里加入字符和替换字符,一般用在需要频繁修改一个字符串变量的场景
- 构造方法
- StringBuffer():初始可以容纳16字符
- StringBuffer(int size):初始容量由size指定
- StringBuffer(String s):初始容量为s的长度+16,String和StringBuffer相互转换
- 当初始容量不够时,实体的容量会自动增加
2.StringBuffer常用的方法
- 对象实体的长度
- int length():实体中存放的字符序列的长度
- int capacity():实体当前的实际容量
- 添加实体内容 StringBuffer append(String s)
- 查找指定位置的字符 public char charAt(int n)
- 替换制定位置的字符 public void setCharAt(int n,char ch)
- 在指定位置插入字符 StringBuffer insert(int index,String str)
- 将实体中的字符翻转 public StringBuffer reverse()
- 删除置顶位置的字符
- StringBuffer delete(int startIndex, int endIndex)
- StringBuffer delete(int start)
- 替换置顶位置的子串 StringBuffer replace(int startIndex, int endIndex, String str)
3.String和StringBuffer的区别
- String是不可变对象(immutable)
- StringBuffer是可变的(mutable)
4.StringBuffer和StringBuilder的区别
1.StringBuilder类
+ 类似于StringBuffer类,和StringBuffer之间最大的恶不同在于StringBuilder的方法不是线程安全的(不能同步访问)
+ StringBuilder相较于StringBuffer有速度优势
2.线程安全
StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 StringBuilder 修饰。
StringBuffer代码片段
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
3. 缓冲区
StringBuffer代码片段
private transient char[] toStringCache;
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 代码片段:
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
可以看出,StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。
而 StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。
所以,缓存冲这也是对 StringBuffer 的一个优化吧,不过 StringBuffer 的这个toString 方法仍然是同步的。
4.性能
既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。
3.Scanner类
Scanner类可以用来获取控制台输入
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[5];
int i = 0;
while(scanner.hasNext()) {
arr[i] = scanner.nextInt();
i ++;
if (i >= arr.length) {
break;
}
}
scanner.close();
}
4.时间显示类
1.Date类
使用Date类的无参构造方法创建的对象可以获取本地当前时间
Date date = new Date();
Date 对象表示的时间默认顺序是星期、月、日、小时、分、秒、时区、年
System类的public long currentTimeMillis()方法可以获取当前时间的毫秒数(从1970年1月1日8点开始走过的毫秒数)
2.Calendar类
使用Calendar类的getInstance()方法可以初始化一个Calendar对象;
可以使用相应的set和get方法当前的时间信息
public final void set(int year, int month, int date, int hour, int minute, int second)
calendar.get(DAY_OF_WEEK)
3.日期的格式化
- 使用SimpleDateFormat类,设置好格式之后用format方法
SimpleDareFormat df = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
df.format(new Date());
- format方法,format(格式化模式,日期列表)
String.format("%tY年%tm月%td日", new Date(), new Date(), new Date());
- 用几个格式符格式化“日期列表”中的同一个日期:“<"
String.format("%tY年%tm月%<td日", new Date());
- 不同区域的星期格式有所不同
5.Class类
1.使用Class实例化一个对象
- 创建对象除了用new运算符和构造方法,还可以用Class对象的到某个类的实例
- public static Class forName(String className) throws ClassNotFoundException
- public Object newInstance() throws InstantiationException, Illegal AccessException
- 经过上面两部可以实例化出一个className类的对象,className类必须有无参的构造方法
2.获取类的信息
当一个类被加载且创建对象时,和该类相关的一个类型为Class的对象就会自动创建;getClass()方法;这个Class对象有一些方法;
- String getName():返回类的名字
- Constructor[] getDeclaredContructors():返回类的全部构造方法
- Field[] getDeclaredFields:返回类的全部成员变量
- Mothod[] getDeclaredMothods():返回类的全部方法
3.Object类
Object中的方法被所有的类继承——因此,这些方法都有类的“公共特性”
- public boolean equals(Object o)
表示两个对象是否相等,不同的子类会有不同的“相等逻辑”
如果子类没有覆盖equals方法,则继承Object的“相等逻辑”
Object里的equals仅仅表示两个对象“是否同一个对象(地址是否相等)”,等价于“=”
典型重载:String的equals():Integer的equals()
JDK在Object中设计equals()方法的原因:想胃用户自定义的子类更方便地融入、利用Java中的一些工具类方法提供便利、可能 - public String toString()
表示一个对象的“字符串表示”——一般对象是立体的
如果子类没有覆盖toString()方法,则继承Object的“字符串”表示——类的Class信息
自己的类可以根据需要重写toString(),如Point类中
public String toString(){
return “x=” +x+“,y=”+y;
}
- public final Class getClass()
返回一个对象所属类的相关信息——该类元数据信息区的地址
是final不能被重写
是Java“反射特性”的基础,可以实现:由一个类的名字,生成对应的对象 - public int hashCode()
- notify() , wait()
6.泛型
1.Vector类
是Java自带的累,实现自增长动态数组。
适合使用Vector类的场合:
- 需要处理的对象数目不定,序列中的元素是对象
- 需要将不同类的对象组合成一个数据序列
- 需要做频繁的插入和删除操作
- 需要进行查找操作
适合使用数组的场合:
- 序列中的元素是简单数据类型,主要的操作:顺序访问
- 序列中的元素数目固定,插入、删除和查找操作较少
vector类说明
- 创建Vector类
- public Vector()
- public Vector(int size)
- public Vector(int size, int incrSize)
- 添加元素
- public void add(Object obj)
- add(Object obj)
- public void add(int index, Object obj)
- 修改元素
- public void set(Object obj, int index)
- 删除元素
- public void remove(int index)
- public void removeAll()
- 访问Vector的元素
- public Object get(int i)
- Vector的长度
- public int size()
2.Arrays,Collections 工具类
- Java中提供两个类(Arrays,Collections)用于封装数组、集合类的通用处理方法(判断相等、填充、排序、查找等);
- Arrays, Collections的构造方法都是private,不能实例化对象,类里面定义的方法均为static
- 可以对比学习Collections, Arrays 它们有很多方法功能类似,参数不同;
- public static boolean equals(Object[] o1, Object[] o2);
- public static void fill(Object[] o, Object val);
- public static void sort(Object[] o);
- public static int binarySearch(Object[] a, Object key);
3.链表
例:
LinkedList<String> mylist = new LinkedList<String>();
LinkedList/常用方法:有实现List接口的方法和它本身的新增的方法
- public boolean add(E element):向链表末尾添加一个新的结点
- public int size():返回链表的长度
- public void addFirst(E element):向链表的头添加新结点
Iterator iter = nylist.iterator();
While(iter.hasNext()){
String te = (String)iter.next();
System.out.println(te);
}
遍历链表
链表对象可以使用iterator()方法获取一个Iterator对象,该对象就是针对当前链表的迭代器
4.散列映射
存储“键/值对”,允许把任意数量的“键/值对”存储在一起
HashMap/<String,Student>hash table = HashSet/<String,Student>();
HashMap<K,V>常用方法
- public void clear():清空散列映射
- public int size():返回散列映射的大小,
- public V get(Object key):返回散列映射中使用key作为键的值

453

被折叠的 条评论
为什么被折叠?



