java内存划分

Java的内存划分为5个部分:
1.栈 (Stack) : 存放的都是方法中的局部变量,方法的运行一定要在栈当中
局部变量: 方法的参数,或者是方法()内部的变量
作用域: 一旦超出作用域,立刻从栈内存当中消失
2.堆(Heap): 凡是new出来的东西,都是在堆当中
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值,规则:
整数 默认值0
浮点数 默认值0.0
字符 默认值'\u0000'
布尔 默认值false
引用类型 默认值null
3.方法区(Method Area):存储class相关的信息,包含方法的信息
4.本地方法栈(Native Method Stack): 于操作系统相关
5.寄存器 (pc Register): 与CPU相关

局部变量和成员变量

局部变量和成员变量:
1.定义的位置不一样
a.局部变量:在方法的内部
b.成员变量:在方法的外部,直接写在类当中
2.作用范围不一样
a.局部变量:只有方法当中才可以使用,出了方法就不能再用
b.成员变量:整个类全都可以通用
3.默认值不一样
a.局部变量:没有默认值,如果想想用,必须手动进行赋值
b.成员变量:如果没有赋值,会有默认值,规则和数组一样
4.内存的位置不一样
a.局部变量:位于栈内存
b.成员变量:为于堆内存
5.生命周期不一样
a.局部变量:随着方法进栈而诞生,随着方法出栈而消失
b.成员变量:随着对象 创建而诞生,随着对象被垃圾回收机制回收而消失

构造方法

构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法

    public 类名(参数类型 参数){

    }
主要事项:
1.构造方法的名称必须和所在的类名称完全一样,就连大小写也要一致
2.构造方法没有返回值,void也不写
3.构造方法不能return一个具体的返回值
4.如果没有编写任何构造方法,那么编辑器会默认增加一个构造方法
5.构成方法也是可以重载的

标准类

 一个标准的类通常要拥有下面四个组成部分:
1.所有的成员变量都要用private关键字修饰
2.为每一个成员变量编写一对Getter和Setter
3.编写一个无参的构造方法
4.编写一个有参的构造方法

private

 private 定义的成员属性,只能在本类中访问,超出本类就不能访问了
间接访问private成员变量,就是定义一对Getter/Setter 必须叫setxxx或者getxxx命名规则
对于Getter来说,不能有参数,必须有返回值,返回值类型必须和成员变量类型一致
对于Setter来说,不能有返回值,必须有参数,参数类型必须和成员变量类型一致

数组概念

数组概念:是一个容器,可以同时存放多个数据值
数组的特点:
1.数组是一种引用数据类型
2.数组当中的多个数据类型必须一致
3.数组的长度在程序运行期间不可改变
两种常见的初始化方式:
1.动态初始化(指定长度)
2.静态初始化(指定内容)
动态初始化数组的格式:
数据类型[] 数组名称 = new 数据类型[数组长度]
静态初始化数组的格式:
数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,...}
注意事项:
1.静态初始化没有直接指定长度,但是任然可以自动推算的到长度
2.静态初始化标准格式可以拆分成为两个步骤
3.动态初始化也可以拆分为两个步骤
4.静态初始化一旦时候省略号,就不能拆分为两个步骤
使用建议:
如果不确定数组当中的具体内容,用动态初始化,否则,已经确定了具体的内荣,用静态初始化

ArrayList集合

