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

原创 2015年11月17日 16:58:43
一、运算符:
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编码。

版权声明:本文为博主原创文章,未经博主允许不得转载。

设置SVN忽略文件和目录(文件夹)

在多数项目中你总会有文件和目录不需要进行版本控制。这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹。只要你提交修改,TortoiseSVN 就会在提交...
  • htofly
  • htofly
  • 2014年10月22日 12:04
  • 597

Java 的日期与时间处理

1、Java的时间日期: Date类 Calendar类 DateFormat类 Long String 示例1:获取当前时间并显示 long now=System.currentTimeM...

Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配

Java中String、StringBuffer和StringBuilder的区别和堆栈内存分配 Java中的String类是一个很常用,但最不注意其细节的类,因此大多数面试会那这个...

java字符串(1):String,StringBuffer,StringBuilder的使用与区别

前言java中最常用的类之一就是String类,java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。更多描述请查阅API文档综述。本文介绍String类的使用和一些注意事项,以及与S...

java基础面试题1-----String,StringBuffer,StringBuilder的区别

三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String String是“字符创常量”,也就是不可改变的对象 StringBuffer和S...

JAVA基础:String, StringBuffer, StringBuilder ——区别,用法及常见问题

引言这几天看到知乎上讨论一道入门级JAVA面试题目,发现自己竟然答不上来,遂查阅相关资料恶补一下。问题:String,StringBuffer和StringBuilder区别?衍生问题 - 为什么能...
  • zzukun
  • zzukun
  • 2016年09月04日 11:41
  • 447

Java字符串类型String、StringBuilder、StringBuffer的区别

Java中关于字符串的类型主要有三种:String、StringBuilder、StringBuffer 从可变与不可变的层面上讲: String是字符串常量 StringBuild...

JAVA字符串String、StringBuffer、StringBuilder、基本数据类型包装 ----java基础一

String 字符串: Java中用String类进行描述。对字符串进行了对象封装,这样的好处是可以对字符串这种常见数据进行方便的操作。 字符串String一旦被初始化就不可变,储存位置在内存方法...

Java——String和StringBuffer/StringBuilder字符串的常用方法

String【string是不可更改的,只能另开辟内存然后指向该内存】1、获取字符串长度: string.length()2、字符串转换为char型数组: string.toCharAr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA——(1)基础补充之运算符、字符串、数组、内存分配(String,StringBuffer,StringBuilder的区别
举报原因:
原因补充:

(最多只允许输入30个字)