当前位置: 首页 > 编程日记 > 正文

Java 学习笔记(4)——java 常见类

上次提前说了java中的面向对象,主要是为了使用这些常见类做打算,毕竟Java中一切都是对象,要使用一些系统提供的功能必须得通过类对象调用方法。其实Java相比于C来说强大的另一个原因是Java中提供了大量可用的标准库

字符串

字符串可以说是任何程序都离不开的东西,就连一个简单的hello world程序都用到了字符串,当时C语言中对字符串的支持并不太好,C语言中的字符串实质上是一个字符数组。为了方便不同的C/C++库都有自己的字符串实现。而Java中内置了对字符串的支持,Java中的字符串是一个叫做String的对象。

根据jdk文档的描述,我们需要注意一下几点:

  1. Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例
  2. String对象是可以共享的
  3. String对象是不可变的

字符串的内存分布

一般把类似于 "abc" 这样直接通过字面值表示的字符串作为字面常量,这种在Java中也是一个字符串,只是它与普通的new出来的字符串在内存的存储上有点不一样,下面请看下面的代码

class StringDemo{public static void main(String[] args){String a = "abc";String b = "abc";String c = new String("abc");System.out.println(a == b);System.out.println(a == c);System.out.println(b == c);}
}

针对字符串来说 == 比较的是它们的地址是否相同,这个程序分别输出的是 true、false、false,也就是说a b 是指向的同一个地址空间,而c则不是。它们的内存分布如下:
java string内存分布

一般程序在加载到内存地址空间后,会被划分为4个部分,全局数据段、代码段、堆、栈。而全局代码段是用来存放全局变量的。在C中如果我们写下这样的代码:

char* psz1 = "abc";
char* psz2 = "abc";

那么在程序加载到内存中时,在全局数据段中会存在一个连续的内存空间保存的是 'a','b','c','\0' 这4个值,一旦有char型指针指向"abc" 这样的字符串,那么系统会自动将这段内存的地址给赋值到对应的指针变量中,而且这个内存是只读内存,如果尝试往里面写入数据,则会造成程序崩溃。

Java中也是类似的,当出现 "abc" 的时候,其实系统早就为它在堆中创建了一个String对象,如果去阅读String的源码就会发现String中负责保存字符串的是一个 byte型的数组,所以在初始化的时候会再创建一个byte型数组,然后由字符串中成员变量保存它的地址,所以在内存图中看到有String也有byte[]。而且这个字符串是保存在堆中的常量字符串池中的,它的生命周期与程序相同(或者说与主线程相同)。

每当直接使用 "abc" 这样的字面常量的时候会自动将常量字符串池中相关的字符串对象的指针赋值给对应的对象。这样造成了上述程序中 a == b 为true的情况。而c是通过new关键字在程序运行期间动态创建的。所以JVM会在程序执行到这步的时候额外创建一个对象,并将 "abc" 这个字符串对应的byte[] 中的值拷贝到新的内存中。

这样就很容易理解上面的前两条了,至于字符串不可变,可以参考我之前写的关于类型中的说明(字符串的值发生改变时,在内存中其实是开辟了一块新的内存用于保存新的字符串内容,而丢弃了从前的字符串)

常见字符串方法

这里再简单的列举一下字符串中常见的方法,这些方法都可以在JDK文档都可以查到。

String(); //初始化新创建的 String对象,使其表示空字符序列
String(byte[] bytes); //通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, int offset, int length); //从bytes[] 数组中的第offset 位置开始,截取length个成员来初始化一个String
char charAt(int index); //返回指定位置处的索引
int compareTo(String anotherString); // 按字典顺序比较两个字符串的大小,为0表示两个字符串相同
int compareToIgnoreCase(String str); //比较两个字符串的大小,忽略大小写
String concat(String str) ; //字符串拼接
byte[] getBytes(Charset charset); //将字符串转化为byte型数组,并返回新的byte数组
int indexOf(String str); //返回字串第一次出现的位置
int length() ; //返回字符串的长度
String[] split(String regex); //按正则表达式进行分割,并返回对应的字符串数组