数组的长度是不可以改变的
但是ArrayList集合的长度是可以随意改变的
对于ArrayList来说,有一个尖括号<E>代表泛型
泛型:也就是装在集合当中的所有元素,全都是统一什么类型
注意:泛型只能是应用数据类型,不能是基本数据类型 注意事项:
对于ArrayList集合来说,直接打印得到的不是地址,而是内容
如果内容是空,得到的是空的括号[]
ArrayList当中的常用方法有: public boolean add(E e); 向集合当中添加元素,参数的类型和泛型一致;返回值代表添加是否成功
备注:对于ArrayList集合来说,add添加动作一定是成功的,所以返回值可以不用
但对于其他集合来说,add添加动作不一定成功 public E get(int index); 从集合当中获取元素,参数是索引编号,返回值就是对应位置的元素 public E remove(int index); 从集合当中删除元素,参数索引编号,返回值就是被删除出掉的元素 public int size();获取集合的尺寸长度,返回值是集合中包含的元素个数
如果希望向集合ArrayList集合当中存储基本数据类型,必须使用基本类型对的"包装类"
基本类型 包装类 (应用类型 包装类都位于Java.lang包下)
byte Byte
int Integer
short Short
long Long
float Float
double Double
char Character
boolean Boolean
从JDK1.5开始,支持自动装箱、自动拆箱
自动装箱:基本类型 --> 包装类型
自动拆箱:包装类型 --> 基本类型
public class  DemoArrayList {
public static void main(String[] args) {
//创建了一个ArrayList集合,集合的名称是arrList,里面装的全都是String类型的字符串数据
//备注:从JDK1.7开始,右侧的尖括号内部可以不写内容,但是<>本事还是要写的
ArrayList<String> arrList = new ArrayList<>();
System.out.println(arrList); //向集合中添加数据
arrList.add("123");
arrList.add("马三");
boolean success = arrList.add("王五");
System.out.println(arrList);
System.out.println(success); //从集合中获取元素,get
String str = arrList.get(1);
System.out.println(str); //从集合中删除元素 remove
String whoRome = arrList.remove(2);
System.out.println("被删除的人:"+whoRome);
System.out.println(arrList); //size(),获取集合的长度
int len = arrList.size();
System.out.println(len); //遍历集合
for (int i = 0; i < arrList.size(); i++) {
System.out.println(arrList.get(i)); //定义一个可用存储int类型的数组
ArrayList<Integer> listC = new ArrayList<>();
listC.add(1);
listC.add(2);
listC.add(3);
System.out.println(listC);
int num = listC.get(1);
System.out.println(num);
} }
}

static关键字

 如果一个成员变量使用了static关键字,那么这个变量不在属于对象自己,而是属于所在的类,多个对象共享一份数据
如果一个成员方法使用了static关键字,那么这个方法不在属于对象自己,而是属于所在的类,多个对象共享一个发方法 如果有了static关键字,那么不需要创建对象,直接就用类名来使用它 无论是成员变量,还是成员方法,如果有了static关键字,都推荐使用类名称进行调用
静态变量:类名称.静态变量
静态方法:类名称.静态方法() 注意事项:
1.静态不能直接访问非静态
原因:因为在内存当中是先有静态内容,后有非静态内容
2.静态方法当中不能用this关键字
原因:this代表当前对象
3.根据类名称访问静态变量的时候,全程和对象没有关系,只和类有关系
静态代码块的格式:
public class 类名称{
static {
代码块类容
}
}
特点:当第一次用到本类时,静态代码块执行唯一的一次
静态内容总是优先于非静态内容,所以静态代码块比构造方法先执行
静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值

继承


局部变量:直接写变量名
本类的成员变量:this.成员变量名
父类的成员变量:super.成员变量名
重写:(Override) 方法的名称一样,参数列表也一样
注意事项:
1.必须保证父子类之间方法的名称相同,参数列表也相同
@Override(注解):写在方法前面,用来检测是不是有效的正确覆盖重写
2.子类方法的返回值必须小于等于父类方法的返回值范围
3.子类方法的权限必须大于等于父类方法的权限修饰符
public > protected > (default) > private
使用场景:
共性抽取
继承关系中,父子类构造方法的访问特点:
1.子类构造方法当中有一个默认隐含的"super()"调用,所以一定是先调用的父类构造方法,后执行的子类构造方法
2.子类构造可以通过super关键字来调用父类重载构造方法
3.super的父类构造调用,必须是子类构造方法的第一句,不能一个子类构造多次调用super构造
总结:
子类必须调用父类构造方法,不写则赠送一个super();写了则用写的指定的super()调用,super只能有一个,还必须是第一个
super关键字的三种用法:是用来访问父类内容的
1.在子类的成员方法中,访问父类的成员变量
2.在子类的成员方法中,访问父类的成员方法
3.在子类的构造方法中,访问父类的构造方法
this关键字是的用法:是用来访问本类的内容
1.在本类的成员方法中,访问本类的成员变量
2.在本类的成员方法中,访问本类的另一个成员方法
3.在本类的构造方法中,访问本类的另一个构造方法;例如:无参构造调用有参构造
注意:
1.this(...)调用也必须是构造方法的第一个语句,唯一一个
2.super和this两种构造调用,不能同时使用
重载:(Over) 方法名称一样,参数个数或者参数类型不一样

