7Java基础补充
1.标准Java bean写法
包括:private修饰的成员变量、getter和setter以及无参和有多个参数的有参构造方法
2.String原理
String底层是字节数组byte[]。
String不可变,但可以被共享。
3.Java中三种常量池:
(1)字符串常量池(全局字符串池):由于字符串本身具有不可变性,因此使用字符串常量池对于同样的字符串可以起到一个缓存的作用,防止多次内存分配,从而提供内存的利用率
(2)运行时常量池:当程序运行到某个类的时候,class文件中的信息就会被解析到内存的方法区的运行时常量池中,每个类都有一个运行时常量池。
(3)class文件常量池:class常量池是在编译后每个class文件都有的,class文件中除了包含类的版本 字段 方法 接口等描述信息,还有一项信息就是常量池,用于存放编译器生成的各种字面量和符号的引用。
4.细化Java内存模型
从大的方面来说,JVM内存分为几个方面:

堆内存是JVM中最大的一块区域,被所有线程共享,在JVM启动时创建。几乎所有对象的空间分配都在堆区来进行。
堆又分为新生代和老年代内存,两者的内存大小的比例大概是1:2。
新生代又分为Eden、From区和To区,三者的内存大小的比例大概是8:1:1。几乎所有新对象的内存分配都在Eden区完成。
划分不同的区,分别保存不同的数据,其内存回收策略也不相同。
在GC中,Eden区活跃的对象会被移动到survivor区,不活跃的会被GC清理掉。Survivor区中的对象达到一定的年龄,就会被移动到老年代中。
堆内存可以在物理上不连续,但是逻辑上要连续。

方法区又被称为永久代,也是被所有的线程所共享的,该区域主要保存类的信息,静态变量,常量和编译器编译后的代码等数据。
jdk7中,将永久代中的字符串常量池移动到堆中。jdk8 撤销了永久代 ,引入了元空间