注意一下,这里返回数组或者新字符串的,都是在函数内部新建的,与原来的无关。所以这里是没办法拿到字符串底层的数组对象再来修改内存值的。

数组

java中数组的定义如下:

int[] Array1 = new int[10]; //定义了一个拥有10个整型数据的数组
int[] Array2 = new int[]{1, 2, 3, 4, 5, 6, 7,8, 9, 0}; //创建数组并初始化
int[] Array3 = {1,2 ,3,4,5,6,7,8,9,0}; 

相比于C中数组的定义来说,Java中的定义更容易让人理解,对应数据类型后面加一对 [] 就是对应的数组类型了。而C中,中括号是写在变量后面的,相比于Java中的定义来说就显的有点怪异了。或者说C中从根本上来说数组并不算是一种特别的数据类型,仅仅只是开辟相同数据类型的一块连续的内存而已。至于[] 在C中应该只是表示寻址而已,毕竟汇编中我们经常看到类似于 esp:[eax] 这样的东西。

Java中的数组是一种单独的数据类型,它是一种引用类型,也就是说它的变量名中保存的是它的地址。

它的使用十分的简单,与C/C++中数组的使用基本相同,注意事项也是基本相同。但是有一点很重要的不同,Java中的数组允许动态指定长度,也就是通过变量来指定长度,而C中必须静态的指定长度,也就是在程序运行之前就需要知道它的长度。这是因为Java中数组是引用类型,是new在堆上的,而C中数组是分配在全局变量区或者栈上的,在程序运行之初就需要为数组分配内存。

//这样的代码是可以编译通过的
int length = 10;
int array[] = new int[length];

数组作为函数参数

import java.util.Arrays;class Demo{public static void main(String[] args){int length = 10;int array[] = new int[length];System.out.println(Arrays.toString(array));test(array);System.out.println(Arrays.toString(array));}public static void test(int[] array){for(int i = 0; i < array.length; i++){array[i] = i;}}
}

运行上述的代码,发现函数中修改array的值在函数结束后也可以生效,这是因为数组是一个引用类型,在C中我们说要想改变实参的值,需要传入对应的引用或者指针。在函数中通过引用访问,实际上在访问对应的内存,所以这里其实是在修改对应内存的值。当然可以修改实参的值了。

ArrayList类

之前在数组中,我们说数组一旦定义,是不能改变大小的,那么如果我后续需要使用可变大小的数组呢?Java中提供了ArrayList这样的容器。由于它是一个通用的容器,而java又是一个强类型的语言,所以在定义的时候需要事先指定我们需要使用容器存储何种类型的数据。一般ArrayList的定义如下:

ArrayList<String> array = new ArrayList();

表示容器内部存储的是字符串。

需要注意的是容器中只能存储引用类型,不能存储像int、double、char这样的基本类型,如果要存储这样的数据,需要存储它们对应的封装类。比如int 类型对应的封装类为 Integer。

它的常用方法如下:

ArrayList(); //构造方法
boolean add(E e);//添加元素
void clear(); //清空
E get(int index); //获取指定位置的元素
int indexOf(Object o); //查询元素第一次出现的位置
E remove(int index); //删除指定位置的元素
E remove(Object o); //从列表中删除指定元素的第一个出现(如果存在)
int size(); //获取容器中元素个数
void sort(Comparator<? super E> c); //使用提供的 Comparator对此列表进行排序

键盘输入

Java中的键盘输入主要通过Scanner类来实现,Scanner需要提供一个输入流,从输入流中获取输入。一般常用的输入流是 System.in 表示从键盘输入,例如:

Scanner sc = new Scanner(System.in);

