lang包常用类
Object类
- toString方法 : 获得对象的字符串形式,默认获得的是:包名+类名@十六进制内存地址
- equals方法:比较两个对象是否相等,默认比较的是 == ,可以在子类中重写equals方法自定义比较的内容。
- clone方法:将一个对象克隆,获得一个拥有相同属性及状态的对象,对象要进行克隆就要实现Cloneable接口,否则就会出现异常
- hashCode方法: 获得对象的哈希码值,默认的哈希码值是用对象的内存地址,通过一个哈希算法获得的值称为哈希码值。在某些环境下,代表了这个对象。
- finalize方法:当垃圾回收器要回收这个对象时,会调用这个对象的finalize方法完成回收。程序员调用finalize方法是无效的
包装类/封装类
八种基本类型都有对应的包装类,Java是面向对象编程,操作的都是对象,而基本类型不是对象,有时我们要将基本类型的数据当做对象使用,就要将基本类型的数据封装为包装类对象;
所有的包装类中都封装了一个对应的基本类型属性。
byte — Byte
short — Short
int — Integer
long — Long
char — character
fioat — Float
double — Double
boolean — Boolean
Integer
- 如何将int封装为Integer对象;如何获取Integer对象中的int值
Integer integer1 = new Integer(3); Integer integer11 = new Integer(3); System.out.println(integer1==integer11); //将字符串解析为int Integer integer2 = new Integer("3"); //推荐使用: //判断参数是否在-128~127 之间,如果在这个范围,// 则从Integer数组(-128~127的Integer对象)中取出对应的Integer对象//如果不在这个范围,则创建了新的Integer对象//因为为了节省内存,-128~127之间的整数是最长使用的//这个数组也称为整数常量池Integer integer3 = Integer.valueOf("3");Integer integer33 = Integer.valueOf("3");System.out.println(integer3==integer33);获取int值
Integer integer1 = new Integer(3);System.out.println(integer1.intValue());- Integer.parseInt方法: 将字符串解析为int值
方法就三个: Integer.valueOf 、Integer.parseInt、integer对象.intValue
自动拆装箱
为了方便程序员编程,在JDK5版本出现了自动拆装箱功能,Integer和int在编码时类型无差别。
例如:
public static void main(String[] args) { //自动装箱 : 编译后的代码:Integer i = Integer.valueOf(3) //自动拆装箱以变量类型为准 Integer i = 3; //自动拆箱 int i2 = 3; int i2 = Integer.valueOf(3); //自动装箱 test(Integer.valueOf(3)) test(3); } public static void test(Object obj){ }清晰:
public static void main(String[] args) { Integer i1 = 3; Integer i2 = 3; System.out.println(i1==i2); //true Integer i3 = 300; Integer i4 = 300; System.out.println(i3==i4); //false int i5 = Integer.valueOf(300); //int i5 = 300; int i6 = Integer.valueOf(300); System.out.println(i5==i6); //true //自动拆箱 System.out.println(Integer.valueOf(3)+3==6); System.out.println(Integer.valueOf(3)==3);}public static void test(Object obj){}String字符串类
String是一个内容不可改变的字符序列。
内容不可改变:字符串的内容不能改变,如果要改变内容,只能获得一个新的字符串。
**字符序列:**字符串属于字符序列,字符序列是CharSequence接口,需要CharSequence时,就可以传入一个字符串对象
public static void main(String[] args) { String str = "abcdefg"; String str2 = str.replace("bcd","BCD"); System.out.println(str2); }String类的源代码:
- String类中封装了一个byte[] 数组 ,字符串的内容存储在byte[]中的,例如”ab”字符串对象的byte[]数组的内容为{97,98} ;例如 “你好” 字符串的byte[] 内容 要对’你’和’好’进行默认字符集的编码。字符串的所有方法都是针对于byte[] 内容的操作。
- String类中的byte[]数组是final的
String对象
有两种表示: “abc” 常量对象 和 new String(“abc”);
- 类似于“abc” 常量对象 存储到字符串常量池中,如果常量池中没有这个值的字符串对象则创建字符串对象存储到字符常量池;如果字符串常量池中有这个对象,则直接获取这个对象。
String s1 = "ab"; String s2 = "ab"; System.out.println(s1==s2); //true String s3 = new String("ab"); String s4 = new String("ab"); System.out.println(s3==s4); //false //连接字符串一定会返回一个新的字符串 String s5 = s1 + ""; System.out.println(s1 == s5); //false //"ab"和"" 都是常量,在编译期先计算常量的结果 //编译后就是String s6 = "ab" String s6 = "ab" + ""; System.out.println(s1 == s6); //true字符串类的API方法
- charAt(int index) : 返回的是char类型,返回指定位置的char值
String s = "abcdefg"; //获取每个字符 /*for (int i = 0; i < s.length(); i++) { System.out.println(s.charAt(i)); }*/ //获得反转后的字符串 /*String str = ""; for (int i = s.length()-1; i >=0; i--) { str = str + s.charAt(i); } System.out.println(str);*/ //获得"cde" String str = ""; for (int i = 0; i < s.length(); i++) { if(i>=2&&i<=4){ str += s.charAt(i); } } System.out.println(str);- compareTo(String anotherString) : 两个字符串比较,返回1 ;-1;0
- contains(String str) : 是否包含指定的字符串
- endsWith和startsWith : 是否以指定字符串开头或结束
- equals: 比较两个字符串的内容
- getBytes() : 获得此字符串对象的byte[]数组
String s = "abc"; byte[] bytes = s.getBytes(); String s1 = new String(bytes); System.out.println(s.equals(s1)); //true- indexOf(String str) : 获得给定字符串第一次出现的位置 ,如果字符串中没有指定的字符串则返回-1
- lastIndexOf(String str) : 获得给定字符串最后第一次出现的位置
- replace(String s1,String s2) :将字符串中的s1内容替换为s2内容。返回一个新的字符串
- split(String s) : 根据给定的字符串对字符串进行拆分,返回字符串数组
String s = "abcbc"; String[] strs = s.split("b"); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); } System.out.println("----------"); strs = s.split("c"); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); } System.out.println("----------"); strs = s.split("xyz"); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); }- substring(int startIndex) : 获取子串,又叫截取字符串 ,从startIndex开始截取到最后
- substring(int startIndex,int endIndex) : 从startIndex开始 到 endIndex-1 。前闭后开
- toUpperCase和toLowerCase : 转大写、小写
- trim() : 去掉字符串前后空格。
StringBufier
是一个带缓冲区的内容可改变的字符序列
- 带缓冲区:存储的字符串也是存储在byte[]中,只是byte[]数组不是final的,可扩容的;每次扩容byte[]时会额外的扩容预留的长度
- **内容可改变:**在改变字符串内容时,不会创建新的对象,在原对象的内容后面进行追加或修改
- **字符序列:**实现了CharSequence接口
StringBufier在处理字符串时(体现的是改变字符串的内容)效率高于String
StringBufier和String不能转型的,但是StringBufier提供了toString方法获得字符串内容,通过newStringBufier(String参数) 获得一个StringBufier对象
实例:用String连接10000次字符串 和 用StringBufier连接10000次对比
public static void main(String[] args) { //1w 91ms 1 //10w 836ms 9 //100w 47517ms 23 /*long start = System.currentTimeMillis(); String str = "a"; for (int i = 0; i < 1000000; i++) { str += "a"; } long end = System.currentTimeMillis(); System.out.println("String连接耗时:"+(end-start));*/ long start = System.currentTimeMillis(); StringBufier stringBufier = new StringBufier("a"); for (int i = 0; i < 10000000; i++) { stringBufier.append("a"); } long end = System.currentTimeMillis(); System.out.println("StringBufier连接耗时:"+(end-start)); }String在改变字符串内容(连接操作)时效率下降极快
研究StringBufier的源代码
public StringBufier(String str) { super(str.length() + 16); append(str);}new StringBufier(“a”) : 创建了StringBufier对象,封装了一个长度为1+16的byte[] 。16长度就是缓冲,之后将”a”添加到byte[]中
执行stringBufier.append(“a”): 先判断是否需要扩容,扩容时会有容量的余量,将“a”添加到byte数组中
StringBufier的API方法
相比String类,增加了一些API方法
- append方法: 向末尾追加内容
- delete方法:删除范围的字符串
- insert方法:向执行位置插入字符串
- reverse方法:反转字符串
StringBuilder类
StringBuilder和StringBufier具有相同的API,也是带缓冲区的内容可改变的字符序列 。
StringBufier是线程安全的,StringBuilder是线程不安全的,StringBuilder效率高
线程安全:两个线程同时操作一个资源时,为了保证数据的一致性,在一个线程使用资源时对资源加锁,另一个线程将等待直到锁被打开,才能使用资源,那么这个资源是线程安全的,对于两个线程来讲是同步的
线程安全会影响效率,线程不安全的效率高于线程安全。
Java SE
Related articles
部分信息可能已经过时