经常使用静态方法:
Arrays.sort() 对数组进行升序排序,
Arrays.binarySearch(arr,key) 二分法查找,返回index,没找到返回负数(查找的前提是排好序)java
方法 | 解释 |
---|---|
charAt(int index) | 返回索引处的字符值 |
toCharArray() | 将一个字符串转换成char数组 |
toLowerCase() | 转换成小写 |
toUpperCase() | 转换成大写 |
getBytes() | 获得字节数组 abcdef变为97 98 99 100 |
indexOf() | 判断某个子字符串在当前字符串第一次出现处的索引 |
lastindexOf() | 判断某个子字符串在当前字符串最后一次出现处的索引 |
repleac(“”,“”) | 替换当前字符串中某个字符串为另一个字符串,返回String |
split() | 以某个字符串拆分,返回String,(用Strirng数组来接收) |
trim() | 去除字符串的先后空白,中间的不行 |
subString(int beginindex) | 截取从索引出开始的子字符串 |
subString(intbeginindex,endindex) | 截取从起始索引到终止索引的子字符串,前闭后开 |
compareTo() | 比较两个字符串大小,字符依次比,前面比后面大,返回1;小,返回-1,等于,返回0,比到不同的就结束,剩下的不比了。按照英文字母顺序比较 |
equals() | 是否相等,比较的是值,返回true/false;看不出谁大谁小 |
equalsIgnoreCase | 是否相等,忽略大小写 |
contaings() | 是否包含后面的字符串,返回true/false |
endsWith() | 是否以某个字符串结尾,返回true/false |
startsWith() | 是否以某个字符串开始,返回true/false |
isEmpty() | 是否为空字符串,底层调用的是length()方法,返回true/false;和null不同(空指针异常) |
String中只有一个静态方法,不须要new对象的:
valueOf():将非字符串转换成字符串,底层调用toString方法,直接用类调用String.valueOf(随便写个啥),若传进去一个引用,该引用没有重写toString的话,输出的是引用的地址。
System.out.println(引用)时,为何会调toString方法?
println调用valueOf,valuesOf调用的又是toString。本质上:sout这个方法输出任何数据时都实现转换成字符串再输出。web
String比较容易出错的地方:数组
String a = "Hello"; String b = "Hello"; a==b ?//true,字符串变量同一个,地址也是同一个,“==”任何状况下比较的都是地址。 String a=new String("Hello"); String b=new String("Hello"); a==b ?//false,a和b存放不一样的引用对象的地址。
String是不可变的,底层是final byte【】不可变,被final修饰,数组一旦建立藏毒不可变,而且被final修饰的引用一旦指向某个对象以后,不能再指向其余对象。每一次拼接都会产生新的字符串,在方法区中建立了大量的对象,形成内存空间的浪费。
建议使用lang包下的StringBuffer或者StringBuilder。缓存
StringBuffer父类为AbstractStingBuffer
底层其实是一个byte【】数组(字符串缓冲区对象),(没有final修饰),将字符串放到数组中,初始容量为16,当存满以后,会用append()方法来扩容,底层进行追加调用arraycopy()方法,因此StringBuffer适用于字符串的拼接。安全
优化:建立StringBuffer时预估计一下,给一个大点的容量。减小扩容次数。也不能太大,合适最好,提升程序运行效率。多线程
StringBuilder 也能够用来拼接字符串。app
StringBuffer的方法都有synchronized修饰,表示在多线程环境下运行时安全的。StringBuilder没有,不安全。dom
java中8种基本数据类型对应8种包装类属于引用数据类型,父类是Number-Object,Character、Boolean父类是Object。
为何要用包装类?
调用某些方法时传入参数若为Object,不能直接传入基本数据。ide
基本数据类型 | 包装类 |
---|---|
short | Short |
int | Integer |
long | Long |
double | Double |
float | Float |
boolean | Boolean |
char | Character |
byte | Byte |
基本数据类型转化为引用数据类型,装箱
引用转化为基本,拆箱
自动装箱:Integer a = 100;
自动拆箱:int i = a; JAVA 5之后都支持这个了。在加减乘除等运算时会自动拆箱,双等号不会。svg
获取常量,最大:Integer.MAX_VALUE,即为0xffffff;最小0x8000000;
Number中经常使用的方法:用来拆箱。好比byteValue();可是有自动装箱和拆箱,就不必用这个了。
(1.)java中为了提升程序的执行效率,将【-128到127】的全部的包装对象提早建立好,存放在方法区中的整数型常量池中(cache缓存),目的是只要在这个区间的数据就不须要new了,直接从里面取来用。
Integer a =100; Integer b =100;
a= =b?结果为true,换成1000就是false。
(2.)数字格式化:
/*# 任意数字 , 千分位 . 小数点 0 表明不够时补0 */ import java.text.DecimalFormat; DecimalFormat some = new DecimalFormat("###,###.00");//小数部分不能既有#又有0 String dou = some.format(124583); System.out.println(dou);
静态方法static int parseInt(String s),把字符串转换为int类型。
int a = Integer.parseInt(“1230”);相似,double,float等有同样的静态方法,将字符串转换为基本数据类型,注意不要超过范围或者用中文。
静态方法:
toBinaryString(int i):转换成二进制字符串;
toOctalString(int i):转换成十进制字符串;
toHexString(int i):转换成十六进制字符串;
(联系toString方法源码)
String、Integer、int类型互相转换:
String->int:
Integer.parseInt(Strign s);
int->String:
String.valueOf(int i); i = 100 ;String s = i+"";
int->Integer:装箱
Integer a = 100; Integer.valueOf(100);
Integer->int:拆箱
int b = a; intValue();
String->Integer:
Integer.valueOf(String a);
Integer->String:
String.valueOf(Integer对象);
(1)导入包:import java.util.Date;
Date nowtime = new Date();//系统当前时间显示,Date的无参构造方法 Date nowtime2 = new Date(1);//Date的有参构造,传入的参数是Long型,为系统从1970.1.1 00:00:00通过的毫秒数。 Fri Oct 02 15:27:49 CST 2020//执行结果
日期格式化:设置本身喜欢的格式,(将Date类型转化为String类型)。导入java.text.SimpleDateFormat;
yyyy 年
MM 月
dd 日
HH 时
mm 分
ss 秒
SSS毫秒(毫秒三位,最高999),这些字符不能瞎写,可是空格,-,:,按照本身喜爱加。
Date a = new Date(); System.out.println(a); SimpleDateFormat daytime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); System.out.println(daytime.format(a));//若要获取昨天的此时的时间,用当前的毫秒数减去一天的毫秒数(1000*60*60*24)
(2)反过来,将String类型转化为Date类型输出:
String time = "2014-09-01 15:26:56 456"; SimpleDateFormat ste = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");//这里的格式要和上述字符串同样,否则会有异常 Date nowtime = ste.parse(time); System.out.println(nowtime);
(3)获取系统从1970.1.1 00:00:00(北京时间是八点)到当前时间的总毫秒数,能够用来统计方法执行时长:system.currentTimeMillis();
Long begin = System.currentTimeMillis(); //中间是你想作的操做 Long end = System.currentTimeMillis(); System.out.println(begin-end);//耗费的时间能够获得
System.out out是System里的一个静态变量
System.out.println() println是PrintStream的方法
System.gc() 建议启动垃圾回收机制
System.currentTimeMillis() 系统从1970.1.1到当前时间的总毫秒数
System.exit(0) 退出JVM
import java.math.BigDecimal; BigDecimal large = new BigDecimal(100); BigDecimal large1 = new BigDecimal(200); BigDecimal large3 =large.add(large1);//调用方法加减乘除 System.out.println(large);
math包下,大数据,精度极高,属于Java对象(引用数据类型),专门在财务软件当中.
import java.util.Random; Random ran = new Random(); int abcs = ran.nextInt(101);//下一个数是101,不包括101,范围[0,101)。 int abcd = ran.nextInt();//范围 32个字节
小试牛刀:随机产生五个不重复的随机数(1-100)
感觉一下,写写伪代码?!
import java.util.Random; public class RandomTest01{ public static void main(String[] args) { /** * 随机数放在数组里,判断该随机数是否与数组里的数重复,不重复的话赋值。 * 数组的初始值?因为随机数范围为[0,101),避免混淆初始0和随机数0,给定一个初始值-1。 */ //建立一个长度为5的数组,给定初始值。 int []arr = new int[5]; for(int i = 0; i<arr.length;i++){ arr[i]=-1; } //随机数产生 Random random = new Random(); for (int i = 0;i<arr.length;){ int num = random.nextInt(200); if(!contains(arr,num)){ arr[i]=num; i++;//i++不能写在循环结束后,由于i++的前提是该随机数不在数组里且被赋值了之后。 //这里也能够用while。 }//判断随机数在不在数组里?没法写成简单的表达式,考虑单独写成一个方法。 //方法的返回值?方法的形参? } //打印输出随机数 for (int i = 0;i<arr.length;i++){ System.out.println(arr[i]); } } public static boolean contains(int [] array,int key){ for(int i = 0;i<array.length;i++) { if(array[i] == key) { return true; } }//该循环结束表示key不在数组里。这里若是改为只循环到当前全部赋值的数,减小循环次数,就更好了。加入一个参数index。 return false; } }
enum为关键字,不能做为包名。枚举是一种引用数据类型。只有两种状况用boolean,大于两种状况用枚举。
/*enum 枚举类型名{ 枚举值1,枚举值2 } */ public static Result divide(int a,int b){ try{ int c= a/b; return Result.SUCCESS; } catch(Exception d){ return Result.Fail; } } enum Result{ SUCCESS,Fail }