Scanner类中常用方法是一系列的next方法,next方法主要功能是根据指定 的分割符,从输入流中取出下一个输入并做相应的转化,比如nextInt()会转化为int,nextBoolean() 会转化为boolean类型等等,next()方法会直接转化为字符串。

默认情况下next函数会通过空格进行转化。

import java.util.Scanner;
import java.util.ArrayList;class Demo{public static void main(String[] args){ArrayList<String> array = new ArrayList<String>();Scanner sc = new Scanner(System.in);String str = sc.next();array.add(str);while(sc.hasNext()){array.add(sc.next()); }for(int i = 0; i < array.size(); i++){System.out.println(array.get(i));}}
}

这段代码,会将输入的数据依次存储到ArrayList容器中。因为程序事先不知道用户会输入多少数据,所以这里采用可以可变长度的容器来存储

//输入(> 表示cmd的提示符)
>hello world python java c++ c lisp
// 输入ctrl + c来退出sc.next的输入
> ctrl+c//输出
>hello
world
python
java
c++
c
lisp

上述代码首先执行到sc.next 位置,并且中断下来,我们输入上述的一些字符串,然后回车,然后程序继续执行,在循环中根据空格,依次从里面取出每一个值,并放到容器中。当没有值时,程序会再次中断在sc.next() 的位置,这个时候输入 ctrl + c ,此时程序再次执行到 sc.hasNext() 这个地方会返回false,这个时候循环退出,并依次打印这些内容。

这个程序证明了上面说的,next方法会根据指定的分割符,依次从输入流中取出下一个输入。当然如果想要一次读取一行,可以使用 nextLine方法。

更多内容请查阅JDK文档。


转载于:https://www.cnblogs.com/lanuage/p/10885669.html

相关文章:

浅谈GCC预编译头技术

浅谈GCC预编译头技术 文/jorge ——谨以此文&#xff0c;悼念我等待MinGW编译时逝去的那些时间。 其 实刚开始编程的时候&#xff0c;我是丝毫不重视编译速度之类的问题的&#xff0c;原因很简单&#xff0c;因为那时我用BASICA。后来一直用到C Builder&#xff0c;尽管Borl…

