5Java基础整理
1.API:Application programming interface
举例:System类中的 public static void arraycopy(int[] src,int srcPos,int[] dest,int[] desst,int destPos,int length),实现数组的复制。
如果dest
是null
,那么会抛出一个NullPointerException
。 如果src
是null
,则抛出一个NullPointerException
并且目标数组不被修改。
2.常用算法:
递归:每一级的函数调用都有自己的变量;每一次的函数的调用都会有一次返回;递归函数中,位于递归调用前的语句和各级被调用的函数具有相同的执行顺序,位于递归调用后的语句和各级被调用的函数具有相反的执行顺序。函数的代码并不会得到复制。
排序算法:
冒泡排序:一共执行n-1次,每次进行比上一轮少一次的相邻两数比较,并将最大的元素移动到n-i个位置。
public class BubbleSort {
public static void main(String[] args) {
int[] arr= new int[]{3,15,2,6,4,7,9,8};
BubbleSort b = new BubbleSort();
b.BubbleSort(arr);
b.sysArr(arr); }
public void BubbleSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1;j++){
if(arr[j]>arr[j+1]) swap(arr,j,j+1);
}
}
}
public void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//按照数组格式输出
public void sysArr(int[] arr){
String str = "[";
for(int a:arr)
str+=a+",";
str = str.substring(0,str.length()-1);
System.out.println(str+"]");
}
}
选择排序:一共执行n-1次,每次从无序部分中选择最小值(记住下标)放在第i个位置上。
与冒泡排序的区别:冒泡排序每一轮可能会有多次交换,选择排序每一轮只有一次交换。
二分查找:基于有序的数组,每一轮将查找区间分为两部分,如果未找到,就到可能存在的区间中进行查找,直到区间中没有元素。
import java.util.Arrays; public class BinarySearch {
public static void main(String[] args) {
int[] arr = {12,32, 34,45, 54,65,71,82};
BinarySearch bs= new BinarySearch();
System.out.println( bs.binarySearch(arr,71));
System.out.println( bs.binarySearch(arr,70));
System.out.println(Arrays.binarySearch(arr,65));
System.out.println(Arrays.binarySearch(arr,60));
}
public boolean binarySearch(int[] arr,int num){
int left = 0,right = arr.length-1;
while(left<=right){
int mid = left+(right-left)/2;
if(arr[mid]==num) {
System.out.println(mid);
return true;
}
else if(arr[mid]<num) left = mid+1;
else right = mid-1;
}
return false;
}
}
3.Arrays工具类
常用方法:sort(int[] arr) 升序排序
fill(int[] arr,int fromIdx,int toIdx,int fillNum) 填充一定区域的数组
4.面对对象思想 Object oriented programming
面对对象开发的阶段:面对对象的分析阶段(OOA) 设计阶段(OOD) 编程(OOP)
面对对象指的是从生活中的具体事物提取特征,把现实生活中一类具有共同属性的行为的事物抽象为类,类具体化为对象。类是对象的数据类型。类是具有相同属性和行为的一组对象的集合。
5.对象的创建和引用:创建对象:类名(类型) 对象名(变量) = new 类名();
6.Java内存结构(JVM内存划分):
JVM管理的内存区域,实际上是.class文件执行时所需要存储数据和相关信息的空间,也称为Runtime Data Area(运行时数据区)。
运行时数据区又分为方法区(虚拟机栈)、堆区、栈区、PC寄存器和本地方法栈。
程序计数器:占用内存小,线程私有,生命周期与线程相同。作用大致为字节码行号指示器。
虚拟机栈:线程私有,生命周期与线程相同,使用连续的内存空间。作用是Java方法执行时的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息。会引发StackOverflowError OutOfMemoryError异常。(栈溢出内存异常)
Java堆:线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址。作用是保存对象实例,所有对象实例(包括数组)都要在堆上分配。会引发OutOfMemoryError(内存不足异常)。
方法区:线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址。存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的机器代码等数据。会引发OutOfMemoryError(内存不足异常)。
运行时常量池:方法区的一部分,具有动态性。用于存储字面量以及符号引用。
每一个运行在Java虚拟机中的线程都有自己的线程栈。
程序中创建的局部变量都存放在栈上,没有默认值。创建的所有对象都在堆上。
void a(){
String s = "abc";//s在栈上,"abc"在常量池中
}
void a(){
String s = new String("abc");//s在栈上,对象在堆中
}
7.String类:String 是被final修饰的类,因此不能被继承。
创建String:(1)使用双引号赋值(2)借助String类包含的构造方法:String(String s);
String(char[] value);
String(char[] value, int offset, int count);
String类在Java中是不可变的对象(immutable),因此在使用concat()方法拼接字符串时,本质上没有拼接,而是又创建了一个新的字符串,再把新字符串赋值给原来的变量。
String中判断字符串相等:==用来判断两个字符串对象是否相等,即栈中存放的引用对象地址是否相等;equals()方法用于判断两个字符串内容是否相等。equals()判断时,首先判断是否是String类型,如果不是直接为false。
public boolean equals(Object anObject) {
if (this == anObject) {//同一个对象 1)
return true;
}
if (anObject instanceof String) {//字符串类型 2)
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;//不符合1) 2)直接false
}
String创建:(1)String s = "abc";这种方式会创建1个String对象。首先会查看常量池中有没有“abc”,如果不存在,就会在常量池中直接创建"abc",否则,直接返回”abc“的引用。因此,String s1 ="abc";String s2 = "abc"; 此时s1==s2为true。
(2)String str = new String("abc")。这种方式,会创建2个String对象。首先在常量池中创建“abc”字符串对象,然后再在堆中创建一个字符串对象,将"abc"的字符数组复制到堆中创建的对象的字符数组上。因此,String str = new String("abc");String s = "abc";str==s为false。new String("xxx");总是会创建一个新的堆内存对象
(3)String ss = "abc".intern();这种方式会返回一个字符串对象引用。intern()是一个本地方法。作用是查看或者创建一个常量池中的字符串引用并返回。该方法常用于将某些经常访问的字符串对象保存在常量池中,避免经常创建对象。
(4)String m = new String("123")+new String("123");首先在常量池中创建一个"123"对象,再在堆中创建"123123"对象,并返回引用。
(5)String s3 = m.intern();String s4 = "123123"; s3==s4为true。如果s3与s4反过来为false,因为上一句在堆中创建"123123",并没有在常量池中创建,而intern()方法读取常量池,发现没有"123123"的常量,因此创建一个对象并返回引用。s4再创建时,常量池中已经有了字符串的引用。
(6)String s5 = "abc";String s6 = "abc"+"def";对于字面量的拼接,java会转化为String s5 = "abcdef";实际上只创建了一个对象。
而String s5 = "abc";String s6= s5+"def";等同于在常量池中创建"abc"和"def"两个对象,在堆中创建"abcdef"这个对象。它的实现过程等同于
String s5 = "abc";String s6 = new StringBuilder().append(s5).append("def").toString();
8.String常用方法
public char charAt(int index)
public int length()
public int indexOf(String str)
public int indexOf(String str,int fromIndex)从fromIdx开始搜索子串的位置
public boolean equalsIgnoreCase(String another)
public String replace(char oldChar,char newChar)
public boolean startsWith(String prefix)
public boolean endsWith(String suffix)
public String toUpperCase()
public String toLowerCase()
public String substring(int beginIndex)
public String substring(int beginIndex,int endIndex)
public String trim()
public static String valueOf(基本数据类型参数)
public String[] split(String regex) 要注意split方法中实际使用regex,所以.的分割要使用\\.
9.StringBuffer:线程安全 StringBuilder:非线程安全(快)
StringBuffer():构造一个空白的字符串缓冲区,其初始容量为 16 个字符。(底层是长度为16的字符数组)
StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
StringBuffer主要方法:
public StringBuffer append(String str)
public StringBuffer append(StringBuffer str)
public StringBuffer append(char[] str)
public StringBuffer append(char[] str,int offset,int len)
public StringBuffer append(double d)
public StringBuffer append(Object obj)
public StringBuffer insert(int offset,String str)
StringBuffer是一个内容可变的字符序列。
10.java.util.Date类
Date(long millisec)
long getTime()
boolean after(Date date)
boolean before(Date date)
API 含义
Instant 时间戳
LocalDate 日期,如 2020-06-16
LocalTime 时刻,如 11:52:52
LocalDateTime 具体时间,如 2020-06-16 11:52:52
java.util包还提供了SimpleDateFormat、Calendar和Math类等常用类。
11.很多连在一起的分隔符的split()情况
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,";
for(String s:s1.split(","))
System.out.println(s.length());
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,";
for(String s:s1.split(","))
System.out.println(s.equals(""));
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,";
for(String s:s1.split(","))
System.out.println(s=="");
输出结果为:
0 true false
0 true false
0 true false
0 true false
0 true false
0 true false
1 false false
1 false false
0 true false
0 true false
1 false false
1 false false
由此可以看出,当分隔符在其他文本的前面时,这个分隔符就会分出长度为空的对象“”,但是如果在所有的其他字符后面,就不会再分。
String s1 = new String("");
String s2 = new String("");
String s3 = "";
String s4 = "";
System.out.println(s1==s2);
System.out.println(s3==s4);
由此可以看出,split()方法返回的字符串是在堆中new出来的字符串对象。
12.System.out.println(res.substring(0,res.length()));最后一个参数可以是取不到的res.length()位置
scanner.next()遇到空白就结束 scanner.nextLine()读取一整行
13.字符串拼接
每次对String进行拼接操作,实际在jvm中都是new了一个新的String,随着String的new的次数越多,会造成虚拟机速度下降。
效率:StringBuilder>StringBuffer(非线程安全快于线程安全)>String.concat>String+ == String+=
String类本身是final类型,字符串拼接时,会使用StringBuffer,并调用append,之后再调用toString方法。
而StringBuffer转换成String时,开销相当大。中间不仅创立了临时对象StringBuffer,还每次完后再要转成String。
14.
5Java基础整理的更多相关文章
- 机器学习 —— 基础整理(六)线性判别函数:感知器、松弛算法、Ho-Kashyap算法
这篇总结继续复习分类问题.本文简单整理了以下内容: (一)线性判别函数与广义线性判别函数 (二)感知器 (三)松弛算法 (四)Ho-Kashyap算法 闲话:本篇是本系列[机器学习基础整理]在time ...
- MySQL基础整理(一)之SQL基础(未完成)
大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...
- nutch的一些基础整理
nutch的一些基础整理 原创 2015年03月22日 18:18:01 标签: nutch / 240 编辑 删除 一.关于配置文件: nutch-default.xml:爬虫的默认配置.在${nu ...
- [转帖]nginx基础整理
nginx基础整理 https://www.cnblogs.com/guigujun/p/6588545.html 目录结构如下: Nginx基础知识 Nginx HTTP服务器的特色及优点 Ngin ...
- JAVA基础整理-集合篇(一)
集合作为JAVA的基础知识,本来感觉自己理解的很清楚了,但是在最近的一次面试中还是答得不尽如人意!再次做一下整理,以便加深理解以及随时查阅. 首先,java.util包中三个重要的接口及特点:List ...
- 关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)
JAVA的基础语法等都跟C有很大的相似之处,所以这里就不多啰嗦了.直接从数组开始. 数组: 1.声明 int [] a; 在声明的过程中,并没有分配空间给数组.我们可以在声明的同时,用new来分配相应 ...
- C#基础整理
元旦整理书架发现一本小册子——<C#精髓>中国出版社2001年出版的,粗略翻了下关于C#的知识点挺全的虽然内容谈得很浅也有很多过时的内容(话说这本书是我在旧书店花5块钱淘的)我保留原有章节 ...
- HTML5游戏开发技术基础整理
随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...
- js数组基础整理
首页: 主要整理了一下数组中常用的一些基础知识,代码都是自己手敲,有不对的地方希望能指出,目前只有4篇,后续会不断的增加这一板块. 由于少于100字不能发所以把一些最基本的创建数组也写上. // 创建 ...
随机推荐
- Turing渲染着色器网格技术分析
Turing渲染着色器网格技术分析 图灵体系结构通过使用 网格着色器 引入了一种新的可编程几何着色管道.新的着色器将计算编程模型引入到图形管道中,因为协同使用线程在芯片上直接生成紧凑网格( meshl ...
- 【译】.NET 5 中的诊断改进
基于我们在 .NET Core 3.0 中引入的诊断改进,我们一直在努力进一步改进这个领域.我很高兴介绍下一波诊断改进. 诊断工具不再需要 .NET SDK 直到最近,.NET 诊断工具套件还只能作为 ...
- thymeleaf+Springboot实现自定义标签
在项目开发中,有一些组件不能满足我们快速开发的要求,我们需要封装一些组件来更加的便利我们.比如,我们可以封装一个下拉框组件,只要开发人员只有引用这个组件的标签,就能出现效果,而不用再去请求url,渲染 ...
- 【NX二次开发】移动WCS坐标系
说明:移动WCS坐标系 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *p ...
- CLR里的MethodTable,MethodDescChunk,MethodDesc,FixUpPreCode都是什么意思
一:看下面一些概念 1MethodTable MethodTable可以说在CLR里面无处不在,这个东西主要是作为对象的数据类型存在,主要包含了EEClass 模块地址,类型名称,模块路径等. 2.E ...
- Reactor3 中文文档(用户手册)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 老公 今晚还玩“丝袜哥”Swagger 么?
大家都知道Swagger是一个常用的Spring Boot接口文档生成工具,但是我们今天再介绍另外一个无需额外注解的 Spring Boot API文档生成神器,非常方便好用! JApiDocs是一个 ...
- git stash回退
目录 1.起因 2. 问题出现 3.修复 4. 注意 1.起因 这个问题要从今天刚遇到的事儿说起,昨晚代码出了个乌龙事件,本来正在dev分支进行新功能的开发,但是测试出现的问题是在release 分支 ...
- python读取csv文件绘制气温图,x轴为日期,并填充颜色
- jenkins+nexus上传插件发布制品到nexus
nexus安装 nexus安装参考:https://www.cnblogs.com/afei654138148/p/14974124.html nexus配置 创建制品库 制品库URL:http:// ...