static关键字和string类总结

static关键字和string类总结

一、static关键字
1、static 修饰成员变量静态变量和实例变量区别?

存储位置不同
1.1静态成员变量:位于“方法区”,无论多少个对象该变量在内存中都只有一份,静态变量和类有关,与对象无关;
1.2非静态成员变量:位于“堆空间”,每new一个对象创建一份,因此有多少个对象该变量在内存中就有多少份。

2、static修饰静态方法和实例方法区别?
2.1静态方法中不能访问对象的非静态成员变量,因为调用静态方法时,不会传递对象的引用;静态成员方法访问方式:“类名.静态方法”
2.2编译器不会允许“静态成员方法”访问“非静态成员变量”,理由是为了避免无法确定访问的“非静态成员变量”是属于哪个对象以及其在内存中的位置。

2.3、static修饰内部类:如何使用静态内部类,相比实例内部类的开销?

使用:
(1)只有静态内部类才能够定义静态的成员变量与成员方法,非静态内部类不允许创建;
(2)静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量;
(3)在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。

开销对比:实例内部类有额外的开销,实例内部类包含外部类对象的引用,而静态内部类不包含。

2、设计模式
2.1、单例模式
单例模式有三种:懒汉式,饿汉式,登记式
单例模式的特点:
1)单例类只能有一个实例;
2)单例类必须自己创建自己的唯一实例;
3)单例类必须给所有其他对象提供这一实例。

2.2 、工厂模式
1)工厂类有一个抽象的Factory类(可以是抽象类或者接口),这个类负责制定规范,具体的产品生产由子类实现;
2)工厂类和产品类总能依次对应,即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,具体工厂负责生产对应的产品。

2.3、抽象工厂模式
抽象工厂模式有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类可以派生出多个具体工厂类,每个具体工厂类都可以创建多个具体产品类的实例。

3、类加载过程
3.1、加载:它是Java将字节码数据从不同的数据源读取到JVM中,并映射为JVM认可的数据结构(Class对象)。这里的数据源可能是各种各样的形态,如jar文件、class文件,甚至是网络数据源等。如果输入数据不是ClassFile的结构,则会抛出ClassFormatError。

3.2、加载阶段是用户参与的阶段,可以自定义类加载器,去实现自己的类加载过程。
(1)链接阶段:这是核心的步骤,简单说是把原始的类定义信息平滑地转化入JVM运行的过程中。这里可进一步细分为三个步骤:
(2)验证,这是虚拟机安全的重要保障,JVM需要核检字节信息是符合Java虚拟机规范的,否则就被认为是VerifyError。这样就防止了恶意信息或者不合规的信息危害JVM的运行。验证阶段有可能触发更多class的加载。
(3)准备,创建类或接口中的静态变量,并初始化静态变量的初始值。但这里的“初始化”和下面的显式初始化阶段是有区别的,侧重点在于分配所需要的内存空间,不会去执行更进一步的JVM指令。
(4)解析,在这一步会将常量池中的符号引用替换为直接引用。在Java虚拟机规范中,详细介绍了类、接口、方法和字段等各个方面的解析。

3.3、初始化:这一步真正去执行类初始化的代码逻辑,包括静态字段复制的动作,以及执行类定义中的静态初始化块内的逻辑。编译器在编译阶段就会把这部分逻辑整理好,父类型的初始化逻辑优先于当前类型的逻辑。

二、String类
基于JDK 1.8的总结
1、 底层实现char[] 相关方法
(1)获取字符串长度length():int
(2)获得指定长度下标处的字符 charAt(int index):char
(3)查看字符串中是否包含指定字符串内容 contains(String str):boolean
(4)把字符串转出字符数组 toCharArray():char[]
(5)查询指定字符串的首次出现的下标 indexOf(String str):int

 System.out.println( str.indexOf("") );
	    // 从指定位置后查找
	    System.out.println(  str.indexOf());
	    // 反向查找
	    System.out.println( str.lastIndexOf() );
	    // 反向查找,从指定位置前
	    System.out.println( str.lastIndexOf() );

(6)去除字符串两端的空格 trim():String
(7)把小写转成大写 toUpperCase():String
(8)大写转小写 toLowerCase():String
(9)判断字符串是否以某个字符串结尾 endsWith( String s ):boolean
(10)判断字符串是否以 某个字符串开始 startsWith(String s):boolean
(11)替换字符 replace(char oldChar, char newChar):String
(12)用一个模式去匹配字符串是否符合这个规则 replaceAll(String reg, String newStr):String
(13)字符串拆分 split(String reg):String[]
(14)字符串截取 str.substring()

2、 “hello”+“world” s+“world”
(1)字符串常量+字符串常量
编译器直接将两个常量优化为一个字符串常量,“hello”+“world” 优化为“helloworld”
(2)字符串变量+字符串常量
第一步:StringBuider s = new StringBuilder();
第二步:s.append(“hello”);
第三步:s.append(“world”);
第四步:String str = s.toString();

3、 字符串比较操作: == 与 equals的区别
String是引用类型,直接使用双等号比较的是指向字符串的引用,即存储字符串的地址;String类的equals(.1)方法比较字符串的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值