Java基础知识介绍
数组的定义及初始化方式
- 数组对象创建没有()
- 一维数组
- 静态初始化:
- String[] books = {"Thinking in Java","Effective Java"};
- String[] books = new String[] { "Thinking in Java","Effective Java" };
- 动态初始化:
- String[] books = new String[2]; //必须指定长度,然后单独赋值
- 静态初始化:
- 二维数组
- String[][] str = {{"a","b","c",},{"d","e","f",},{"g","h","i"}};
- String[][] str1 = new String[][]{{"a","b","c",},{"d","e","f",},{"g","h","i"}};
- String[][] arr = new String[3][4];
Java内存分配图
- 构造方法不能被继承
- this和super指的是同一个对象(当前对象自动含有的对本类和父类对象的引用)
- 方法的重载也是多态的一种形式
- final类可以被实例化
- abstract类不能被实例化,但是可以有构造方法
静态初始化只会在必要时刻才会进行
- 并非启动项目时就会加载所有的class类(static域初始化),而是仅加载启动程序所需要的基础的class,在程序上进行操作时会用到新的类,才会去加载类的class文件(类在初次使用时才会加载),若此对象有静态域,则会在此时进行加载(加载类时才会初始化静态域),然后初始化这个类对象。(构造器默认也是static方法,因此可以说,类是在其任何static成员被访问时加载的)
java对象创建过程
- 首先JVM查找CLASSPATH下类名称所在的路径,定位class文件。
- 加载class文件,执行静态数据对象初始化工作(只在class对象首次加载时初始化一次)。
- 使用 new 创建对象,首先在堆内存上为此对象分配足够的内存空间。
- 清空内存空间,执行对象的自动初始化。
- 执行所有出现在字段定义处的初始化。
- 执行构造器。
继承中的对象初始化过程
- 基类的静态属性、代码块(按代码的先后顺序)
- 导出类的类静态属性、代码块
- 基类的普通属性、代码块
- 基类的构造方法
- 导出类的普通属性、代码块
- 导出类的构造方法
- 类加载完成后(静态域初始化完成后)才会去调用方法如main(),才会创建对象,初始化普通域。
OOP
封装:
- 为数据、属性和方法设置适当的访问权限以隐藏具体实现细节,然后包装到一个类中。
- 封装的结果是产生一个带有特征和行为的数据类型。
继承(或实现):
多态:
抽象:
容器
一张图
三个知识点:
迭代器
使用Iterator遍历,最安全:所有实现了 Collection 接口的容器类都有一个 iterator() 方法用以返回一个实现了 Iterator 接口的对象
foreach 使用foreach遍历的集合必须实现 java.lang.Iterable 接口,必须重写 iterator 方法,返回一个实现了 Iterator 接口的对象
比较器:
- 实现实体对象的排序:需要实现Comparable接口
- 排序比较器(解耦,多种排序规则):实现 Comparator 接口
- List + Collections.sort();
- Tree
- Arrays
泛型:
- 泛型类:不能用在静态方法及属性上,不能用在catch语句块中
- 泛型方法:方法声明中加上“”表示这是一个泛型方法
- 泛型与继承的关系:若类 A 是类 B 的子类,则 List<A> 就不是 List<B> 的子类
- 通配符:
- ?,可以是任意类型
- ? extends A : 可以存放 A 及其子类
- ? super A : 可以存放 A 及其父类
- 可以读取声明为通配符的集合类的对象,不允许写入(null除外)
六个接口:
Collection:是高度抽象出来的集合,它包含了集合的基本操作和属性.
List:元素有序可重复,相当于动态数组,添加进List集合中的元素(或对象)所在的类一定要重写equals()方法,这里所说的顺序是指:元素插入的顺序与输出的顺序不一致.
Set:元素无序不可重复,底层是Map(Set 的不可重复就是利用了 Map 中键对象的不可重复性!),相当于数学中的集合,添加进Set集合中的元素所在的类要求重写equals() 和 hashCode()方法.
- 无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
- 不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
Map:数组中的链表,存储“键-值”对的数据,key使用Set存放,不允许重复 。value可以重复的,使用Collection来存放的。一个key-value对构成一个entry(Map.Entry),entry使用Set来存放。
Iterator:仅用来遍历集合Collection元素。
Comparable && Comparator
九个具体实现类:
- ArrayList:查询数据较快,效率高,底层是数组实现,数组元素相当于对象的成员变量,默认值与成员变量一样
- LinkedList:更适用于频繁的插入、删除操作
- HashSet:当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
- LinkedHashSet:使用链表维护了一个添加进集合中的顺序,能够按照添加顺序遍历,但并不代表有序(适用于频繁遍历的情况)
- TreeSet:有序,只能添加同一类型的元素,可以按照添加进集合中的元素的指定属性进行排序,排序是在添加数据时进行的,更改数据不会影响原来的顺序,不要修改数据,否则可能重复,解决办法是将属性修改为final类型,禁止修改。
- Collections:操作Collection及Map的工具类,大部分为static的方法。使用Collections.addAll(list, T...)要比list.addAll()效率高。
- HashMap:可以添加null键,null值。HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
- LinkedHashMap:原理同LinkedHashSet
- TreeMap:原理同TreeSet
Hashtable与HashMap的区别(面试):
- 主要:Hashtable是线程安全的,同步,效率相对较低
- 父类不同:Hashtable 是 Dictionary的子类,HashMap 是 AbstractMap 的子类
- null:Hashtable键值都不能为null,HashMap键最多一个null, 值可以有多个null
Properties:Hashtable的子类,(读写资源配置文件,键与值只能为字符串)
- 配置文件:
- properties:存储store(), 读取load()
- xml : 存储storeToXML(), 读取loadFromXML()
类路径加载资源文件:
- 配置文件:
// "/"表示bin目录
pro.loadFromXML(类.class.getResourceAsStream("/"));
// ""代表bin目录
pro.loadFromXML(Thread.currentThread().getContextClassLoader().getResourceAsStream(""));
容器的两种排序方式
- 自然排序:
- 要求添加进TreeSet中的元素所在的类实现Comparable接口
- 重写compareTo(Object obj),在此方法内指明按照元素的哪个属性进行排序
- 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
- 内置类:
- 整数、小数:直接比较基本数据类型的大小 (Integer,Double)
- 字符:比较 unicode 编码之差
- 字符串:
- 如果其中一个字符串 是另外一个字符串的起始子串,返回长度之差
- 否则返回第一个不相等的 unicode 码之差
- java.util.Date : 根据日期的 long 形数比较
- 定制排序:
- 创建一个实现Comparator接口的实现类的对象并重写compare(Object o1,Object o2)方法
- 在此compare()方法中指明按照元素所在类的哪个属性进行排序
- 将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
- 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
- java.util.Arrays,asList() 方法返回的是一个自己的内部类 java.util.Arrays.ArrayList 产生的固定大小的特殊的数组。
- 排序时属性相同(return 0)对象也就相同了,因要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致。
IO流
多线程与并发
程序、进程与线程
程序:Program,静态概念
进程:Process 动态概念,作为资源分配的单位。
- 正在运行的程序,其实就是一个应用程序运行时的内存分配空间,占用特定的地址空间,每个进程都是独立的,由3部分组成:CPU,DATA,CODE
- 缺点:内存的浪费,CPU的负担
线程:Thread,调度和执行的单位,是进程中一个“单一的连续控制流程”(a single sequential flow of control)的执行路径,又被称为轻量级进程(lightweighht process),负责的是应用程序的执行顺序。
- Threads run at the same time, independently of one another;
- 一个进程可以拥有多个并行的(concurrent)线程(至少一个);
- 一个进程中的线程共享相同的内存单元/内存地址空间--->可以访问相同的变量和对象,而且他们从同一堆中分配对象--->通信、数据交换、同步操作
- 由于线程间的通信实在同意地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简单而且信息传递的速度也更快。
实现
- 继承 Thread 类:重写run(),直接new当前对象调用start(),无法再继承其他类
实现 Runnable 接口:实现run(),使用 new Thread(Runnable obj).start() 可以同时实现继承,方便共享资源
- 静态代理模式
- 创建真实角色
- 创建代理角色并持有真实角色的引用 + Thread(引用) + 代理角色 .start()
- 两个角色实现同一接口
线程状态(声明周期)
- 新生状态
- 就绪状态
- 运行状态
- 阻塞状态
- 死亡状态
线程终止
- 自然终止:线程体正常执行完毕
- 外部干涉:
- 线程类中定义线程体使用的标识
- 线程体使用该标识
- 提供对外的方法改变该标识
- 外部根据条件调用该方法即可
阻塞
- join:合并线程
- yield:暂停自己的线程 static 并不绝对
- sleep
- 优先级:代表概率
同步(并发 )
多个线程访问同一份资源,确保资源安全,又称线程安全
- 同步块:synchronized(引用类型||this||类.class){},锁的是对象
- 同步方法:方法声明中加入synchronized
死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁,死锁是我们在使用同步时才可能产生的。
并发常见问题
生产者-消费者模型
信号灯法
读者-作者模型
宴席的哲学家
Java基础知识介绍的更多相关文章
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- 学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(2)----动态代理
Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
随机推荐
- IE8的 JS 引擎如此不堪(二) - 解决方案
上一篇,IE8的JS引擎内存不停增长,是因为动态生成了一个image对象导致的.有了病因,就开始寻找治疗方法. 1.使用一个固定的img对象,但是无法获取地址改变后的图片大小,最总还是放弃: 2.寻找 ...
- 计蒜客 30990.An Olympian Math Problem-数学公式题 (ACM-ICPC 2018 南京赛区网络预赛 A)
A. An Olympian Math Problem 54.28% 1000ms 65536K Alice, a student of grade 66, is thinking about a ...
- Elasticsearch使用java读取数据报错NoNodeAvailableException: None of the configured nodes are available: [127.0.0.1:9300]
对于这个问题,大部分人出现在这个地方: Client client = new TransportClient(settings).addTransportAddress(new InetSocket ...
- Scala 实现快速排序和归并排序
def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...
- memcahced部署
Memcached是一个内存数据库,数据以key/value键值对的形式保存在服务器预先分配的内存区块中,由于Memcached服务自身没有对缓存的数据进行持久化存储的设计,因此,在服务器端的Memc ...
- JavaBean的详细及引用
1.JavaBean实际是具有统一接口格式的java类 2.JavaBean的组成:属性(Properties).方法(Method).事件(Events) 3.一个JavaBean的例子(该例子是用 ...
- Cmder | 一款命令行增强工具
文章目录 什么是cmder 安装cmder 让cmder便于使用 将cmder添加到右键菜单中 在设置中添加语言环境 设置默认使用cmd.PowerShell还是bash 调节背景的透明度 添加 ll ...
- Scala实战高手****第4课:零基础彻底实战Scala控制结构及Spark源码解析
1.环境搭建 基础环境配置 jdk+idea+maven+scala2.11.以上工具安装配置此处不再赘述. 2.源码导入 官网下载spark源码后解压到合适的项目目录下,打开idea,File-&g ...
- 图像视图-ImageView
(一) 知识点: (1)imageView.setImageAlpha(Alpha):设置图片透明度 (2)在布局imageView中设置图片位置:android:scaleType="ce ...
- 如何在debug模式下,使用正式的签名文件
有两种方式(在集成第三方库的使用 使用的非常多) 签名配置信息 一是直接按F4,在项目结构面板中进行设置,只要操作两个两个选项卡就好了,signing(生成配置信息)和build types(打包类 ...