Java基础

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?

String 和StringBuffer、StringBuilder的 区别?
可变性:简单来说,String类中使用final关键字字符素组保存字符串,private final char value[],所以String对象是不可变的,而StringBuffer与StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符串数组保存字符串 char[] value 但是没有用final关键字修饰,所以这两种对象都是可变的。

StringBuilder和StringBuffer的构造方法都是调用父类构造方法AbstractStringBuilder实现的。
AbstractStringBuilder.java

```java

abstract class AbstractStringBuilder implements Appendable, CharSequence {

    char[] value;

    int count;

    AbstractStringBuilder() {

    }

    AbstractStringBuilder(int capacity) {

        value = new char[capacity];

    }

```
线程安全性:String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的 公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法,StringBuffer对方法加了同步锁或者对调用的 方法加了同步锁,所以是线程安全的,StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

性能:每次对String类型进行修改的时候,都会生成一个新的String对象。然后将指针指向新的String对象,StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用,相同情况下使用StringBuffer仅能获得10~15左右的 性能提升,但却要冒多线程不安全的风险

对于三者使用总结:
1.操作少量的数据用String
2.单线程操作字符串缓冲区下操作大量数据 StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 StringBuffer

String 为什么是不可变的:简单来说就是String类利用了final修饰的char类型数组存储字符。
```java

    /** The value is used for character storage. */

    private final char value[];

```
1)String真的是不可变的吗?==不是
```java

String str = "Hello";

str = str + " World";

System.out.println("str=" + str);

```

结果:

```

str=Hello World

解析:实际上,原来String的内容是不变得 ,只是str由原来指向“Hello”的内存地址转为指向“Hello World”的内存地址,也就是说多开辟了一块内存区域给“Hello World”字符串
2)通过反射是可以修改所谓不可变对象
```java

// 创建字符串"Hello World", 并赋给引用s

String s = "Hello World";

System.out.println("s = " + s); // Hello World

// 获取String类中的value字段

Field valueFieldOfString = String.class.getDeclaredField("value");

// 改变value属性的访问权限

valueFieldOfString.setAccessible(true);

// 获取s对象上的value属性的值

char[] value = (char[]) valueFieldOfString.get(s);

// 改变value所引用的数组中的第5个字符

value[5] = '_';

System.out.println("s = " + s); // Hello_World

```

结果:

```

s = Hello World

s = Hello_World

```
解析:用反射可以访问私有成员,然后反射出String对象中的value属性,进而改变通过获得value引用改变数组的结构,但是一般我们不会这么做

什么是反射机制?反射机制的应用场景有哪些?
反射机制介绍:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称之为java语言的反射机制。

静态编译和动态编译
静态编译:在编译时确定类型,绑定对象
动态编译:运行时确定类型,绑定对象

反射机制优缺点
优点:运行期类型的判断,动态加载类,提高代码灵活度
缺点:性能瓶颈-反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码要慢很多

反射的应用场景
发射时框架设计的灵魂

什么是JDK JRE JVM 区别和联系?
JDK:开发者工具箱,包含JRE,Java运行环境,还包含其他供开发者使用的工具包
JRE:普通用户只需要安装JRE来运行Java程序
JVM:当运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等,这种独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因。

什么是字节码?采用字节码最大的好处是什么 ?
Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器,这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行,在java中,这种供虚拟机理解的代码 叫做字节码即.class文件它不面向任何特定的处理器,只需要面向虚拟机,每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机每一条要执行的字节码送给解释器,解释器将其翻译成特定机器的机器码,然后在特定的机器上运行。这也就是解释了java的编译与解释并存的特点。
采用字节码的好处:Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言课移植的特点。所以Java程序运行时比较高效,而且由于字节码并不专对一种特定的机器,因此,Java程序无需重新编译便可在不同的计算机上运行。

Java和C++的区别
1.都是面向对象的语言,都支持封装,继承和多态
2.Java不提供指针来直接访问内存,程序内存更加安全
3.Java都是单继承C++支持多继承,虽然Java的类不可以多继承,但是接口可以多继承
4.Java有自动内存管理机制,不需要程序员手动释放无用的内存。

接口和抽象类的 区别是什么?
1.接口方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法。
2.接口中的实例变量默认是final类型的,而抽象类的不一定
3.一个可以实现多个 接口,但是最多只能实现一个抽象类
4.一个类实现接口的 话要实现接口的所有方法,而抽象类不一定
5.接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象,从设计层面来是说,抽象是对类的抽象,是一种模板设计,接口设计行为的抽象,是一种行为的规范。
注意:Java8后的接口可以有默认实现(default)

成员变量与局部变量的区别有哪些?
1.从语法形式上,看成员变量时属于类的,而局部变量时在方法中定义的变量或是 方法的参数,成员变量可以被public,private,static等修饰符修饰,而局部变量不能被访问控制修饰符以及static所修饰。但是成员变量和局部变量都能被final修饰。
2.从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存储在占内存
3.从变量在内存中的生存时间来看,成员变量时对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。
4.成员变量如果没有被赋初值,则会自动以类型的默认值而赋值,局部变量不会被赋值

重写和重载的区别?
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,方法返回值和访问修饰符不同,发生在编译时。
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范文大于等于父类,如果父类防范访问修饰符为private则子类不能重写该方法。

字符常量和字符串常量的区别?
形式上:字符常量是单引号引起来的一个字符,字符串常量是双引号引起来的若干个字符。
含以上:字符常量相当于一个整形值(ASCII值),可以参与表达式运算,字符串常量代表一个地址。
占内存大小:字符常量只占一个字节,字符创常量占若干个字节。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343