String字符串以及比较

java.lang.String类代表字符串
程序中所有的双引号字符串,都是String类的对象(就算没有new 也是一样的)
字符串的特点:
1.字符串的内容永远不可变
2.正是因为字符串不可改变,所以字符串是可以共享使用的
3.字符串效果相当于char[]字符数组,但是自层原理byte[]字节数组
创建字符串的常见方式
1.public String();创建一个空白字符串,不含任何内容
2.public String(char[] array);根据字符数组的内容,创建对应的字符串
3.public String(byte[] array);根据字节数组的内容,创建对应的字符串
字符串常量池:程序中直接写上的双引号字符串,就在字符串常量池中
对于基本类型来说:==是进行数值的比较
对于应用类型来说:==是进行地址值的比较
==是进行对象的地址值的比较,如果确实需要进行字符串的内容比较,可以使用以下两种方法:
public boolean equals(Object obj) 参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true,否则返回false
注意事项:
1.任何对象都可以用Object进行比较
2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样
3.如果比较双方一个是常量一个是变量,推荐把常量字符串写在前面
推荐:"abc".equals(str) 不推荐:str.equals("abc")
public boolean equalsIgnoreCase(String str) 忽略大小写,进行内容比较
public class DemoString02 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
char[] charArray = {'h','e','l','l','o'};
String str3 = new String(charArray);
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str3)); //当str3为null时,str3.equals("hello")会报错,NullPointerException
System.out.println("Hello".equals(str3));
System.out.println("Hello".equalsIgnoreCase(str3));
// System.out.println(str3.equals("hello"));
}
}

字符串的获取常用方法

String 当中与获取相关的常用方法有:
public int length(): 获取字符串当中含有的字符个数,拿到字符串长度
public String concat(String str): 将当前字符串和参数字符串拼接成为返回新的字符串
public char charAt(int index): 获取指定索引位置的单个字符。索引从0开始
public int indexOf(String str): 查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1
public class DemoString03 {
public static void main(String[] args) { //获取字符串长度
int length = "fdlsafjdsafdsjafld".length();
System.out.println("字符串长度:"+length); System.out.println("======================");
//拼接字符串
String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(str2);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3); System.out.println("======================");
//获取指定索引位置的单个字符
char ch = "Hello".charAt(1);
System.out.println("索引位置为1的字符为:"+ch); System.out.println("======================");
//查找字符串在本字符串中首次出现的位置
String str4 = "helloWorld";
int index = str4.indexOf("ll");
System.out.println("第一次出现索引的位置:"+index); //字符串不存在时,返回-1
System.out.println("helloWorld".indexOf("add")); }
}

字符串的截取常用方法

public String substring(int index): 截取从参数位置一直到字符串结尾,返回新字符串
public String substring(int begin, int end): 截取从begin开始,一直到end结束,中间的字符串
备注:[begin,end)
public class DemoString04 {
public static void main(String[] args) {
String str = "HelloWorld";
String str1 = str.substring(5);
System.out.println(str);
System.out.println(str1); String str3 = str.substring(4,7);
System.out.println(str3); /*
下面这种写法,字符串的内容任然是不变的
下面两个字符串:"Hello"和"Java"
str4当中保存的是地址值
本来的地址值是Hello的0x666
后来地址值变成了Java的0x999
*/
String str4 = "Hello";
str4 = "Java";
System.out.println(str4);
}
}

字符串转换常用方法