Java项目:慢病报销管理信息系统(java+MySQL+Jdbc+Servlet+Jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 慢病管理&#xff0c;医疗机构管理&#xff0c;家庭管理&#xff0c;费用交纳&#xff0c;费用报销&#xff0c;报表统计等等功能。 二、项目运行 环境配置&#xff1a; Jd…

Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法

当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot load http://xxxxxx. Origin http://xxxxxx is not allowed by Access-Control-Allow-Origin. 这是Ajax跨域访问权限的问题&#xff0c;服务器端不接受来自另一个不同IP地址的由脚本文件发出的…

php 遍历所有的文件

<?php prin_r(glob($path)); 2 转载于:https://www.cnblogs.com/zqk8553/p/3640071.html

Oracle数据库物理存储结构管理

1、实验目的 &#xff08;1&#xff09;掌握Oracle数据库数据文件的管理。 &#xff08;2&#xff09;掌握Oracle数据库控制文件的管理。 &#xff08;3&#xff09;掌握Oracle数据库重做日志文件的管理。 &#xff08;4&#xff09;掌握Oracle数据库归档管理。 2、实验环境 Wi…

KDE与GNOME的战争史(转载)

虽然在商业方面存在竞争&#xff0c;GNOME与KDE两大阵营的开发者关系并没有变得更糟&#xff0c;相反他们都意识到支持对方的重要性—如果KDE和GNOME无法实现应用程序的共享&#xff0c;那不仅是巨大的资源浪费&#xff0c;而且将导致Linux出现根本上的分裂。 KDE与GNOME是…

[ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据...

主类 HTTPSendPHP.as 1 package 2 {3 import com.JPEGEncoder.JPGEncoder;4 import com.fylib.httpRequest.HttpRequestBuilder;5 import com.fylib.httpRequest.HttpRequestBuilderConsts;6 import flash.display.Bitmap;7 import flash.display.BitmapDa…

Java项目:校园招聘平台系统(java+MySQL+Jdbc+Servlet+SpringMvc+Jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 用户和企业用户的注册登录&#xff0c;简历的筛选查看搜索&#xff0c;应聘信息互动等等。 二、项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 mysql Eclispe&#xf…

静态资源(StaticResource)和动态资源(DynamicResource)

静态资源&#xff08;StaticResource&#xff09;和动态资源&#xff08;DynamicResource&#xff09; 资源可以作为静态资源或动态资源进行引用。这是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。 StaticResource 通过替换已定义资源的值来为 XAML 属…

如何在 Kaggle 首战中进入前 10%(转)

如何在 Kaggle 首战中进入前 10%&#xff08;转&#xff09; 来源&#xff1a;https://dnc1994.com/2016/04/rank-10-percent-in-first-kaggle-competition/ Introduction 本文采用署名 - 非商业性使用 - 禁止演绎 3.0 中国大陆许可协议进行许可。著作权由章凌豪所有。 Kaggle …

一.Timesten安装

一&#xff0c;安装timesten IMDB并测试 1. 创建数据库相关用户和组 groupadd timestenuseradd -g timesten -G dba timestenpasswd timesten2. 创建相关目录 mkdir /etc/TimesTenchmod 775 /etc/TimesTenchown timesten:timesten /etc/TimesTenmkdir /u01/app/timesTen chmod …

linux 入门-1

刚开始接触linux&#xff0c;总有些简单的问题不知道怎么搞定&#xff0c;先将目前汇总的解决方法叫做"linux入门&#xff0d;1",后续在使用过程中逐步总结。 1. 连接 ADSL &#xff1a; sudo pon dsl-provider 断开 ADSL&#xff1a; sudo poff 查看 ADSL 状态&a…

Java项目:家庭理财系统(java+SSM+JSP+Tomcat8+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a;家庭理财&#xff0c;财务分析&#xff0c;统计等等。 二、项目运行 运行环境: jdk8tomcat8mysqlIntelliJ IDEA&#xff08; Eclispe , MyEclispe ,Sts 都支持&#xff0c;代…

ORA-19809: 超出了恢复文件数的限制

实验环境&#xff1a;Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod 实验背景&#xff1a;向tough.t中插入40万条记录&#xff0c;然后rollback&#xff0c;接着执行了shutdown abort命令。当重新启动数据库的时候遇到以下问题。 SQL> alter database …

VC manifest

manifest原理和用途 dll是被动态调用的&#xff0c;所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了、或是被另一个程序更改了&#xff0c;就可能会出现问题&#xff0c;即”DLL Hell” 随着系统资源越来越丰富&#xff0c;硬盘不那么紧张&#xff0…

判断年月日是否正确

//输入年月日 Console.Write("请输入年&#xff1a;"); int year Convert.ToInt32(Console.ReadLine()); Console.Write("请输入月&#xff1a;"); int month Convert.ToInt32(Console.ReadLine()); Console.Write("请输入日&#xff1a;"); i…

Java项目:农业计算工具(java+swing)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 1、换算:吨、千克、斤&#xff0c;晌/公顷、亩、平方米&#xff0c;晌/株、亩/株、平方米/株 2、籽粒干重、果穗干重、出籽率计算 3、发芽种粒数、供试种粒数、发芽率计算 4、种子袋、晌、亩、品种 换算 pac…

web网站加速之CDN(Content Delivery Network)技术原理

2019独角兽企业重金招聘Python工程师标准>>> 在不同地域的用户访问网站的响应速度存在差异,为了提高用户访问的响应速度、优化现有Internet中信息的流动,需要在用户和服务器间加入中间层CDN. 使用户能以最快的速度&#xff0c;从最接近用户的地方获得所需的信息&…

response.getWriter().write()和 response.getWriter().print()的区别

异步上传图片的代码。发现里面用了response.getWriter().print(),故联想到response.getWriter().writer&#xff08;&#xff09;,经过一番api的查找与实操&#xff0c;总结如下&#xff1a; response.getWriter()返回的是PrintWriter&#xff0c;这是一个打印输出流。response…

c语言中volatile关键字的作用

读文章之前 可以先看一下《程序员的自我修养 》第28页 过度优化。 volatile 提醒编译器它后面所定义的变量随时都有可能改变&#xff0c;因此编译后的程序每次需要存储或读取这个变量的时候&#xff0c;都会直接从变量地址中读取数据。如果没有 volatile关键字&#xff0c;则编…

Java项目:抽奖点名神器(HTML+可自定义抽选)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 用于年终抽奖或随机点名神器 //获取页面元素var student_box document.getElementById("student_box");//循环生成HTMLvar html "";for (var i 0 ; i < 22; i ) {html <div st…

Hive Metastore 连接报错

背景 项目中需要通过一些自定义的组件来操控hive的元数据&#xff0c;于是使用了remote方式来存储hive元数据&#xff0c;使用一个服务后台作为gateway&#xff0c;由它来控制hive元数据。 现象 在windows上连接hive metastore的时候&#xff0c;无端的会报NullPointerExceptio…

普通的简单对话框

2019独角兽企业重金招聘Python工程师标准>>> activity_main.xml <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"fill_parent"and…

[POI2007]ZAP-Queries

出处&#xff1a;http://www.cnblogs.com/peng-ym/p/8660937.html &#xff08;还是 建议 去看 原文&#xff09; 题目&#xff1a;链接&#xff1a;https://www.luogu.org/problemnew/show/P3455 #include<bits/stdc.h> #define LL long long #define ULL unsigned long…

python pdb 基础调试

当手边没有IDE,面对着python调试犯愁时&#xff0c;你就可以参考下本文&#xff1b;&#xff08;pdb 命令调试&#xff09;参考&#xff1a;http://docs.python.org/library/pdb.html和 (pdb)help首先你选择运行的 pypython -m pdb myscript.py(Pdb) 会自动停在第一行&#xff…

Java项目:设计管理系统(java+SSM+JSP+MYSQL+layui+Maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能包括&#xff1a; 课题管理&#xff0c;学生管理&#xff0c;内容管理&#xff0c;文件管理&#xff0c;提问管理&#xff0c;教师管理&#xff0c;进度管理等等。 二、项目运行 环境配置…

linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...

原创&#xff0c;转载请注明&#xff1a;http://www.cnblogs.com/ycxyyzw/p/4555328.html 之前写过一篇《windows下Android利用ant自动编译、修改配置文件、批量多渠道&#xff0c;打包生成apk文件》&#xff0c;关于ant打包原理&#xff0c;请先阅读此篇文章&#xff0c;再阅…

自制的一个eclipse 插件jcodesmith(代码生成器)

为什么80%的码农都做不了架构师&#xff1f;>>> 实现思路 使用模板输出&#xff0c;定制一些特定的输入【如数据库元素、普通文件】等控制模板生成&#xff1b;并把指定输入可视化&#xff0c;方便使用&#xff1b; 下载安装 插件下载&#xff1a;http://git.os…

Boring counting HDU - 3518 (后缀数组)

Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串&#xff0c;求出其中出现两次及以上的子串个数&#xff0c;要求子串之间不可以重合。 思路 对字符串后缀数组&#xff0c;然后枚举子串长度 \(len\)&#xff0c;若某一段连续的 \…

什么是JTAG

JTAG(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议&#xff08;IEEE 1149.1兼容&#xff09;&#xff0c;主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议&#xff0c;如DSP、FPGA器件等。标准的JTAG接口是4线&#xff1a;TMS、 TCK、TDI、TDO&a…