对编程java的理解

final关键字

为什么需要final关键字: java中提供了多线程的方法,多线程就会把对象的状态变得混乱不堪;

为了保护状态的原子性 可见性 有序性 通过用synchronized 关键字来解决,因为synchronized关键字是最简单的一种解决方案。

用final修饰类,类是不可变的;那么该类对象的状态就是不可变的。程序每次修改对象的状态,就会产生一个新的对象供给不同的线程使用,就不需要担心并发问题了。

常见的不可变的类有?

String是不可变包装器类Interger和Long等也是不可变的,不可变的类的好处是节省空间 线程安全  提高使用的效率

在多线程之间共享数据,不需要同步处理;

当我们在程序中操作String类中的trim() substring() toLowerCase()方法的时候 返回的是一个新的对象 

final、finally和finalize的区别是什么?

  1. final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
  2. finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。
  3. finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。
  4. finalize方法用于垃圾回收。

    一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。

    但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。

为什么需要final呢?

常量池 ,hashcode ,线程安全的需要

在java中的HashMap的键用的就是哈希值(hashcode)来提高效率;字符串是不可变的,在创建的时候 hashcode就被缓存了比较适合作为哈希值,多次调用返回的是通一个值;

字符串常量池在java堆内存中;我们在编程中创建一个String时,如果字符串常量池中不存在,就会创建一个,如果已经存在,就不在创建,而是直接引用已经存在的对象。这样就减少JVM的内存开销,提高了效率

用final修饰类,类是不可变的 创建的对象的状态也是不可变的;在多线程环境下是线程安全的。如果对象的状态是可变的话,在多线程环境下 就会造成不可预期的结果。

static

静态变量只存储一处 被所有对象使用;被类的所有实例共享. 无论一个类创建了多少个对象 它们都共享同一份静态变量;

java中,静态方法被调用是,存储在内存的哪个区域?是栈?还是放大区?还是两者都有?

在JDK8之前,静态成员(静态变量和静态方法)都是存储在方法区(永久代)中的静态区中(这里指类被加载后,静态成员的存储位置)
但是jdk8之后,永久代被移除了,取而代之是员空间(metaspace).
但元空间中存储的主要是.class文件的元数据信息,静态成员的存储位置由方法区转到了堆内存(heap)中.
//不过,不管是jdk8,还是更早的版本中,静态方法的执行(不仅静是静态方法,还有普通的成员方法)都是在栈内存(stack)中进行的.
//每个线程都会在栈内存中开辟一个栈,在调用方法时,对应用的方法都会在执行这个方法的线程的栈中创建一个“栈帧”,
//栈帧中保存了局部变量表(基本数据类型和对象引用) 操作数据栈,动态连接和返回地址等信息。
//等到方法执行完毕,栈帧被销毁,对应的内存也将被释放;

this与super关键字的使用与区别

代表对象不同: this调用的是对象 super调用的是父类
构造方法的区别:this() 调用的是本来类的构造;super()调用的是父类的构造
前提不一致:this没有继承也可以使用,而super只能在继承条件下才能使用;

this关键字有很多种用法 最常用的是作为引用变量,指向当前对象;
this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针
this的用法:
1.普通的直接引用,this相当于是指向当前对象本身;
2.形参与成员名字重名,用this来区分;this.name=name;
3.引用本类的构造函数 this(name); public Person(String name){this.name=name}

super 关键字的用法为:
super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
指向父类对象; 调用父类的方法; super() 可以调用父类的构造方法;
super调用父类的构造方法 一般在子类构造方法的第一行
super必须出现在子类的方法或者构造方法中
super和this不能同时调用构造方法
//super的用法为:
//1.普通的直接引用: 与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用分类的成员;
//2.子类中的成员变量或方法与父类的成员变量或方法通没时,用super进行区分
//3.引用父类构造函数:
//super(参数)调用父类中的某一个构造函数(在构造函数第一句)
class Person{
protected String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person{
private String name;
public Student(String name, String name1) {
super(name);
this.name = name1;
}
public void getInfo(){
System.out.println(this.name); //Child
System.out.println(super.name); //Father
}
}

Overload是重载,Override是覆盖的意思,也就是重写

如果子类具有和父类一样的方法(参数相同,返回类型相同,方法名相同,但方法体可能不同)为重写;方法的重写是多态的一个特征;

如果一个类中有多个名字相同但参数个数不同的方法,我们通常成这些方法为方法重载;

面向过程和面向对象的关系

//面向过程的缺点:对每件事情的过程都需要自己来做; 一步一步的做,做完这个才能做下一下;
//面向对象的优势: 面向对象是模块化的,我做我的,你做你的,我需要你的话,告诉你一声,不需要具体去做;
//面向对象的底层其实还是面向过程,只不过面向过程进行了抽象化,封装成了类,方便我们调用;

类,对象;

//对象可以是现实中看得将的任何物体,比如猪,或者任何虚拟物体,孙悟空72变;(所有对象在创建的时候都会在推内存中分配空间.)
//java 通过类来定义一类物体,物体有什么类型 用字段来定义;
//一个类可以包括 字段(Filed) 方法(Method) 构造方法(constructor)
//成员变量有时候也叫实例变量,在编译时不占用内存空间,在运行时获取内存,只有在对接实例化后,字段才会获取内存,这正是被称为实例变量的原因

(oop)面向对象的特征:

 //对象是通类实例化的,
//同一类型的对象可以接收相同的消息
//通过组合的方式 可以将多个对象封装成其他更为基础的对象;
//一段程序实际上就是多个对象通过发消息的方法来告诉彼此该做什么.
//万物皆对象;
状态+行为+标识=对象,每个对象在内存中都会有一个唯一的地址
所有的对象 都可以被归为一类,并且通一类对象拥有一些共同的行为和特征;

package

作用域

位于同一个包的类,可以访问包作用域的字段和方法。

不用publicprotectedprivate修饰的字段和方法就是包作用域。

三大特性:封装、继承和多态

使用继承能大大减少重复代码,提高代码复用性;

String 

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
}

//1.String类是final的,不能被子类继承
//2.String类实现了Serializable接口 可以序列化
//3.String类实现了Comparable接口 不要用==来比较2个字符串是否相等,用compareTo()方法比较
//==用来比较两个对象的地址比较字符串内容 需要使用equals()方法
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
4.StringBuffer StringBuilder和String一样 ,都实现了CharSequence接口,所以他们是一样的;由于String是不可变的,遇到拼接字符串的时候最好用StringBuffer和StringBuilder

为什么要把String设计为不变量?

  1. 节省空间:字符串常量存储在JVM的字符串池中可以被用户共享。
  2. 提高效率:String会被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。
  3. 安全:String常被用于用户名、密码、文件名等使用,由于其不可变,可避免黑客行为对其恶意修改。

String和StringBuffer有什么区别?

String用于字符串操作,属于不可变类。String对象一旦被创建,其值将不能被改变。而StringBuffer是可变类,当对象创建后,仍然可以对其值进行修改。

判等运算符==与equals的区别?

== 比较的是引用,equals比较的是内容。

  1. 如果变量是基础数据类型,== 用于比较其对应值是否相等。如果变量指向的是对象,== 用于比较两个对象是否指向同一块存储空间。

  2. equals是Object类提供的方法之一,每个Java类都继承自Object类,所以每个对象都具有equals这个方法。Object类中定义的equals方法内部是直接调用 == 比较对象的。但通过覆盖的方法可以让它不是比较引用而是比较数据内容。

序列化是什么?

序列化是一种将对象转换成字节序列的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要的时候把该流读取出来重新构造成一个相同的对象。

字符(char)和字节(byte)的区别

字节(byte)是计算机汇总用来表示存储容器的一个计量单位  一个字节有8bit;
字节流用来处理二进制文件 比如说图片 MP3 是视频;
字符(char)可以是计算机中使用的字母、数字、和符号,比如说 A 1 $ 这些。
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等
字符流用来处理文本文件,文本文件可以看作是一种特殊的二进制文件 String
一个字母或者一个字符占用一个字节,一个汉字占用两个字节。
换句话说就是,字节流可以处理一切文件,而字符流只能处理文本

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据

字符(char)流与字节(byte)流的区别

    经过以上的描述,我们可以知道字节流与字符流之间主要的区别体现在以下几个方面:

  • 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  • 字节流默认不使用缓冲区;字符流使用缓冲区。
  • 字节(byte)流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元字符(char)流通常处理文本数据,它支持写入及读取Unicode码元。

虽然 IO 类很多,核心的是 4 个抽象类:InputStream、OutputStream、Reader、Writer。

虽然 IO 类的方法也很多,核心的2 个:read 和 write。

字节【Byte】是一种计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位.。

 换算:8位[bit] = 1字节[btye]
            1024btye = 1千字节[KB]
            1024KB = 1兆[MB]
            1024MB = 1千兆[GB]
            1024GB = 1太字节[TB]
            其中:K是千,M是兆,G是吉咖,T是太拉 字节_百度百科

编码不一样占用的字节也不一样

字节”与“字符”


   它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同:

 GBK: 一个汉字等于2字节,一个字母就等于1个字节。(英文占用1个字节,中文占用2个字节)
 UTF-8: 一个汉字等于3个字节,中文句号‘。’等于3个字节,一个字母等于1字节,英文的句号‘.’等于1个字节(英文占用1个字节,中文占用3个字节)
 UTF-16:一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)
 UTF-32:世界上任何字符的存储都需要4个字节。
 Unicode: 一个汉字等于4个字节,都是等于2个字节【英语,数字,操作符[。,%,&]等的呢】(对于Unicode编码标准,英文中文都是2个字节。这也是为什么叫做unicode)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值