高端型网站建设,网站常用后台路径,网站黑名单查询,福建省住建厅网站官网String, StringBuffer,StringBuilder的区别
从俩方面开始下手 是否可变 是否安全
回答:
String是final实现#xff0c;其为不可变长#xff0c;每次变长都会新增对象。而StringBuffer,StringBuilder他们的父类都是AbstractStringBuilder
然后安全#xff1a;String因为…String, StringBuffer,StringBuilder的区别
从俩方面开始下手 是否可变 是否安全
回答:
String是final实现其为不可变长每次变长都会新增对象。而StringBuffer,StringBuilder他们的父类都是AbstractStringBuilder
然后安全String因为采用的是final所有是线程安全的然后StringBuffer则是通过线程锁synchronized速度慢因为加锁,而StringBuilder速度快无锁则是线程不安全容易造成线程泄露问题
intern的区别
要看是jdk6还是jdk7以及以上
如果是jdk6如果如果常量池有就常量池里面拿如果没有就把对象放在常量池永久代然后从常量池里面拿说人话就是拿的是常量里面的不是引用地址
如果是jdk7以上就是如果常量池有就从常量池拿没有则是把拷贝一份引用然后放入从常量池的堆中引用地址本身
String不可变的含义原因好处
不可变的含义就是String他修改之后会重新指向新的地址引用
原因:因为String底层是private final char []value;
好处
1便于实现字符串池(String pool)
由于如果每次使用字符串都要开辟新空间就会造成很多不必要的内存消耗所以java引入了字符串池如果字符串池里面有此对象直接引用
2速度快
因为采用hash技术可以快速对应所在地址
3安全
因为底层是final,线程是安全的也可以防止泄露以免黑客修改导致文件配置出现问题
(4)线程安全
在并发场景下多个线程同时读一个资源是安全的不会引发竞争但对资源进行写操作时是不安全的不可变对象不能被写所以保证了多线程的安全。
扩展怎么让字符数据可变
由于不可变只是说的是里面的地址但是内容是可以变得通过反射技术里面的value.setAccessible(true)
package org.example.a; import java.lang.reflect.Field; public class Demo { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { String s “1234”; System.out.println(“改变前:s” s); Field f s.getClass().getDeclaredField(“value”); f.setAccessible(true); f.set(s, new char[]{‘a’, ‘b’, ‘c’}); System.out.println(“改变后:s” s); } }
Static
static五种用法
1,静态成员变量
2.静态方法
3.静态内部类
4.静态代码块
5.静态导包
为什么java中静态方法不可以调用非静态的方法和成员变量
因为静态方法是属于类的而非静态属于对象的方法静态方法不知道对象里面到底有多少个方法所以无法调用。相反非静态的是具体的要有具体的对象才可以调用。
然后从加载顺序来说static是优先调用如果staic调用非static的方法或者是成员变量由于他们只会在对象建立时他们才会加载会出现问题
Exception-try/catch/finally的return顺序
分情况讨论
try出现异常,catch,finally都没有return ,执行catch,try,finally,finally之外的代码块try无异常,catch有return ,finally无returntry执行catch不执行finally执行其他代码块照样执行try无异常finallt有returnideal报异常try-finallytry有异常, catch有return, finally无return
try catch finally catch的return
try有异常, catch有return, finally有return
try catch finally 程序退出
try有异常, catch有异常, finally无return
try catch finally 程序结束