/*
java基础语言总结*/
1.基本数据类型有哪些
byte short boolean char int float long double //测试基本数据类型所占用的字节数,可以通过其包装类进行实现 System.out.println("byte的大小"+Byte.SIZE/8); System.out.println("short的大小"+Short.SIZE/8); System.out.println("char的大小"+Character.SIZE/8); System.out.println("int的大小"+Integer.SIZE/8); System.out.println("float的大小"+Float.SIZE/8); System.out.println("double的大小"+Double.SIZE/8); System.out.println("long的大小"+Byte.SIZE/8);输出如下:
byte的大小1 short的大小2 char的大小2 int的大小4 float的大小4 double的大小8 long的大小1java中支持类型向上转型,低精度的可以直接转化为高精度的,但是高精度的转化为低精度的必须强转
如:float int double 之间的相互转化 float f=3.14f; int f1=(int)f; System.out.println(f1); double d=f; System.out.println(d); double d1=3.16478263482364832; float f2=(float)d1; System.out.println(f2); int a=3; double d2=a; System.out.println(d2);//了解逻辑运算中的短路与和与
&& 此为短路与,&为与
&&:当条件的左端已经判断为false的时候,有端不需要进行判断就可以跳出
&必须判断两端的情况,不管是否左边为false
public static void main(String [] args){
int a=2; int b=5; long flag=10000000; long time=System.currentTimeMillis(); while(flag!=0){ if(a==3&b==5){ System.out.println("输出的为正确"); } flag--; } long temptime=System.currentTimeMillis(); System.out.println(temptime-time); // 15 while(flag!=10000000){ if(a==3&&b==5){ System.out.println("输出的为正确"); } flag++; } long endTime=System.currentTimeMillis(); System.out.println(endTime-temptime); // 0 } 1.1String 类 StringBulider StringBuffer String类: String s="abc"; String s1="abc"; System.out.println(s1==s); //true 当String对象为字符串常量的时候,java虚拟机将会将此字符串放到字符串常量池中作为缓存, 当定义另外一个字符串常量时,jvm将会在常量池中先查找是否存在这个常量,如果存在将会把地址给 栈中的引用变量,没有将会在常量池中产生一个新的对象,并把地址交给栈中的引用变量。 String s1="abc"; String s2="abcd"; String s3=s1+s2; String s4="abc"+"abcd"; System.out.println(s3==s4)//false //返回对象的hashCode System.identityHashCode(s3);s3是先取得s1和s2在常量池中的值,再进行拼接。 而s4是在编译时就将字符串进行了拼接,之后在常量池中就创建了这个新的对象 可以通过java反编译看看字节码文件 ,就可以在常量池中存在此常量 javap -v BasicDataType.class从上面反编译中,我们可以看出在常量池中已经重新建立了一个abcabcd的对象,下面将通过jvm的操作指令来解释如何将这个对象交给s4的
idc #39 将#39这个地址中的内容从常量池中压入栈中,而这个地址指向的是#40这个地址,所以将常量abcabcd压入栈中
而astore的意思是将栈顶的数弹出保存到本地变量5中,刚好就是S4 因为main函数中有一个参数args
String类常用方法
常用的构造方法:
String() --------- 初始化一个String对象,表示一个空字符序列
String(String value) --------- 利用一个直接量创建一个新串
String(char[] value) --------- 利用一个字符数组创建
String(char[] value,int offset,int count) --------- 截取字符数组,从offset开始count个字符创建
String(StringBuffer buffer) --------- 利用StringBuffer创建
常用方法讲解:
compareTo(String anotherString)
String str="xiaolinihao"; String str1="xiaoli"; System.out.println(str.compareTo(str1)); //此时返回5
String str="xiaozhou";
String str1="xiaoli"; System.out.println(str.compareTo(str1)); //此时返回14笔者当时很不明白,上面两种结果到底是怎么来的,下面我们将从源码的角度解释为什么会出现以下的结果
int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
从源码中,我们可以看到比较两个字符串的大小是取其相同的长度进行比较,相同长度的部分如果出现不同的值,那么将会返回对应位置的ascll码的差值,如果比较都相同则返回其字符串长度的差值。
indexof(String str,int fromIndex)
public int indexOf(String str, int fromIndex) { return indexOf(value, 0, value.length, str.value, 0, str.value.length, fromIndex); }
static int indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)
{ if (fromIndex >= sourceCount) { return (targetCount == 0 ? sourceCount : -1); } if (fromIndex < 0) { fromIndex = 0; } if (targetCount == 0) { return fromIndex; }char first = target[targetOffset];
int max = sourceOffset + (sourceCount - targetCount);//如果目标字符串为 xiao 源字符串是hellozhouxia 它们之间长度的差值为8
//当源字符串判断到第9个字符u时,还是与x不想同,那么久不需要再判断了,因为目标字符串为4位,而
//源字符串只剩下三位,是不可能和目标字符串相同的
for (int i = sourceOffset + fromIndex; i <= max; i++) { //当第一次只有一个字符相同,但是后面有字符不一致的时候,这个循环就起作用了
/* Look for first character. */ if (source[i] != first) { //将会从第i个位置继续匹配第一个是否相同,如果相同继续进行匹配第二个字符 while (++i <= max && source[i] != first); //当目标字符串的第一个字符与原字符串相同时跳出while循环 }/* Found first character, now look at the rest of v2 */ //匹配下一个字符是否相同
if (i <= max) { int j = i + 1; int end = j + targetCount - 1; for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++);if (j == end) {
/* Found whole string. */ return i - sourceOffset; //此时匹配到了整个字符串,输出的是源字符串中相同字符串中的第一个字符的位置}
}}
return -1; //匹配不成功的时候将会返回-1 }