java基础知识总结

/*
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的大小1

java中支持类型向上转型,低精度的可以直接转化为高精度的,但是高精度的转化为低精度的必须强转
如: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
}

 

 

posted on 2016-10-08 22:36  菜鸟旅程  阅读(103)  评论(0编辑  收藏  举报

导航