方法区不需要连续的内存,可以选择固定大小或者可扩展,并且还可以选择不实现垃圾回收,相对而言,垃圾收集行为在这个区域是比较少见的,但并非数据进入方法区就如永久代的名字一样永久存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,圾回收机制的条件是相当苛刻的。
5.字符串的比较
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true,s1指向常量池中创建的对象地址,s2指向常量池中已经存在的对象地址,这个对象是相同的
// 使用字符数组构造一个字符串
char[] c = {'a','b','c'};
String s3 = new String(c);
String s4 = new String(c);
System.out.println(s3 == s4);//false,堆中不同对象
String s5 = new String("abc");
String s6 = new String ("abc");
System.out.println(s5==s6);// false,堆中不同对象
System.out.println(s1 == s3);//false,s1指向常量池中创建的对象地址,s3指向堆中对象
System.out.println(s4 == s5);//false,堆中不同对象
}
String str1 = "abc";//在常量池中创建对象并得到引用
String str2 = new String("abc");//在堆中创建对象并引用,然后查看常量池,此时已经有对象,所以不用再创建
public static void main(String[] args) {
String s1 = "hello";//常量池中创建hello的引用
String s2 = "world";//常量池中创建world的引用
String s3 = "hello" +"world";//常量池中创建helloworld的引用
String s4 = s1 +"world";//堆中创建的对象的引用,相当于new StringBuilder(s1).append("world").toString();toString()创建一个新的堆对象。
String s5 = s1 + s2;//堆中创建对象的引用,相当于//new StringBuilder(s1).append(s2).toString();
String s6 = (s1 + s2).intern(); //该值在常量池中已经存在,返回s3的引用
String s7 = "helloworld"; //该值在常量池中已经存在,返回s3的引用
System.out.println(s3==s4);// false
System.out.println(s3 == s7);//true
System.out.println(s3==s5);//false
System.out.println(s4==s5);//false
System.out.println(s3==s6);//true }
+连接字符串:
常量+常量:编译器直接优化生成结果,不需要生成StringBuilder。
常量+变量:需要生成StringBuilder,一行语句需要一个StringBuilder,append的数量基于变量和常量的个数,但当多个常量连在一起时,编译器会优化直接生成常量运算结果,算作一个append处理。
变量和变量:需要生成StringBuilder,一行语句需要一个StringBuilder,append的数量基于常量的个数
public static void main(String[] args) {
String str1 = new StringBuilder("计算机").append("软件开发").toString();
System.out.println(str1.intern()== str1);//true,str1.intern()在常量池中创建一个指向str1的引用,所以相等
String str2 = new StringBuilder("ja").append("va").toString();//java是一个特殊的字符串 在jdk的底层,存在很多“java”字符串
System.out.println(str2.intern()==str2);//false,虽然没有人为创建,但是常量池中存在java对象,所以intern()返回的结果是常量池中的变量且不是ss堆对象的引用
}
public static void main(String[] args) {
String str1 = new String("str") + new String("01");
str1.intern();//intern()方法本质相当于把调用它的对象放入常量池,如果有就不放,而且放的是地址不是副本。
String str2 = "str01";
System.out.println(str1 == str2);//true
}
public static void main(String[] args) {
String s1 = new String("he") +new String("llo");
String s2 = new String("h") +new String("ello");
String s3 = s1.intern();
String s4 = s2.intern();
System.out.println(s1==s3);//true
System.out.println(s2 == s4);//false
System.out.println(s3 == s4);//true
}

6.抽象类
抽象类的语法格式:abstract class 类名{ }
抽象方法的语法格式:访问修饰符 abstract 返回值 方法名( );
抽象类的特点:
- 抽象类不能被直接实例化。
- 抽象类的子类必须实现抽象方法(除非这个子类也是抽象类)。
- 抽象类里可以有普通方法,也可以有抽象方法,但是有抽象方法的类必须是抽象类。
- 抽象类可以没有任何方法
7.接口
接口是一系列抽象方法的集合,与抽象类不同,不可以声明普通方法。
接口的语法格式:[修饰符] interface 接口名 [extends] [接口列表]{ 接口体 }
接口前面可以用public修饰,省略控制修饰符该接口也是公开的。
extends 关键词和类语法中的 extends 类似,用来定义直接的父接口。和类不同,一个接口可以继承多个父接口,当 extends 后面有多个父接口时,它们之间用逗号隔开。接口继承接口的语法格式为:[修饰符] class 类名 implements 接口列表{ 类体 }
类实现接口用 implements 关键字,Java 中的类只能是单继承的,但一个 Java 类可以实现多个接口,这也是 Java 解决多继承的方法。
接口下面不可以有实体方法。
接口中可以有成员变量,修饰符默认为 public static final(即便不写修饰符也默认是这样),因为是常量所以必须在声明时对这些成员变量赋初值。可以这样说,接口中的成员变量实际就是常量。
接口中的抽象方法默认且必须是 public 的。
接口 C 继承接口 A 和 B,不同的方法都被直接继承下来,相同的方法合并后被继承下来。
Java8之后,接口中可以有默认/静态方法,这个方法可以有实体。
接口不能继承抽象类,只能继承其他接口。
8.内部类
- 成员内部类 成员内部类
InnerClass可以直接访问外部类OuterClass中的属性和方法,对于成员内部类的使用,需要先生成外部类对象,然后再以 外部类对象.new 内部类() 的形式生成内部类对象。
- 静态内部类
静态内部类 InnerClass 只能访问外部类 OuterClass 的静态属性和静态方法,可以通过类名直接调用,如 **类名.方法()**。与之类似,静态内部类中的方法也可以通过 **静态内部类名.方法()** 的形式调用。如果测试类和静态内部类不在同一个.java文件中,那么可以通过 **外部类名.静态内部类.方法()** 的形式调用。 - 局部内部类 JDK8.0 以后,局部内部类 `InnerClass` 在访问外部方法 `method()` 定义的变量时,可以省略给变量加 final 修饰。局部内部类只能在定义它的方法内部使用,局部内部类的定义并不会影响外部类方法的使用。
- 匿名内部类
7Java基础补充的更多相关文章
- 【笨木头Lua专栏】基础补充04:迭代器初探
今天学习的内容还蛮有意思的,让我兴奋了一下~ 笨木头花心贡献,哈?花心?不,是用心~ 转载请注明,原文地址: http://www.benmutou.com/archives/1714 文章来源:笨木 ...
- ROS_Kinetic_20 ROS基础补充
ROS_Kinetic_20 ROS基础补充 1 手动创建ROS功能包 参考官网:http://wiki.ros.org/cn/ROS/Tutorials/Creating%20a%20Package ...
- 【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数
为什么要进行Java常识性基础补充? 之前学习Java语言,学得很多很杂,而且是很多不同的方面插入讲解的,比如在跟班上课,自学java编程例子,java语法,过了很久,因为各种原因长时间不怎么写,有时 ...
- python进阶08 MySQL基础补充
python进阶08 MySQL基础补充 本次课程都是基于三张表格的使用 一.子查询 #如何找到‘张三’的成绩 #思路:先找到张三的学号,在拿这个张三的学号到成绩表里面去匹配,得出成绩 #如何用一条查 ...
- 【笨木头Lua专栏】基础补充02:函数的几个特别之处
没想到距离上一篇基础补充已经过了1年多了,近期准备捡回Lua,把基础都补补,今天来聊聊Lua的函数吧~ 0.环境 我突然对Lua又大感兴趣的最主要原因是,Cocos Code IDE開始浮出水面了,它 ...
- mysql 查询优化 ~ 优化基础补充
一 简介:此文章是对于 sql通用基础的补充说明 二 虚拟列: mysql虚拟列是mysql5.7的新特性,对于函数计算形成的结果可作为虚拟列,并可以对虚拟列添加索引,这样就能加速sql的运行,不过有 ...
- 大数据入门第三天——基础补充与ActiveMQ
一.多线程基础回顾 先导知识在基础随笔篇:http://www.cnblogs.com/jiangbei/p/6664555.html 以下此部分以补充为主 1.概念 进程:进行中的程序,内存中有独立 ...
- 3.python基础补充(集合,collection系列,深浅拷贝)
一.集合 1.集合(set): 把不同的元素组成一起形成集合,是python基本的数据类型.集合元素(set elements):组成集合的成员 python的set和其他语言类似, 是一个无序不重复 ...
- python 操作 mysql基础补充
前言 本篇的主要内容为整理mysql的基础内容,分享的同时方便日后查阅,同时结合python的学习整理python操作mysql的方法以及python的ORM. 一.数据库初探 在开始mysql之前先 ...
随机推荐
- matrix_multiply代码解析
matrix_multiply代码解析 关于matrix_multiply 程序执行代码里两个矩阵的乘法,并将相乘结果打印在屏幕上. 示例的主要目的是展现怎么实现一个自定义CPU计算任务. 参考:ht ...
- GVS案例分享|乘新时代姑苏舫号,体验匠心智能控制
水,是苏州的灵魂,串起苏州的古与今.动与静.金鸡湖景区位于苏州工业园区,总面积11.5平方公里,其中水域面积7.4平方公里. 新时代姑苏舫号,是金鸡湖景区极具苏式特征且规格超高的游览船型.船体分为上下 ...
- Spring IOC(控制反转)思想笔记
Spring IOC(控制反转)思想笔记 IOC控制反转基本理念就是将程序控制权从程序员手中交给用户自定义,从而避免了因为用户一个小需求的变化使得程序员需要改动大量代码. 案例 如果按照之前javaw ...
- 尼恩 Java高并发三部曲 [官方]
高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部曲 > 面试必备 + 大厂必备 + 涨薪 ...
- 我试了试用 SQL查 Linux日志,好用到飞起
大家好,我是小富~ 最近发现点好玩的工具,迫不及待的想跟大家分享一下. 大家平时都怎么查Linux日志呢? 像我平时会用tail.head.cat.sed.more.less这些经典系统命令,或者aw ...
- php 安装 yii 报错: phpunit/phpunit 4.8.32 requires ext-dom *
php 安装 yii 报错: phpunit/phpunit 4.8.32 requires ext-dom * 我的版本是7.0,以7.0为例演示. 先装这两个拓展试试: sudo apt-get ...
- 学习Qt Charts-创建一个简单的折线图
一.Qt Charts Qt Charts是基于Qt Graphics View实现的一个图表的组件,可以用来在QT GUI程序中添加现在风格的.可交互的.以数据为中心的图表,可以用作QWidget或 ...
- .Net EF Core千万级数据实践
.Net 开发中操作数据库EF一直是我的首选,工作和学习也一直在使用.EF一定程度的提高了开发速度,开发人员专注业务,不用编写sql.方便的同时也产生了一直被人诟病的一个问题性能低下. EF Core ...
- Func委托与表达式树Expression
最近在写ORM框架,其中遇到一个难点,就是作为框架调用方如何将查询条件传入框架内.其中就用到了Expression. Func委托 要Expression先要了解Func委托,Func委托的样式是: ...
- k8s通过ceph-csi接入存储的概要分析
kubernetes ceph-csi分析目录导航 概述 下面的分析是k8s通过ceph-csi(csi plugin)接入ceph存储(csi相关组件的分析以rbd为例进行分析),对csi系统结构. ...