public char[] toCharArray();将当前字符串拆分成为字符数组作为返回值
public byte() getBytes();获取当前字符串底层的字节数组
public String replace(CharSequence oldSting, CharSequence newString)
将所有出现的老字符串替换为新的字符串,返回替换之后的结果新字符串
public class DemoStringConvert {
public static void main(String[] args) {
char[] chars = "Hello".toCharArray();
System.out.println(chars[0]);
System.out.println(chars);
System.out.println(chars.length); //转换成为字节数组
byte[] bytes = "abc".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
//字符串替换
String str1 = "How do you do?";
String str2 = str1.replace("o", "@");
System.out.println(str1);
System.out.println(str2);
}

java-类和数组的更多相关文章

  1. Java类对象数组声明和初始化

    Java是纯面向对象语言.类是其重要构成单位. 然后,在实际编程中,我们会自己定义一些类,如Point <span style="font-size:14px;">pu ...

  2. 定义Java类的数组的问题

    定义了一个类: class Student{ private int Id; public int getId() { return Id; } public void setId(int id) { ...

  3. 深入分析Java反射(二)-数组和枚举

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  4. 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

    来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...

  5. java创建自定义类的数组

    今天在学图论的最小生成树,开始一直在想是用邻接矩阵还是关联矩阵来表示图,但是发现这样都会有好多空间浪费.于是我就自定义一个边的类,里面包含了权值,关联的端点1,端点2,和图的表示字母.发现我想创建11 ...

  6. Java实验项目三——职工类对象数组按照职工生日排序

    Program: 修改项目三(1)中的第3题,实现比较方法,将对象数组的数据按照生日的大小给职工排序. Description:令日期类MyDate和员工类Worker类实现接口Comparable, ...

  7. Java中使用自定义类封装数组,添加类方法实现数据操作

    1.具体见注释 2.后续或有更新 public class MyArray { private long[] array; private int cnt; // 自定义数组类的元素个数 /** 使用 ...

  8. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  9. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  10. Java Native Interfce三在JNI中使用Java类的普通方法与变量

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...

随机推荐

  1. An Introduction to Differential Privacy

    原文链接:An Introduction to Differential Privacy 差分隐私算法可以允许分析人员执行良性的聚合分析,同时保证个人隐私得到切实的保护.. 背景数据分析中的隐私保护技 ...

  2. python之csrf简介

    django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全 ...

  3. unittest单元测试执行用例的顺序

    打印结果如下:

  4. [LeetCode]33. 搜索旋转排序数组(二分)

    题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ...

  5. zepto | 用事件委托去解决无法给新增添的DOM添加事件的问题

    前段时间在做一个任务的时候,碰见了一个问题:zepto无法用on事件去监听新增加的dom事件.这个问题用live可解决, 但是live在ios下失效,为了解决这个问题,我采用了暴力的方法去解决,每次添 ...

  6. 在思科三层交换机上配置DHCP,不同网段/VLAN间互通

    摘要: 描述:在三层交换机上配置DHCP,实现DHCP为PC1/PC3分配192.168.1.X网段:实现DHCP为PC2/PC4分配192.168.2.X网段:并且各个PC间要可以互相通信.(文末附 ...

  7. Shell学习(五)Shell输出命令

    一.echo命令 #1.直接显示字符串 echo "It is a test" #输出:It is a test #2.显示转义字符 echo "\"It is ...

  8. springboot maven项目运行常见报错 及ajax请求报错

    如图所示 tomcat运行后直接停止,也不报错 原因:我的原因是controller路径配置重名或者service没有配置@Service 遇见这错找了好久问题,网上也搜不到,特此记录一下 问题2 a ...

  9. 在Ubuntu下部署Flask项目

    FlaskDemo 命名为test.py # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route("/ ...

  10. myBatis 日记

    一级缓存默认开启, 有效范围是在当前sqlsession, 同一个SqlSession对象执行相同的sql并参数也要相同,缓存才有效. 在同一个会话里面,多次执行相同的SQL 语句,会直接从内存取到缓 ...