您的位置:首页 > 产品设计 > UI/UE

JAVA——(1)基础补充之运算符、字符串、数组、内存分配(String,StringBuffer,StringBuilder的区别

2015-11-17 16:58 921 查看
一、运算符:
1、分类:算术运算符、赋值运算符、条件运算符(= ? :)、关系运算符、逻辑运算符
2、逻辑运算符:
& 和 &&区别: 
& :无论左边结果是什么,右边都参与运算。
&&:短路与,如果左边为false,那么右边不参与运算。
| 和|| 区别:
|:两边都运算。
||:短路或,如果左边为true,那么右边不参与运算。

二、流程控制语句:
1、分类:循环、条件、顺序
2、流程跳转语句:break,continue 和 return 语句用来控制流程的跳转
1)break:从 switch 语句,循环语句或标号标识的代码块中退出
2)continue:跳出本次循环,执行下次循环,或执行标号标识的循环体;
3)return:退出本方法,跳到上层调用方法。
4)System.exit(0);  //退出系统

三、字符串
1、拼接(长度:.length()):
1)用+将字符串拼接
2)StringBuffer拼接
2、String,StringBuffer,StringBuild 区别
1)String 字符串常量,StringBuffer 字符串变量(线程安全),StringBuilder 字符串变量(非线程安全)
2)String 类型和 StringBuffer 类型的主要区别在于 String 是不可变的对象,对每次对 String 类型进行改变时同于生成了一个新的对象,但每次生成对象都会对系统性能产生影响,当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度会相当慢的。
StringBuffer 操作时仅对本身进行操作,再改变对象引用 。所以在是字符串对象经常改变的情况下,通常会用StringBuffer ;
补充:
String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,如:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
在 JVM 眼里,这个String S1 = “This is only a” + “ simple” + “test”; 其实就是:String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但譬如:
String S2 = “This is only a”;String S3 = “ simple”;String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候  StringBuffer > String
3)StringBuffer 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。StringBuffer 上的主要操作是 append 和 insert 方法, append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而
z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
4)在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilder 一个可变的字符序列是 5.0 新增的。此类提供一个

与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中 ,它比 StringBuffer 要快。两者的方法基本相同。非线程安全,不用再多线程

四、数组
1、声明数组:int a[] ;//定义数组,并不为数据元素分配内存,因此“[ ]”中不用指出数组中元素个数。
2、数组的创建和赋值:
1)int a[] =new int[2] ;a[0]=2;a[1]=2  //直接new分配内存再赋值
2)int a[]={2,2};//直接赋值并定义数组大小
3)int a[]=new int[2]{2,2};
4)二维数组
int a[][]=new int[10][10] //对
int []a[]=new int[10][10] //对
int [][]a=new int[10][10] //对
5)注意:一维数组定义长度后不可更变长度,二维数组必须确定其中一个(行或列)
3、数组赋值
相同地址:
//赋值1

int [] x=new int[]{1,2,3,4};
int [] y=x;  //把y的地址赋给y
不同地址:
//赋值2  不一样的地址赋值一
int []z=new int[x.length];   //z数组的长度与x相同
for(int i=0;i<z.length;i++){
z[i]=x[i];}
//赋值3
//clone() 的结果是一个Object对象,但是a是一个int[]型,所以要进行类型转换
int a[]=(int[])x.clone();
复制部分元素
System.arraycopy(源数组,源数组的起始位置,目标数组,目标数组的起始位置)

五、补充:
1、 练习:对两个变量的数据进行互换。不需要第三方变量。
int a = 3,b = 5;-->b = 3,a = 5;
a = a + b; a =8;
b = a - b; b =3;
a = a - b; a =5;
a = a ^ b;//
b = a ^ b;//b= a ^ b ^ b = a
a = a ^ b;//a= a ^ b ^ a = b;

练习:

1、高效的算出 2*8  ?2*8=16

2:0010    16:10000   左移3位   

2、Switch:
1):break是可以省略的,如果省略了就一直执行到遇到break为止,但是不建议省略。

2):switch 后面的小括号中的变量是byte,char,short,int四种类型中的一种?

可以是byte,short,int,char JDK5以后可以是枚举 JDK7以后可以是字符串      

3):default可以写在switch结构中的任意位置;如果将default语句放在了第一行,则不管expression与case中的value是否匹配,程序会从default开始执行直到第一个break出现。

4):case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的

3、 while和for可以进行互换。
区别在于:如果需要定义变量控制循环次数。建议使用for。因为for循环完毕,变量在内存中释放。

4、java是面向对象,跨平台;运行在Java虚拟机上的;要下载安装JDk,才可以开发和运行Java程序;

jdk,jre,jvm:java是跨平台的,字节码.class是跨平台的,但JVm不是跨平台的;

5、java内存分配
栈:基本数据类型的变量值和对象的引用(str),但对象本身的值是不存在于栈中的,而是存放在堆中(通过new出来的对象);
堆:存放所有new出来的对象 
常量区:同一个常量可以供多个对象(栈中)引用;a=”china”;b=”china”
静态存储:存储静态成员(static)
基本类型:int i; i=1;===》 
栈:存放i=1 
引用类型:如String

              1)String str= new Sting(“aa”);
栈:存放str      
堆:存放aa

  2) String str1=“aaa”; //String值一旦赋值,不可更改;——常量
栈:存放str1          常量区:aaa
6、在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?
1)只有一个public类:
第一、每个编译单元(文件)只能有一个public 类相当于每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。第二、java程序的入口是main方法,所以被定为public的这个类里一定是含有main方法的类,而且该类的名称要和文件名一致,因为虚拟机开始要找main的。第三、你可以根据需要,往这个文件里面添加任意多个提供辅助功能的public 权限的类。但如果这个编译单元里面有两个或两个以上的public 类的话,编译器就会报错。第四、在标准的java代码编写时,无论代码量多少,最好一个源文件里只有一个类或接口(接口也要单独写在一个源文件里),第五、编译单元里面可以没有public
类,指的是没有公开的接口,但是可以在同一个包内访问的;public的意思是在包内包外均可访问。虽然这种情况不常见,但却是可以的。这时,你就能随意为文件起名字了。
2) public 类的名字必须和这个编译单元的文件名完全相同,包括大小写。

第一、如果你不遵守,编译器又要报错了。首先Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。第二、对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应class文件即可。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。

数据类型补充:

1:在定义Long或者Float类型变量的时候,要加L或者f。

  整数默认是int类型,浮点数默认是double。

  byte,short在定义的时候,他们接收的其实是一个int类型的值。

  这个是自己做了一个数据检测的,如果不再它们的范围内,就报错。

2:byte值的问题
byte b1 = 127;
byte b2 = (byte)128; //-128
byte b3 = (byte)129; //-127
byte b4 = (byte)130; //-126
byte的范围:-128 ~ 127
128:10000000
-128:10000000 (这里的1即是符号位,也是数值位)

3:数据类型转换之默认转换
byte,short,char -- int -- long -- float -- double
long: 8个字节
float:4个字节

A:它们底层的存储结构不同。
B:float表示的数据范围比long的范围要大
long:2^63-1
float:3.4*10^38 > 2*10^38 > 2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

4:Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
可以。因为java语言中的字符占用两个字节。
Java语言采用的是Unicode编码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA